docker常用指令整理
- 一、镜像管理
-
- [1. 镜像搜索与下载](#1. 镜像搜索与下载)
- [2. 镜像查看与清理](#2. 镜像查看与清理)
- [3. 镜像构建与导出](#3. 镜像构建与导出)
- 二、容器操作
-
- [1. 容器启停](#1. 容器启停)
- [2. 容器资源限制](#2. 容器资源限制)
- [3. 进入容器](#3. 进入容器)
- [4. 文件操作](#4. 文件操作)
- [5. 端口映射与目录挂载](#5. 端口映射与目录挂载)
- [6. 容器调试](#6. 容器调试)
- [7. 日志管理](#7. 日志管理)
- 三、日志与信息查看
- 四、网络管理
-
- [1. 网络操作](#1. 网络操作)
- [2. 容器间通信](#2. 容器间通信)
- [3. 网络诊断](#3. 网络诊断)
- [4. 资源清理](#4. 资源清理)
- 五、数据卷管理
- [六、Docker Compose](#六、Docker Compose)
-
- [1. 基础操作](#1. 基础操作)
- [2. 常用命令](#2. 常用命令)
- [七、Dockerfile 常用指令](#七、Dockerfile 常用指令)
- 八、Dockerfile关键指令说明
-
- [1. FROM - 指定基础镜像](#1. FROM - 指定基础镜像)
- [2. LABEL - 添加元数据](#2. LABEL - 添加元数据)
- [3. WORKDIR - 设置工作目录](#3. WORKDIR - 设置工作目录)
- [4. COPY - 复制文件(宿主机 → 镜像)](#4. COPY - 复制文件(宿主机 → 镜像))
- [5. RUN - 执行命令](#5. RUN - 执行命令)
- [6. EXPOSE - 声明暴露端口](#6. EXPOSE - 声明暴露端口)
- [7. ENV - 设置环境变量](#7. ENV - 设置环境变量)
- [8. CMD - 容器默认启动命令](#8. CMD - 容器默认启动命令)
- [9. ENTRYPOINT - 容器入口点](#9. ENTRYPOINT - 容器入口点)
- 快速参考表格
- 九、系统维护
- 十、实用技巧
-
- [1. 批量操作](#1. 批量操作)
- [2. 容器健康检查](#2. 容器健康检查)
- 十一、一键式部署方案
-
- [1. Docker Compose 标准模板](#1. Docker Compose 标准模板)
- [2. 生产级一键部署脚本](#2. 生产级一键部署脚本)
- [3. 使用 Docker Stack 部署集群服务](#3. 使用 Docker Stack 部署集群服务)
- 十二、备份与迁移
-
- [1. 全量备份与恢复](#1. 全量备份与恢复)
- [2. 单容器热迁移](#2. 单容器热迁移)
- 十三、标准项目结构与Dockerfile解析
- 十四、核心工作流与角色比喻
- 十五、关键要点总结
- 学习资源推荐
一、镜像管理
1. 镜像搜索与下载
bash
# 搜索 Docker Hub 中的镜像
docker search nginx
# 拉取镜像(不指定标签默认用 latest)
docker pull nginx
docker pull nginx:1.23

2. 镜像查看与清理
bash
# 列出本地所有镜像
docker images
docker image ls
# 显示镜像详细信息
docker inspect nginx:latest
# 删除镜像(按 ID 或名称)
docker rmi nginx:1.23
docker image rm nginx
# 清理所有未使用的镜像
docker image prune -a

3. 镜像构建与导出
bash
# 构建镜像(需在 Dockerfile 所在目录)
docker build -t myapp:v1 .
# 导出镜像为 tar 文件
docker save -o myapp.tar myapp:v1
# 从 tar 文件导入镜像
docker load -i myapp.tar
# 查看镜像构建历史
docker history redis
若出现:
bash
ERROR: failed to solve: the Dockerfile cannot be empty
则需要先配置Dockerfile文件内容,例如:
bash
FROM redis:alpine
# 可选:添加自定义配置
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD ["redis-server", "/usr/local/etc/redis/redis.conf"]
其中COPY [宿主机中的文件路径] [容器内指定路径]
Docker 构建时只能访问 构建上下文目录,即当前路径下的文件,可以手动将宿主文件拷贝过来,不然无法访问



二、容器操作
1. 容器启停
bash
# 启动新容器(前台运行)
docker run -it --name mycontainer centos:7 /bin/bash
# 启动容器并后台运行
docker run -d --name webserver nginx
# 停止容器
docker stop webserver
# 强制停止容器(发送 SIGKILL)
docker kill webserver
# 启动已停止的容器
docker start webserver
# 重启容器
docker restart webserver
# 删除容器(需先停止)
docker rm webserver
# 强制删除运行中的容器
docker rm -f webserver
# 清理所有停止的容器
docker container prune
2. 容器资源限制
bash
# 限制内存和 CPU
docker run -d --name myapp \
--memory=512m \
--cpus=1.5 \
nginx
# 限制容器日志大小
docker run -d --name logdemo \
--log-opt max-size=10m \
--log-opt max-file=3 \
nginx
3. 进入容器
bash
# 进入运行中的容器(推荐方式)
docker exec -it webserver /bin/bash
# 附加到容器主进程(退出会导致容器停止)
docker attach webserver
4. 文件操作
bash
# 从容器复制文件到宿主机
docker cp webserver:/etc/nginx/nginx.conf ./nginx.conf
# 从宿主机复制文件到容器
docker cp ./config.txt webserver:/app/config.txt
5. 端口映射与目录挂载
bash
# 映射宿主机端口到容器
docker run -d -p 8080:80 --name nginx nginx
工作原理:当在宿主机(或同一网络的其他机器)上访问 http://localhost:8080 时,流量会被 Docker 引擎转发到容器的 80 端口,从而访问到 Nginx 服务。
用途:这是暴露容器服务给外部用户的唯一方式(除了更复杂的网络模式)。常用于运行 Web 服务器、数据库等需要对外提供访问的服务
# 挂载宿主机目录到容器
docker run -d -v /host/data:/container/data --name volumedemo nginx
工作原理:容器内 /container/data 目录下的任何读写操作,都会直接反映在宿主机的 /host/data 目录上。这是一个双向同步的过程。
用途:数据持久化;保存容器内产生的数据(如数据库文件、日志),即使容器被删除,数据仍保留在宿主机。
# 使用只读挂载
docker run -d -v /host/config:/etc/nginx:ro nginx
工作原理:容器内的 /etc/nginx 目录可以读取宿主机 /host/config 目录下的文件,但无法对其进行修改、删除或创建。
用途:安全地提供配置文件;例如,将编写好的 Nginx 配置挂载给容器,避免容器内进程意外更改配置。
6. 容器调试
bash
# 查看容器实时资源占用(类似 top)
docker stats
# 查看容器文件系统变化(类似 git diff)
docker diff <container>
# 导出容器文件系统为 tar 包
docker export <container> > container_fs.tar
# 将运行中的容器保存为新镜像
docker commit <container> new_image:tag
# 查看容器启动失败日志(适用于 restart=always 的容器)
docker logs --since 5m <container>
7. 日志管理
bash
# 限制容器日志大小(全局配置)
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
EOF
# 查看日志最后 100 行并实时跟踪
docker logs --tail 100 -f <container>
三、日志与信息查看
bash
# 查看容器日志(实时跟踪)
docker logs -f webserver
# 查看最近100行日志
docker logs --tail=100 webserver
# 查看容器资源使用情况
docker stats webserver
# 查看容器进程列表
docker top webserver
# 查看容器详细信息
docker inspect webserver
# 查看容器端口映射
docker port webserver
四、网络管理
1. 网络操作
bash
# 列出所有网络
docker network ls
# 创建自定义网络
docker network create mynet
# 将容器连接到网络
docker network connect mynet webserver
# 查看网络详细信息
docker network inspect mynet
2. 容器间通信
bash
# 使用容器名称直接通信(需在同一网络)
docker run -d --name app1 --network mynet myapp
docker run -d --name app2 --network mynet myapp
# app2 中可以直接 ping app1
3. 网络诊断
bash
# 在容器内执行网络诊断(需容器有 curl 工具)
docker exec -it <container> curl -v http://target-service
# 查看容器网络命名空间的 iptables 规则
docker run -it --net container:<container> nicolaka/netshoot iptables -L
# 使用网络诊断专用镜像
docker run -it --rm nicolaka/netshoot
4. 资源清理
bash
# 删除所有未被使用的网络
docker network prune
# 清理构建缓存(适用于 BuildKit)
docker builder prune
# 一键清理所有无用资源(容器/镜像/网络/构建缓存)
docker system prune -a --volumes
五、数据卷管理
bash
# 创建命名数据卷
docker volume create mydata
# 查看数据卷列表
docker volume ls
# 使用数据卷
docker run -d -v mydata:/app/data --name db mysql
# 删除未使用的数据卷
docker volume prune
六、Docker Compose
1. 基础操作
bash
# 启动服务(前台运行)
docker compose up
# 启动服务并后台运行
docker compose up -d
# 停止并删除容器
docker compose down
# 查看服务状态
docker compose ps
# 查看服务日志
docker compose logs -f
2. 常用命令
bash
# 构建/重新构建服务镜像
docker compose build
# 启动已存在的服务
docker compose start
# 停止运行中的服务
docker compose stop
# 重启服务
docker compose restart
# 执行单次命令
docker compose run web python manage.py migrate
七、Dockerfile 常用指令
bash
Dockerfile是用来定义如何构建单个容器镜像的
构建Dockerfile
bash
# 语法
docker build -t <镜像名:标签> -f /路径/Dockerfile <构建上下文路径>
# 示例:Dockerfile 在父目录的 dockerfiles 文件夹中
docker build -t myapp:v1 -f ../dockerfiles/Dockerfile .
# 示例:Dockerfile 在绝对路径下
docker build -t myapp:v1 -f /home/user/project/Dockerfile /home/user/project

Docker 镜像构建的核心指令 docker build。理解它关键在于分清三个概念:要构建什么(-t)、用什么指令构建(-f)、从哪里获取构建材料(构建上下文路径)
bash
FROM ubuntu:22.04 # 基础镜像
LABEL maintainer="your@email.com" # 元数据
WORKDIR /app # 设置工作目录
COPY . . # 复制文件
RUN apt update && apt install -y python3 # 执行命令
EXPOSE 80 # 声明端口
ENV APP_ENV=production # 设置环境变量
CMD ["python3", "app.py"] # 容器启动命令
ENTRYPOINT ["/entrypoint.sh"] # 入口点脚本
八、Dockerfile关键指令说明
可以将 Dockerfile 理解为一个自动化装机清单,而每条指令就是清单上的一个步骤。
1. FROM - 指定基础镜像
- 含义:所有 Dockerfile 的第一条有效指令。它指定了构建新镜像所基于的"起点"或"操作系统环境"。
- 语法:FROM [:] [AS ]
- 示例:
bash
FROM ubuntu:22.04
FROM python:3.11-slim
FROM node:18-alpine AS builder # 使用别名,用于多阶段构建
- 最佳实践:尽量使用官方镜像和特定版本标签(如 alpine, slim 等变体),以保证安全性和可复现性,并减小镜像体积。
2. LABEL - 添加元数据
- 含义:为镜像添加描述性信息,如维护者、版本、描述等。这些是键值对形式的元数据。
- 语法:LABEL = = ...
- 示例:
bash
LABEL maintainer="dev@example.com"
LABEL version="1.0" description="这是一个Web应用镜像"
- 作用:方便镜像的管理和筛选,可以通过 docker inspect 查看。
3. WORKDIR - 设置工作目录
- 含义:设置后续指令(如 RUN, COPY, CMD 等)执行的默认当前目录。若目录不存在,Docker 会自动创建
- 语法:WORKDIR /path/to/workdir
- 示例:
bash
WORKDIR /usr/src/app
COPY . . # 此时复制到的是 /usr/src/app 目录下
RUN pwd # 输出 /usr/src/app
- 最佳实践:使用 WORKDIR,避免使用 RUN cd ... && do-something 这种容易出错的写法,它使路径更清晰、可维护。
4. COPY - 复制文件(宿主机 → 镜像)
源代码 src 确实需要"拷贝"到应用容器内,但这个动作不是手动的,而是通过在 Dockerfile 中使用 COPY 指令自动完成的。 源代码通常就放在与 Dockerfile 同级的目录中(或其子目录),这是标准做法
- 含义:将宿主机构建上下文中的文件或目录复制到镜像内的指定路径。
- 语法:
- COPY <源路径>... <目标路径>
- COPY ["<源路径>",..., "<目标路径>"] (适用于路径中包含空格的情况)
- 示例:
bash
COPY package.json ./
COPY ./src ./src
COPY hom* /mydir/ # 通配符复制
- 注意:<源路径> 必须是构建上下文内的路径。通常使用 .dockerignore 文件来排除不需要复制的文件。
5. RUN - 执行命令
- 含义:在构建镜像的过程中,在镜像内部执行指定的 Shell 命令。常用于安装软件包、编译代码等。
- 语法:
- Shell 格式: RUN <命令> (例如 RUN apt-get update)
- Exec 格式: RUN ["可执行文件", "参数1", "参数2"]
- 示例:
bash
RUN apt-get update && apt-get install -y \
nginx \
curl \
&& rm -rf /var/lib/apt/lists/* # 清理缓存以减小镜像体积
RUN pip install -r requirements.txt
- 最佳实践:将多个命令用 && 连接在一个 RUN 指令中执行,并及时清理临时文件,这样可以减少镜像层数,有效缩小最终镜像体积。
6. EXPOSE - 声明暴露端口
- 含义:声明容器在运行时将监听的网络端口。这只是一个文档性质的说明,方便使用者了解。
- 语法:EXPOSE <端口> [<端口>/<协议>...]
- 示例:
bash
EXPOSE 80
EXPOSE 443/tcp
EXPOSE 3000 8080
- 关键点:EXPOSE 本身并不发布端口。要真正将端口映射到宿主机,必须在运行容器时使用 docker run -p <宿主机端口>:<容器端口> 参数。
7. ENV - 设置环境变量
- 含义:设置将在构建阶段和容器运行阶段都可用的环境变量。
- 语法:
- ENV
- ENV = ...
- 示例:
bash
ENV NODE_ENV production
ENV APP_HOME=/app PATH=/app/bin:$PATH
- 作用:
- 影响后续的构建步骤(如 RUN 命令)。
- 容器运行时,这些变量依然存在,可以被应用程序读取。
- 可以通过 docker run -e = 在运行时覆盖。
8. CMD - 容器默认启动命令
- 含义:指定容器启动时默认执行的命令。每个 Dockerfile 只能有一个 CMD。如果 docker run 末尾指定了其他命令,则 CMD 被覆盖。
- 语法:
- Exec 格式(推荐): CMD ["可执行文件","参数1","参数2"]
- Shell 格式: CMD 命令 参数1 参数2
- 作为 ENTRYPOINT 的参数*: CMD ["参数1","参数2"]
- 示例:
bash
# 格式1: Exec格式,能正确处理信号
CMD ["nginx", "-g", "daemon off;"]
# 格式2: Shell格式,会在/bin/sh -c中执行
CMD python3 app.py
- 最佳实践:优先使用 Exec 格式,这样容器内的主进程会以 PID 1 运行,并能正确接收 Unix 信号(如 SIGTERM),实现优雅停止。
9. ENTRYPOINT - 容器入口点
- 含义:配置容器启动后始终执行的可执行程序。它让容器表现得像一个独立的可执行文件。
- 语法:
- Exec 格式(推荐): ENTRYPOINT ["可执行文件","参数1","参数2"]
- 与 CMD 的关系(核心难点):
- 只有 ENTRYPOINT:CMD 的内容会作为参数传递给 ENTRYPOINT。
- 两者共存:容器启动时执行的完整命令是: 。
- 覆盖规则:docker run 末尾的参数会替换 CMD,但会追加给 ENTRYPOINT(除非使用 --entrypoint 标志覆盖)。
- 示例:
bash
ENTRYPOINT ["/docker-entrypoint.sh"] # 入口点脚本
CMD ["nginx", "-g", "daemon off;"] # 默认参数
- 运行 docker run my-nginx,实际执行:/docker-entrypoint.sh nginx -g daemon off;
- 运行 docker run my-nginx /bin/bash,实际执行:/docker-entrypoint.sh /bin/bash
- 用途:用于编写"可执行化"的容器,或进行统一的启动前初始化(如等待数据库、处理配置)。
快速参考表格
| 指令 | 作用阶段 | 主要用途 | 备注 |
|---|---|---|---|
| FROM | 构建 | 指定基础镜像 | 必须是第一条非注释指令 |
| LABEL | 构建 | 添加元数据 | 键值对,用于镜像管理 |
| WORKDIR | 构建/运行 | 设置工作目录 | 影响后续所有指令的当前路径 |
| COPY | 构建 | 复制宿主机文件到镜像 | 源路径必须在构建上下文内 |
| RUN | 构建 | 执行命令,安装软件 | 每一条都会创建新的镜像层 |
| EXPOSE | 文档 | 声明容器监听端口 | 实际映射需用 -p 参数 |
| ENV | 构建/运行 | 设置环境变量 | 运行时可通过 -e 覆盖 |
| CMD | 运行 | 指定容器默认启动命令 | 可被 docker run 后的命令覆盖 |
| ENTRYPOINT | 运行 | 指定容器入口启动命令 | 使容器像一个可执行程序 |
九、系统维护
bash
# 查看 Docker 版本
docker version
# 查看系统级信息
docker info
# 查看磁盘使用情况
docker system df
十、实用技巧
1. 批量操作
bash
# 停止所有运行中的容器
docker stop $(docker ps -q)
# 删除所有容器
docker rm -f $(docker ps -aq)
# 删除所有镜像
docker rmi -f $(docker images -q)
2. 容器健康检查
bash
# 查看健康状态
docker inspect --format='{{json .State.Status}}' mycontainer
# 在 Dockerfile 中添加健康检查
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost/ || exit 1
十一、一键式部署方案
1. Docker Compose 标准模板
bash
创建 docker-compose.yml:
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- mynet
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: appdb
volumes:
- mysql_data:/var/lib/mysql
networks:
- mynet
redis:
image: redis:alpine
networks:
- mynet
volumes:
mysql_data:
networks:
mynet:
启动命令:
bash
docker compose up -d # 后台启动
docker compose down -v # 停止并删除所有资源
2. 生产级一键部署脚本
bash
创建 deploy.sh:
#!/bin/bash
# 定义变量
PROJECT_NAME="myapp"
VERSION="1.0.0"
DOCKER_REGISTRY="registry.example.com"
# 构建镜像
docker build -t ${DOCKER_REGISTRY}/${PROJECT_NAME}:${VERSION} .
# 推送镜像到仓库
docker push ${DOCKER_REGISTRY}/${PROJECT_NAME}:${VERSION}
# 部署到服务器
ssh user@server << EOF
docker pull ${DOCKER_REGISTRY}/${PROJECT_NAME}:${VERSION}
docker stop ${PROJECT_NAME} || true
docker rm ${PROJECT_NAME} || true
docker run -d \\
--name ${PROJECT_NAME} \\
-p 8080:80 \\
-v /data/config:/app/config \\
--restart=unless-stopped \\
${DOCKER_REGISTRY}/${PROJECT_NAME}:${VERSION}
EOF
使用方式:
bash
chmod +x deploy.sh
./deploy.sh
3. 使用 Docker Stack 部署集群服务
bash
# 创建 stack.yml
version: '3.8'
services:
web:
image: nginx
deploy:
replicas: 3
resources:
limits:
cpus: '0.5'
memory: 512M
update_config:
parallelism: 1
delay: 10s
# 部署到 Swarm 集群
docker stack deploy -c stack.yml myapp
十二、备份与迁移
1. 全量备份与恢复
bash
# 备份所有容器
docker ps -aq | xargs docker export | gzip > all_containers.tar.gz
# 备份所有镜像
docker save $(docker images -q) -o all_images.tar
# 恢复镜像
docker load -i all_images.tar
2. 单容器热迁移
bash
# 源服务器
docker commit <container> migrated_image
docker save migrated_image | gzip > migrated_image.tar.gz
# 目标服务器
scp migrated_image.tar.gz user@dest:/tmp/
ssh user@dest "docker load -i /tmp/migrated_image.tar.gz"
ssh user@dest "docker run -d --name new_container migrated_image"
十三、标准项目结构与Dockerfile解析
假设项目叫 myapp,标准目录结构如下:
bash
myapp/ # 项目根目录
├── docker-compose.yml # 编排文件
├── Dockerfile # 定义"应用"镜像的构建规则
├── requirements.txt # Python依赖列表
├── .dockerignore # 忽略不需要拷贝进镜像的文件(如.git, .env, __pycache__)
└── src/ # 应用程序源代码目录
├── main.py
├── utils/
└── templates/
最关键的是 Dockerfile 的内容,它定义了如何将 src 源代码"打包"进一个新的镜像:
bash
# Dockerfile
# 1. 选择一个轻量的基础镜像(不是centos,而是包含所需语言环境)
FROM python:3.11-slim
# 2. 在镜像内设置工作目录
WORKDIR /app
# 3. 先拷贝依赖文件,利用Docker缓存层加速构建
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 4. 拷贝项目源代码到镜像的工作目录 /app 下
COPY ./src ./src
# 或者直接拷贝整个当前目录(除了.dockerignore中指定的)到 /app
# COPY . .
# 5. 定义容器启动时自动执行的命令
CMD ["python", "src/main.py"]
十四、核心工作流与角色比喻
可以把整个项目部署想象成组装一台电脑和安装操作系统:
| 步骤 | 对应动作 | 使用的Docker工具 | 比喻 |
|---|---|---|---|
| 1. 准备"硬件/软件" | 获取各个服务的官方镜像 | docker pull 或由编排工具自动完成 | 购买CPU、内存、硬盘、显卡等标准化硬件 |
| 2. 定义"单个硬件规格" | 为自己的应用定制镜像(如打包代码、环境) | Dockerfile | 为主系统盘写一份安装清单(装哪些驱动、软件) |
| 3. 设计"电脑组装图" | 定义所有服务如何组合、连接、配置 | docker-compose.yml | 画一张电脑组装图纸,写明CPU插哪、内存插哪、硬盘怎么接 |
| 4. "一键开机" | 一键启动整个项目所有服务 | docker compose up | 按下电脑电源,所有硬件按图纸自动连接并启动 |
十五、关键要点总结
- Dockerfile:用于构建自定义镜像,主要是自己的应用。对于 Redis、Nginx 等成熟中间件,几乎不需要自己写 Dockerfile,直接使用官方镜像。
- docker-compose.yml:用于编排多个容器,定义它们之间的关系(网络、依赖、数据卷)。这才是实现"一键启动项目"的真正工具。
- docker pull:通常不需要手动执行,因为 docker compose up 或 docker run 会自动拉取本地缺失的镜像。
- 数据持久化:通过 volumes 将数据库等产生的数据存储在宿主机,这样容器销毁后数据不丢失。
- 网络:Compose 会自动创建一个专用网络,服务间可以直接使用服务名(如 db、redis) 作为主机名进行通信,无需知道IP。
所以,更准确的理解是:使用 Dockerfile 封装应用,然后使用 Docker Compose 编排应用及其所有依赖服务(Redis, DB等),最终通过一个命令 (docker compose up) 一键启动整个项目环境。