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>
相关推荐
SelectDB17 小时前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
曲幽1 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
XIAOHEZIcode2 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220703 天前
如何搭建本地yum源(上)
运维
武子康3 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
大树886 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质6 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工6 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn866 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker