»Docker 部署与核心体系
Docker 是一个开源的应用容器引擎,它让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux 或 Windows 操作系统的机器上。本笔记将系统性地梳理 Docker 的核心技术体系。
Docker 架构与核心概念
在深入指令之前,我们需要明确 Docker 的三个核心概念:
- 镜像 (Image):一个只读的模板,包含了运行应用程序所需的所有代码、运行时、库、环境变量和配置文件。
- 容器 (Container):镜像的运行实例。它是独立运行的一个或一组应用。
- 仓库 (Repository):集中存放镜像文件的地方,如 Docker Hub。
常用指令速查
以下是日常开发和部署中最常用的 Docker 命令分类速查。
镜像管理
# 从注册表拉取镜像
docker pull <image_name>:<tag>
# 查看本地所有镜像
docker images
# 删除本地镜像
docker rmi <image_id_or_name>
# 强制删除镜像(即使有容器正在使用)
docker rmi -f <image_id>
# 清理无用的"悬空"镜像 (dangling images)
docker image prune
容器生命周期管理
# 创建并启动一个容器(后台运行)
# -d: 后台运行, -p: 端口映射[宿主机端口:容器端口], --name: 指定容器名
docker run -d -p 8080:80 --name my_nginx nginx:latest
# 查看正在运行的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
# 启动 / 停止 / 重启容器
docker start <container_id_or_name>
docker stop <container_id_or_name>
docker restart <container_id_or_name>
# 删除容器(必须先停止容器,或使用 -f 强制删除)
docker rm <container_id_or_name>
# 清理所有处于终止状态的容器
docker container prune
运维与排错
# 查看容器运行日志
# -f: 实时追踪, --tail 100: 仅查看最后 100 行
docker logs -f --tail 100 <container_id_or_name>
# 进入正在运行的容器内部并开启交互式终端
docker exec -it <container_id_or_name> /bin/bash
# 如果 bash 不存在,可以尝试 sh
docker exec -it <container_id_or_name> /bin/sh
# 查看容器的详细配置信息(元数据)
docker inspect <container_id_or_name>
# 查看容器的资源使用情况(CPU、内存、网络等)
docker stats <container_id_or_name>
数据卷与挂载
容器内部的数据是非持久化的,当容器被删除时,内部产生的数据也会随之丢失。为了实现数据持久化以及容器间的数据共享,Docker 提供了两种主要的数据挂载方式。
匿名 / 具名数据卷(Volumes)
由 Docker 引擎自动在宿主机管理的文件系统区域(通常在 /var/lib/docker/volumes/)创建,受 Docker 完全管理,推荐使用。
# 创建一个具名数据卷
docker volume create my_db_data
# 查看所有数据卷
docker volume ls
# 挂载数据卷到容器中 (-v 卷名:容器内绝对路径)
docker run -d -p 3306:3306 --name mysql_server \
-v my_db_data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
mysql:8.0
绑定挂载(Bind Mounts)
可以挂载宿主机上的任意绝对路径到容器内。更适合开发环境(例如挂载源代码实现热更新)或需要共享宿主机配置(如 nginx.conf)。
# 绑定挂载示例 (-v 宿主机绝对路径:容器内绝对路径)
docker run -d -p 80:80 --name my_web \
-v /var/www/html:/usr/share/nginx/html \
nginx:latest
💡 注意:推荐使用
--mount参数替代-v,语法更明确,尤其适合复杂场景或集群部署(Swarm):--mount type=bind,source=/var/www/html,target=/usr/share/nginx/html如果挂载本地一个空目录到容器内已有内容的目录,Volume 会将容器内内容复制到本地,而 Bind Mount 会直接隐藏容器内原有的内容。
Dockerfile 镜像构建体系
Dockerfile 是一个文本文件,其中包含了一条条的指令,每一条指令构建一层,最终组合成一个完整的 Docker 镜像。
常用指令速查
| 指令 | 作用 | 示例 | 说明 |
|---|---|---|---|
FROM | 指定基础镜像 | FROM node:18-alpine | 必须作为第一条非注释指令 |
WORKDIR | 设置工作目录 | WORKDIR /app | 后续指令(RUN、CMD 等)都会在此目录下执行 |
COPY | 复制本地文件到容器 | COPY . . | 推荐使用,仅复制本地文件 |
ADD | 复制文件(支持 URL 与解压) | ADD html.tar.gz /var/www/ | 如果是本地压缩包会自动解压 |
RUN | 构建时执行的 Shell 命令 | RUN npm install | 会在当前镜像层之上创建新的一层 |
ENV | 设置环境变量 | ENV PORT=3000 | 容器运行时及构建时均有效 |
EXPOSE | 声明容器运行时监听的端口 | EXPOSE 3000 | 仅起声明/文档作用,不会自动做端口映射 |
CMD | 容器启动时默认执行的命令 | CMD ["npm", "start"] | 容易被 docker run 后面的参数覆盖 |
ENTRYPOINT | 配置容器启动时的入口程序 | ENTRYPOINT ["node", "app.js"] | 不会被 docker run 覆盖,常与 CMD 配合使用 |
多阶段构建示例
多阶段构建可以显著减小最终镜像的体积。以下是一个前端 React/Vue 应用的多阶段构建模板:
# --- 阶段一:构建阶段 ---
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# --- 阶段二:运行阶段 ---
FROM nginx:alpine
# 从 builder 阶段拷贝构建产物到 Nginx 静态目录
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
执行构建命令
# . 代表当前上下文路径,-t 用于指定镜像名和标签
docker build -t my-app:v1.0 .
Docker Compose 多容器编排体系
Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过一个 docker-compose.yml 配置文件,我们可以用一个命令配置并启动应用所需的所有服务。
核心概念
- 服务 (Services):一个应用容器,例如
web、db - 网络 (Networks):将多个容器连接在同一个自定义网络中,使它们可以通过服务名互相通信
- 数据卷 (Volumes):统一定义和管理数据持久化
docker-compose.yml 经典模板(Node.js + Redis)
version: '3.8'
services:
web:
build:
context: .
dockerfile: Dockerfile
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- REDIS_HOST=cache
depends_on:
- cache
networks:
- app-network
cache:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
networks:
- app-network
volumes:
redis_data:
networks:
app-network:
driver: bridge
Docker Compose 常用指令
请在包含 docker-compose.yml 文件的目录下执行以下命令:
# 后台启动并运行所有服务(如果镜像不存在会自动构建)
docker compose up -d
# 构建或重新构建服务镜像
docker compose build
# 停止并删除容器、网络、卷以及镜像
docker compose down
# 停止并删除容器及网络,同时删除关联的【数据卷】(慎用!)
docker compose down -v
# 查看编排的服务运行状态
docker compose ps
# 查看多容器整合的实时日志
docker compose logs -f
总结
Docker 的核心学习路径可以概括为:
- 先会用:掌握
run、ps、stop、logs、exec等基本命令 - 再会写:能用 Dockerfile 把应用打包成镜像
- 最后编排:用 Docker Compose 管理多容器应用