刚开始接触 Docker 的时候,很多人都觉得它神秘又复杂。其实把它想象成一个打包工具就简单多了。你把代码、依赖、环境全部装进一个盒子里,这个盒子就是容器,而制作盒子的模具就是镜像。
先从最基础的镜像管理说起。当你需要运行一个应用时,首先要获取镜像。使用 docker pull 命令可以从官方仓库下载,比如 docker pull nginx 会拉取最新的 Nginx 镜像。如果你想指定版本,可以写成 docker pull nginx:1.21。查看本地有哪些镜像用 docker images,删除不需要的镜像用 docker rmi 加上镜像 ID。有时候镜像拉取太慢,可以配置国内镜像加速器,在 Docker 配置文件中添加 registry-mirrors 地址就能解决。
接下来是容器的实际操作。运行一个容器最基本的命令是 docker run,比如 docker run -d -p 8080:80 nginx 表示后台运行一个 Nginx 容器,把宿主机的 8080 端口映射到容器的 80 端口。这里的 -d 参数让容器在后台运行,-p 参数做端口映射。如果想进入容器内部查看,用 docker exec -it 容器 ID bash 就能获得一个交互式的终端。查看运行中的容器用 docker ps,加上 -a 参数可以看到所有容器包括已停止的。
实际部署时,我们通常用 Dockerfile 来定义镜像。创建一个名为 Dockerfile 的文件,里面第一行写 FROM node:16 表示基于 Node.js 16 镜像,接着用 WORKDIR 设置工作目录,COPY 把本地代码复制进去,RUN 执行安装命令,最后 EXPOSE 声明端口,CMD 指定启动命令。构建镜像用 docker build -t 我的应用。这样每次构建都能得到一致的镜像,团队成员之间不会因为环境差异出问题。
容器数据持久化是个关键问题。容器删除后数据会丢失,所以需要挂载卷。用 -v 参数把宿主机目录映射到容器内,比如 -v /data:/app/data,这样数据就保存在宿主机上。另一种方式是使用命名卷,docker volume create 创建卷,然后在 run 命令里用 –mount 指定。
多容器协作时,Docker Compose 是必备工具。创建一个 docker-compose.yml 文件,定义多个服务,每个服务可以配置镜像、端口、环境变量、依赖关系。一键启动所有服务用 docker-compose up -d,停止用 docker-compose down。这样整个应用栈的管理变得非常简单。
部署到生产环境前,记得优化镜像大小。使用多阶段构建,把构建环境和运行环境分开,最终镜像只包含运行所需的文件。定期清理 dangling 镜像和停止的容器,用 docker system prune 可以一键清理。
掌握这些基础后,你就能从容应对大多数容器化部署场景了。Docker 的核心思想很简单,把复杂的环境问题打包成一个可移植的单元,让部署变得可重复、可预测。多动手实践几次,这些命令自然就熟悉了。