»Docker 部署与核心体系

2026-06-162026-06-16DevOps4 分钟读完(约 1155 字)

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):一个应用容器,例如 webdb
  • 网络 (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 的核心学习路径可以概括为:

  1. 先会用:掌握 runpsstoplogsexec 等基本命令
  2. 再会写:能用 Dockerfile 把应用打包成镜像
  3. 最后编排:用 Docker Compose 管理多容器应用
Docker 部署与核心体系 | Shanhai