Docker 入门:从镜像、容器到 docker-compose 编排
Docker 火了这么多年,我最近才系统学了一遍。这篇笔记把最核心的概念和常用操作串起来,作为自己的入门备忘。
一、三个核心概念
- 镜像(Image):只读的模板,类似"安装包",包含运行所需的代码、依赖和配置;
- 容器(Container):镜像的运行实例,类似"安装后正在运行的程序",可以启动、停止、删除;
- 仓库(Registry):存放镜像的地方,Docker Hub 是最大的公共仓库。
一句话总结:docker pull 把镜像从仓库拉下来,docker run 用镜像创建并启动容器。
二、最常用的命令
docker pull nginx:latest # 拉取镜像
docker images # 查看本地镜像
docker run -d -p 8080:80 --name web nginx # 后台运行容器, 端口映射
docker ps # 查看运行中的容器 (加 -a 看全部)
docker logs -f web # 跟踪容器日志
docker exec -it web bash # 进入容器内部
docker stop web && docker rm web # 停止并删除
其中 -p 8080:80 是端口映射:宿主机的 8080 转发到容器的 80,这是初学时最容易迷糊的地方。
三、用 Dockerfile 构建自己的镜像
以一个简单的静态站点为例:
FROM nginx:alpine
COPY ./dist /usr/share/nginx/html
EXPOSE 80
构建并运行:
docker build -t my-site:1.0 .
docker run -d -p 8080:80 my-site:1.0
构建原则:每一行指令都会产生一层,尽量把变化少的指令放前面,利用好构建缓存。
四、docker-compose:多容器编排
单个容器用 docker run 就够了,但一个真实应用往往有 Web、数据库、缓存好几个容器,这时候就该 compose 上场了。一个典型的 docker-compose.yml:
services:
web:
build: .
ports:
- "8080:80"
depends_on:
- db
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- db-data:/var/lib/mysql
volumes:
db-data:
之后一条 docker compose up -d 就能把整个应用拉起来,docker compose down 一键销毁,环境一致性非常好。
五、数据持久化
容器删了,容器里写的数据就没了。数据库这类有状态服务一定要用 volume 把数据挂到宿主机,这是新手最容易出的生产事故。
六、小结
Docker 的价值在于"一次构建,到处运行",把环境差异这个问题基本消灭了。下一步打算把本站的静态页也塞进 Nginx 容器里跑,顺便练习 volume 挂载站点文件。