Docker命令及使用指南

这份指南涵盖了 Docker 日常使用中 90% 以上的场景,从基础操作到生产部署、从单容器到多容器编排、从开发调试到 CI/CD 自动化。

由于内容较多,我将分章节系统性地呈现。

建议点赞收藏以后备用。,需要时快速查阅。

一、Docker 基础概念速览

概念 说明
镜像 (Image) 只读模板,包含运行应用所需的代码、库、环境变量和配置文件
容器 (Container) 镜像的运行实例,是独立、轻量级的运行环境
仓库 (Repository) 存储和分发镜像的地方(如 Docker Hub)
Dockerfile 定义如何构建镜像的文本文件
卷 (Volume) 持久化数据存储,独立于容器生命周期
网络 (Network) 容器间通信和与外部连接的机制

二、镜像管理命令(15个核心场景)

2.1 镜像搜索与下载

bash 复制代码
# 从 Docker Hub 搜索镜像
docker search nginx
docker search --filter=stars=1000 mysql  # 筛选高星镜像

# 拉取镜像(默认最新版)
docker pull nginx
docker pull nginx:1.21                 # 指定版本标签
docker pull registry.cn-hangzhou.aliyuncs.com/nginx:latest  # 从阿里云镜像仓库拉取

# 查看本地镜像列表
docker images
docker image ls
docker images --filter "dangling=true"   # 仅显示悬空镜像(无标签)

# 查看镜像详细信息
docker inspect nginx:latest
docker inspect --format='{{.Size}}' nginx  # 仅查看镜像大小

2.2 镜像构建

bash 复制代码
# 基础构建(当前目录需有 Dockerfile)
docker build -t myapp:1.0 .
docker build -t myapp:1.0 -f Dockerfile.prod .  # 指定 Dockerfile 文件

# 高级构建选项
docker build --no-cache -t myapp:1.0 .          # 不使用缓存,强制重新构建
docker build --build-arg NODE_ENV=production -t myapp:1.0 .  # 传入构建参数
docker build --target builder -t myapp:builder . # 多阶段构建,仅构建到指定阶段
docker build --platform linux/amd64 -t myapp:1.0 . # 指定构建平台(跨平台构建)
docker build --progress=plain -t myapp:1.0 .    # 显示详细构建输出

# 查看构建历史
docker history nginx:latest

2.3 镜像标签与推送

bash 复制代码
# 给镜像打标签(创建别名)
docker tag nginx:latest myregistry.com/nginx:v1.0
docker tag myapp:1.0 myapp:latest

# 推送镜像到仓库
docker push myregistry.com/nginx:v1.0
docker push myapp:1.0

# 登录/登出镜像仓库
docker login myregistry.com
docker login -u username -p password myregistry.com  # 非交互式(CI/CD 用)
docker logout myregistry.com

# 保存镜像为 tar 文件(离线传输)
docker save -o nginx.tar nginx:latest
docker save nginx:latest mysql:5.7 > images.tar      # 保存多个镜像

# 从 tar 文件加载镜像
docker load -i nginx.tar

2.4 镜像清理与维护

bash 复制代码
# 删除单个镜像
docker rmi nginx:latest
docker image rm nginx:latest

# 强制删除(即使被容器使用)
docker rmi -f nginx:latest

# 批量删除悬空镜像(无标签)
docker image prune
docker image prune -f  # 强制,不确认

# 删除所有未使用的镜像(未被容器引用)
docker image prune -a
docker image prune -a --filter "until=24h"  # 删除24小时前的未使用镜像

# 查看镜像占用空间
docker system df
docker system df -v  # 详细视图

三、容器生命周期管理(20个核心场景)

3.1 容器创建与启动

bash 复制代码
# 基础运行(前台运行,Ctrl+C 停止)
docker run nginx

# 后台运行(守护模式)
docker run -d nginx

# 交互式运行(进入容器内部)
docker run -it ubuntu /bin/bash
docker run -it --rm ubuntu /bin/bash  # 退出后自动删除容器

# 常用参数组合
docker run -d \
  --name my-nginx \           # 指定容器名称
  -p 8080:80 \                # 端口映射(主机端口:容器端口)
  -p 127.0.0.1:8080:80 \      # 仅绑定本地接口
  -p 80 \                     # 随机分配主机端口
  -v /host/data:/usr/share/nginx/html \  # 挂载主机目录
  -v html-data:/usr/share/nginx/html \   # 使用命名卷
  -e NGINX_HOST=example.com \ # 设置环境变量
  -e MYSQL_ROOT_PASSWORD=123456 \
  --restart unless-stopped \  # 自动重启策略
  --memory 512m \             # 限制内存
  --cpus 1.5 \                # 限制CPU
  --network my-network \      # 指定网络
  --ip 172.18.0.10 \          # 指定固定IP
  nginx:latest

# 重启策略说明
# no: 不自动重启(默认)
# on-failure: 退出码非0时重启
# always: 总是重启
# unless-stopped: 总是重启,除非手动停止

3.2 容器启停控制

bash 复制代码
# 启动/停止/重启容器
docker start my-nginx
docker stop my-nginx          # 优雅停止(发送 SIGTERM,10秒后 SIGKILL)
docker stop -t 30 my-nginx    # 自定义超时时间(秒)
docker restart my-nginx

# 强制停止(立即终止)
docker kill my-nginx

# 暂停/恢复(冻结容器状态)
docker pause my-nginx
docker unpause my-nginx

# 查看容器状态
docker ps                     # 查看运行中的容器
docker ps -a                  # 查看所有容器(包括停止的)
docker ps -q                  # 仅显示容器ID(批量操作时常用)
docker ps --filter "status=exited" --filter "name=nginx"  # 筛选条件

3.3 进入运行中的容器

bash 复制代码
# 执行命令(推荐,可执行任意命令)
docker exec -it my-nginx /bin/bash
docker exec -it my-nginx sh   # 如果容器没有 bash
docker exec my-nginx ps aux   # 不需要交互时不用 -it

# 以 root 用户进入(解决权限问题)
docker exec -u 0 -it my-nginx /bin/bash

# 附加到容器主进程(进入后 Ctrl+C 会停止容器)
docker attach my-nginx

# 在容器中执行单次命令
docker exec my-nginx nginx -t  # 测试 nginx 配置
docker exec my-nginx ls -la /etc/nginx

3.4 容器查看与监控

bash 复制代码
# 查看容器详细信息
docker inspect my-nginx
docker inspect --format='{{.NetworkSettings.IPAddress}}' my-nginx  # 提取特定字段
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-nginx

# 查看容器日志
docker logs my-nginx
docker logs -f my-nginx       # 实时跟踪(类似 tail -f)
docker logs --tail 100 my-nginx  # 查看最后100行
docker logs --since 10m my-nginx # 查看最近10分钟的日志
docker logs -t my-nginx       # 显示时间戳

# 查看容器资源使用
docker stats                  # 实时查看所有容器资源使用
docker stats my-nginx         # 查看指定容器
docker stats --no-stream      # 只输出一次(非实时)

# 查看容器进程
docker top my-nginx

# 查看容器文件系统变更
docker diff my-nginx          # 显示 A(添加)、D(删除)、C(变更)

3.5 容器清理与删除

bash 复制代码
# 删除单个容器(需先停止)
docker rm my-nginx

# 强制删除(运行中也能删)
docker rm -f my-nginx

# 删除已停止的容器
docker container prune
docker container prune -f

# 批量删除(结合命令)
docker rm $(docker ps -aq)                    # 删除所有容器(危险!)
docker rm $(docker ps -aq --filter "status=exited")  # 仅删除已停止的
docker rm $(docker ps -aq --filter "label=app=test")   # 按标签删除

# 清理停止的容器、悬空镜像、未使用的网络和卷
docker system prune
docker system prune -a  # 包括未使用的镜像(更彻底)
docker system prune -f   # 强制,不确认

# 查看容器退出码
docker inspect my-nginx --format='{{.State.ExitCode}}'

四、数据持久化:卷与挂载(10个核心场景)

4.1 卷(Volume)管理

bash 复制代码
# 创建卷
docker volume create my-data
docker volume create --driver local --opt type=tmpfs --opt device=tmpfs --opt o=size=100m tmp-vol  # 创建 tmpfs 卷

# 查看卷
docker volume ls
docker volume inspect my-data

# 使用卷运行容器
docker run -d -v my-data:/data nginx

# 多个容器共享卷
docker run -d --name writer -v shared-vol:/data busybox sh -c "echo hello > /data/file.txt"
docker run -d --name reader -v shared-vol:/data busybox cat /data/file.txt

# 备份卷数据
docker run --rm -v my-data:/data -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data

# 恢复卷数据
docker run --rm -v my-data:/data -v $(pwd):/backup busybox tar xvf /backup/backup.tar -C /

# 删除卷
docker volume rm my-data
docker volume prune  # 删除未使用的卷

4.2 绑定挂载(Bind Mount)

bash 复制代码
# 挂载主机目录(绝对路径)
docker run -d -v /host/path:/container/path nginx

# 挂载单个文件
docker run -d -v /host/nginx.conf:/etc/nginx/nginx.conf:ro nginx  # 只读挂载

# 相对路径挂载(使用 $(pwd))
docker run -d -v $(pwd)/html:/usr/share/nginx/html nginx

# 挂载选项
docker run -d -v /host/data:/data:ro nginx      # 只读
docker run -d -v /host/data:/data:rw nginx      # 读写(默认)
docker run -d --mount type=bind,source=/host/data,target=/container/data,readonly nginx  # 新语法(推荐)

4.3 临时文件系统(tmpfs)

bash 复制代码
# 使用 tmpfs(数据仅存储在内存中,容器停止即消失)
docker run -d --tmpfs /tmp:noexec,nosuid,size=100m nginx

# 使用 --mount 语法
docker run -d --mount type=tmpfs,destination=/tmp,tmpfs-size=100m nginx

五、网络管理(12个核心场景)

5.1 网络基础操作

bash 复制代码
# 查看网络列表
docker network ls
docker network ls --filter driver=bridge

# 查看网络详情
docker network inspect bridge
docker network inspect --format='{{range .Containers}}{{.Name}} {{end}}' my-network

# 创建网络
docker network create my-network
docker network create --driver bridge my-bridge
docker network create --subnet=172.18.0.0/16 --gateway=172.18.0.1 my-net
docker network create --ipv6 --subnet=2001:db8::/32 my-ipv6-net

# 连接/断开容器网络
docker network connect my-network my-container
docker network disconnect my-network my-container

# 删除网络
docker network rm my-network
docker network prune  # 删除未使用的网络

5.2 容器网络模式

bash 复制代码
# Bridge 模式(默认,容器间可通过 IP 通信)
docker run -d --network bridge nginx

# Host 模式(共享主机网络栈,性能最好但隔离性差)
docker run -d --network host nginx

# None 模式(无网络,完全隔离)
docker run -d --network none nginx

# 自定义网络(容器可通过名称互相访问,支持自动 DNS 解析)
docker network create app-net
docker run -d --name web --network app-net nginx
docker run -d --name api --network app-net myapi
# 在 api 容器内可直接 ping web,Docker 自动解析 IP

# 多网络连接(一个容器连接多个网络)
docker network create frontend
docker network create backend
docker run -d --name db --network backend mysql
docker run -d --name app --network backend myapp
docker network connect frontend app  # app 同时连接 frontend 和 backend

5.3 端口映射与暴露

bash 复制代码
# 随机映射(Docker 随机分配主机端口)
docker run -d -P nginx  # 暴露 Dockerfile 中所有 EXPOSE 的端口

# 指定映射
docker run -d -p 8080:80 nginx                    # TCP
docker run -d -p 8080:80/udp nginx                # UDP
docker run -d -p 127.0.0.1:8080:80 nginx          # 仅本地访问
docker run -d -p [::1]:8080:80 nginx              # IPv6 本地
docker run -d -p 80 nginx                         # 随机分配主机端口

# 多端口映射
docker run -d \
  -p 8080:80 \
  -p 8443:443 \
  -p 127.0.0.1:3306:3306 \
  mysql

六、Docker Compose 多容器编排(15个核心场景)

6.1 基础命令

bash 复制代码
# 启动服务(后台)
docker-compose up -d
docker-compose -f docker-compose.prod.yml up -d  # 指定文件

# 停止服务
docker-compose down
docker-compose down -v  # 同时删除卷和网络
docker-compose down --rmi all  # 同时删除镜像

# 查看状态
docker-compose ps
docker-compose logs
docker-compose logs -f web  # 实时查看 web 服务日志

# 构建/重建服务
docker-compose build
docker-compose up -d --build  # 启动前强制构建
docker-compose build --no-cache web  # 无缓存构建指定服务

# 扩展服务实例数
docker-compose up -d --scale web=3  # 启动3个 web 实例

# 执行命令
docker-compose exec web /bin/bash
docker-compose run --rm api migrate  # 运行一次性命令

# 重启/停止/启动单个服务
docker-compose restart web
docker-compose stop web
docker-compose start web

# 查看配置
docker-compose config  # 验证并查看解析后的配置
docker-compose config -q  # 仅验证,不输出

6.2 常用 docker-compose.yml 模板

Web + Database 基础模板:

yaml 复制代码
version: '3.8'

services:
  web:
    build: 
      context: ./web
      dockerfile: Dockerfile
    ports:
      - "8080:80"
    environment:
      - DB_HOST=db
      - DB_PASSWORD_FILE=/run/secrets/db_password
    volumes:
      - web-data:/var/www/html
      - ./config/nginx.conf:/etc/nginx/nginx.conf:ro
    networks:
      - frontend
      - backend
    depends_on:
      - db
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 30s
      timeout: 10s
      retries: 3
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 128M

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
      MYSQL_DATABASE: appdb
    volumes:
      - db-data:/var/lib/mysql
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro
    networks:
      - backend
    secrets:
      - db_root_password
    command: --default-authentication-plugin=mysql_native_password

  redis:
    image: redis:alpine
    volumes:
      - redis-data:/data
    networks:
      - backend

volumes:
  web-data:
  db-data:
  redis-data:

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    internal: true  # 无外部访问

secrets:
  db_password:
    file: ./secrets/db_password.txt
  db_root_password:
    file: ./secrets/db_root_password.txt

七、Dockerfile 编写指南(12个核心场景)

7.1 多阶段构建(生产优化)

dockerfile 复制代码
# 构建阶段
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production && npm cache clean --force
COPY . .
RUN npm run build

# 生产阶段(仅包含必要文件)
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

7.2 常见语言 Dockerfile 模板

Python 应用:

dockerfile 复制代码
FROM python:3.11-slim

# 安全:创建非 root 用户
RUN groupadd -r appgroup && useradd -r -g appgroup appuser

WORKDIR /app

# 先复制依赖,利用缓存层
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

# 切换非 root 用户
USER appuser

EXPOSE 8000
HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost:8000/health || exit 1

CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:8000", "app:app"]

Go 应用(多阶段构建):

dockerfile 复制代码
# 编译阶段
FROM golang:1.21-alpine AS builder
WORKDIR /build
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .

# 最小化运行镜像
FROM scratch
COPY --from=builder /build/main /main
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
EXPOSE 8080
ENTRYPOINT ["/main"]

八、系统管理与调试(10个核心场景)

8.1 系统信息查看

bash 复制代码
# Docker 系统信息
docker info
docker version

# 资源使用统计
docker system df
docker system df -v

# 事件监控(实时)
docker events
docker events --filter 'type=container' --filter 'event=stop'
docker events --since '1h'  # 过去1小时的事件

8.2 容器调试技巧

bash 复制代码
# 复制文件进出容器
docker cp my-container:/etc/nginx/nginx.conf ./nginx.conf  # 容器到主机
docker cp ./app.js my-container:/app/app.js                  # 主机到容器

# 查看容器资源限制
docker inspect my-container --format='{{.HostConfig.Memory}}'

# 导出容器为镜像(保存现场)
docker commit my-container my-image:debug-version

# 从容器创建新镜像并导出
docker export my-container -o container-backup.tar  # 导出文件系统(无历史层)
docker import container-backup.tar my-image:imported  # 导入为镜像

# 查看容器 IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-container

# 容器网络抓包
docker run --rm --net container:my-container nicolaka/netshoot tcpdump -i eth0

8.3 日志管理

bash 复制代码
# 配置日志驱动(运行时)
docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 nginx

# 查看日志驱动配置
docker inspect my-container --format='{{.HostConfig.LogConfig}}'

# 清理日志(手动)
echo "" > $(docker inspect --format='{{.LogPath}}' my-container)

# 使用 syslog 驱动
docker run --log-driver syslog --log-opt syslog-address=udp://1.2.3.4:514 nginx

九、安全与最佳实践(8个核心场景)

9.1 安全运行

bash 复制代码
# 以非 root 用户运行
docker run -d --user 1000:1000 nginx

# 只读文件系统 + 临时写入层
docker run -d --read-only --tmpfs /tmp:rw,noexec,nosuid,size=100m nginx

# 禁用特权 + 安全选项
docker run -d \
  --security-opt no-new-privileges:true \
  --cap-drop ALL \
  --cap-add NET_BIND_SERVICE \
  nginx

# 限制资源防止 DoS
docker run -d \
  --memory 512m \
  --memory-swap 512m \
  --cpus 1.0 \
  --pids-limit 100 \
  nginx

9.2 镜像安全扫描

bash 复制代码
# 使用 Docker Scout 扫描(Docker Desktop 内置)
docker scout quickview nginx:latest
docker scout cves nginx:latest
docker scout recommendations nginx:latest

# 使用 Trivy 扫描(第三方,需安装)
trivy image nginx:latest
trivy image --severity HIGH,CRITICAL nginx:latest

# 镜像签名与验证(Docker Content Trust)
export DOCKER_CONTENT_TRUST=1
docker pull signed-image:latest  # 仅拉取签名镜像

十、CI/CD 与自动化(8个核心场景)

10.1 常用 CI/CD 命令

bash 复制代码
# 构建并推送(GitLab CI / GitHub Actions 常用)
docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

# 多平台构建(需开启 buildx)
docker buildx create --use
docker buildx build --platform linux/amd64,linux/arm64 -t myapp:latest --push .

# 层缓存优化(利用 registry 缓存)
docker build --cache-from $CI_REGISTRY_IMAGE:cache -t $CI_REGISTRY_IMAGE:latest --build-arg BUILDKIT_INLINE_CACHE=1 .
docker push $CI_REGISTRY_IMAGE:latest

# 清理 CI 环境
docker system prune -af --volumes

十一、常用场景示例

1. 运行一个 Nginx 并挂载本地目录

bash 复制代码
docker run -d --name nginx-site -p 8080:80 -v $(pwd)/html:/usr/share/nginx/html nginx

2. 进入容器调试

bash 复制代码
docker exec -it nginx-site /bin/bash

3. 构建镜像并推送到仓库

bash 复制代码
docker build -t myapp:1.0 .
docker tag myapp:1.0 username/myapp:1.0
docker push username/myapp:1.0

4. 使用 Compose 启动 LNMP 环境

创建 docker-compose.yml

yaml 复制代码
version: '3'
services:
  web:
    image: nginx
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
  php:
    image: php:fpm
    volumes:
      - ./html:/var/www/html
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - dbdata:/var/lib/mysql
volumes:
  dbdata:

启动:

bash 复制代码
docker-compose up -d

5. 备份与恢复数据卷

备份:

bash 复制代码
docker run --rm -v mydata:/data -v $(pwd):/backup alpine tar czf /backup/mydata-backup.tar.gz -C /data .

恢复:

bash 复制代码
docker run --rm -v mydata:/data -v $(pwd):/backup alpine tar xzf /backup/mydata-backup.tar.gz -C /data

6. 查看容器资源占用

bash 复制代码
docker stats

7. 清理所有未使用的资源

bash 复制代码
docker system prune -a --volumes

快速参考表

场景 命令
一键清理所有 docker system prune -a --volumes -f
查看容器 IP docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container>
实时查看日志 docker logs -f --tail 100 <container>
复制文件到容器 docker cp <local> <container>:<path>
进入容器调试 docker exec -it <container> /bin/sh
查看资源使用 docker stats --no-stream
批量停止容器 docker stop $(docker ps -q)
批量删除镜像 docker rmi $(docker images -q --filter "dangling=true")
导出导入镜像 docker save/load
多阶段构建 docker build --target <stage>
相关推荐
龙俊俊2 小时前
服务器模型部署与加载
服务器·人工智能·深度学习
yoso2 小时前
告别频繁切窗口!用命令行玩转企业微信-cli的七大核心功能
人工智能
用户69371750013843 小时前
Google 推 AppFunctions:手机上的 AI 终于能自己干活了
android·前端·人工智能
章鱼丸-3 小时前
DAY41简单 CNN
人工智能·深度学习·cnn
AI视觉网奇3 小时前
CosyVoice 加速实践
人工智能·深度学习
用户69371750013843 小时前
AI让编码变简单,真正拉开差距的是UI设计和产品思考
android·前端·人工智能
badhope3 小时前
概率论如何让机器学习不再玄学
人工智能·深度学习·机器学习·数据挖掘·github
wx_xkq12883 小时前
营销智脑V3重磅迭代:从工具到平台,AI营销进入“全能时代“
人工智能