Docker 全栈开发与部署实战教程

本教程基于Ubuntu系统,涵盖Docker核心概念、镜像/容器管理、数据持久化、多容器编排及生产级项目部署,提供纯Docker命令DockerCompose两种方案,帮助开发者快速掌握容器化技术。

一、Docker安装与环境配置

方法一:使用官方安装脚本(推荐)

# 更新系统包
sudo apt update

# 安装必要的包
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release

# 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 添加 Docker 仓库
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 更新包索引
sudo apt update

# 安装 Docker Engine
sudo apt install -y docker-ce docker-ce-cli containerd.io

# 启动 Docker 服务
sudo systemctl start docker
sudo systemctl enable docker

方法二:使用便捷脚本

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

2.3 配置 Docker

添加用户到 docker 组

# 添加当前用户到 docker 组
sudo usermod -aG docker $USER

# 重新登录或执行以下命令
newgrp docker

验证安装

# 查看 Docker 版本
docker --version

# 运行测试容器
docker run hello-world

2.4 安装 Docker Compose

方法一:使用 pip 安装

# 安装 pip
sudo apt install -y python3-pip

# 安装 docker-compose
sudo pip3 install docker-compose

方法二:直接下载二进制文件

# 下载最新版本的 docker-compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 添加执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装
docker-compose --version

2.5 配置 Docker 镜像加速器

# 创建 daemon.json 文件
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]
}
EOF

# 重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker

二、核心概念速览

概念 说明 类比
镜像(Image) 只读模板,包含应用代码和运行环境 虚拟机ISO文件
容器(Container) 镜像的运行实例,可读写、独立隔离 正在运行的虚拟机
仓库(Registry) 存储和分发镜像的平台(如Docker Hub) 应用商店
数据卷(Volume) 持久化存储容器数据,独立于容器生命周期 移动硬盘
网络(Network) 容器间通信的虚拟通道(支持bridge/host/none等模式) 局域网

三、镜像与容器管理

3.1 镜像操作

# 拉取镜像
docker pull nginx:latest

# 构建自定义镜像
# Dockerfile示例:
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y nginx
COPY index.html /var/www/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

# 构建命令
docker build -t my-nginx:v1 .

# 导出/导入镜像
docker save my-nginx:v1 > my-nginx.tar
docker load < my-nginx.tar

3.2 容器操作

# 启动容器
docker run -d --name my-nginx -p 8080:80 my-nginx:v1

# 进入容器
docker exec -it my-nginx /bin/bash

# 查看运行状态
docker ps -a

# 停止/删除容器
docker stop my-nginx && docker rm my-nginx

# 持久化数据
docker run -d -v /host/path:/container/path mysql:latest

四、数据卷与迁移

4.1 数据卷管理

# 创建命名卷
docker volume create app_data

# 备份数据卷
docker run --rm -v app_data:/data -v $(pwd):/backup ubuntu tar czvf /backup/backup.tar.gz /data

# 恢复数据卷
docker run --rm -v app_data:/data -v $(pwd):/backup ubuntu tar xzvf /backup/backup.tar.gz -C /data

4.2 容器迁移

# 导出容器为镜像
docker commit my-nginx my-nginx:migrate
docker save my-nginx:migrate > my-nginx-migrate.tar

# 新服务器导入
scp my-nginx-migrate.tar user@new-server:/path/
docker load < my-nginx-migrate.tar
docker run -d -p 8080:80 my-nginx:migrate

五、Docker Compose编排

5.1 Compose文件示例

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - php

  php:
    image: php:7.4-fpm
    volumes:
      - ./html:/var/www/html

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

5.2 常用命令

# 启动服务
docker-compose up -d

# 查看日志
docker-compose logs -f

# 停止服务
docker-compose down

# 重建服务
docker-compose up -d --build

六、实战:部署LNMP环境

6.1 方案一:使用Docker Compose

项目结构

lnmp/
├── docker-compose.yml
├── html/
│   └── index.php
└── mysql/
    └── init.sql

docker-compose.yml

version: '3.8'

services:
  nginx:
    image: nginx:latest
    ports: ["80:80"]
    volumes:
      - ./html:/var/www/html
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on: [php, mysql]

  php:
    image: php:7.4-fpm
    volumes: ["./html:/var/www/html"]

  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: app_db
    volumes:
      - ./mysql:/docker-entrypoint-initdb.d
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

启动验证

# 创建测试文件
echo "<?php phpinfo(); ?>" > html/index.php

# 启动服务
docker-compose up -d

# 访问 http://localhost

6.2 方案二:纯Docker命令

# 1. 创建网络
docker network create lnmp-net

# 2. 启动MySQL
docker run -d --name mysql --network lnmp-net \
  -v mysql_data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=rootpass \
  mysql:5.7

# 3. 启动PHP
docker run -d --name php --network lnmp-net \
  -v $(pwd)/html:/var/www/html \
  php:7.4-fpm

# 4. 配置Nginx
mkdir -p nginx/conf.d
cat > nginx/conf.d/default.conf <<EOF
server {
    listen 80;
    root /var/www/html;
    location \~ \.php$ {
        fastcgi_pass php:9000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
    }
}
EOF

# 5. 启动Nginx
docker run -d --name nginx --network lnmp-net \
  -p 80:80 \
  -v $(pwd)/html:/var/www/html \
  -v $(pwd)/nginx/conf.d:/etc/nginx/conf.d \
  nginx:latest

七、生产环境建议

  1. 镜像优化
    • 使用多阶段构建减少镜像体积
    • 定期更新基础镜像安全补丁
  2. 网络隔离
    • 为不同服务组创建独立网络
    • 限制容器间不必要的通信
  3. 数据安全
    • 使用命名卷代替目录挂载
    • 定期备份数据卷到云存储
  4. 监控日志
    • 集成Prometheus+Grafana监控
    • 使用ELK收集容器日志

八、附录:命令速查表

1. Docker 基础命令

命令 详细说明 示例 备注
docker --version 显示Docker客户端版本信息,用于快速检查Docker是否安装及版本 docker --version 输出格式:Docker version 20.10.8
docker version 显示Docker客户端和服务端的详细版本信息,包括API版本、Go版本等 docker version 比–version更详细,包含服务端信息
docker info 显示Docker系统的详细信息,包括容器数量、镜像数量、存储驱动、网络配置等 docker info 用于系统诊断和配置检查
docker help 显示Docker命令的帮助信息,可以查看所有可用命令 docker help 也可以用于特定命令:docker run –help
docker --help 与docker help相同,显示帮助信息 docker exec --help 查看特定命令的详细参数说明

2. 镜像管理

命令 详细说明 示例 备注
docker images 列出本地存储的所有Docker镜像,显示仓库名、标签、镜像ID、创建时间和大小 docker images 默认只显示顶层镜像
docker images -a 列出所有镜像,包括中间层镜像(构建过程中产生的临时镜像) docker images -a 用于查看完整的镜像层次结构
docker images -q 只显示镜像ID,常用于脚本中批量操作镜像 docker images -q 输出格式简洁,便于管道操作
docker images --filter 根据条件过滤镜像列表,支持多种过滤条件 docker images --filter "dangling=true" dangling=true显示悬空镜像
docker images --format 自定义输出格式,可以指定显示的字段和格式 docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" 支持table、json等格式
docker search <镜像名> 在Docker Hub上搜索公共镜像,显示名称、描述、星级、官方标识等 docker search nginx 默认显示25个结果
docker search --limit 限制搜索结果的数量,避免输出过多信息 docker search --limit 5 nginx 最大值为100
docker pull <镜像名> 从镜像仓库下载镜像到本地,默认从Docker Hub下载latest标签 docker pull nginx:latest 支持指定标签和仓库地址
docker pull --all-tags 下载指定镜像的所有可用标签版本 docker pull --all-tags nginx 会下载大量数据,谨慎使用
docker push <镜像名> 将本地镜像上传到镜像仓库,需要先登录仓库 docker push myapp:v1.0 镜像名需包含仓库地址
docker rmi <镜像ID/名称> 删除本地镜像,可以使用镜像ID或名称:标签 docker rmi nginx:latest 如果有容器使用该镜像会删除失败
docker rmi -f <镜像ID> 强制删除镜像,即使有容器正在使用 docker rmi -f abc123 可能导致容器无法正常运行
docker rmi $(docker images -q) 删除所有本地镜像,常用于清理环境 docker rmi $(docker images -q) 危险操作,会删除所有镜像
docker build -t <镜像名> <路径> 根据Dockerfile构建镜像,-t指定镜像名称和标签 docker build -t myapp:v1.0 . 路径是Dockerfile所在目录
docker build --no-cache 构建镜像时不使用缓存,确保获取最新的依赖和更新 docker build --no-cache -t myapp . 构建时间较长但确保最新
docker build --build-arg 向Dockerfile传递构建参数,用于动态配置构建过程 docker build --build-arg VERSION=1.0 -t myapp . 需要Dockerfile中定义ARG
docker tag <源镜像> <目标镜像> 为镜像创建新的标签,不会复制镜像数据,只是创建引用 docker tag nginx:latest mynginx:v1 用于重命名或创建版本标签
docker history <镜像名> 显示镜像的构建历史,包括每一层的命令和大小 docker history nginx 用于分析镜像结构和优化
docker inspect <镜像名> 显示镜像的详细元数据信息,包括配置、环境变量、层信息等 docker inspect nginx 输出JSON格式的详细信息
docker save -o <文件名> <镜像> 将镜像导出为tar文件,用于离线传输或备份 docker save -o nginx.tar nginx:latest 包含所有层数据,文件较大
docker load -i <文件名> 从tar文件导入镜像到本地Docker环境 docker load -i nginx.tar 恢复save命令导出的镜像
docker export <容器> > <文件> 将容器的文件系统导出为tar文件,不包含历史和元数据 docker export web > web.tar 只导出当前状态的文件系统
docker import <文件> <镜像名> 从tar文件创建新的镜像,通常用于导入export的文件 docker import web.tar myapp:latest 创建的镜像只有一层

3. 容器生命周期管理

命令 详细说明 示例 备注
docker run <镜像名> 创建并启动一个新容器,这是最基本的容器运行命令 docker run nginx 前台运行,会占用当前终端
docker run -d <镜像名> 在后台(守护进程模式)运行容器,不占用当前终端 docker run -d nginx 返回容器ID,适合服务类应用
docker run -it <镜像名> 以交互模式运行容器,-i保持输入流,-t分配伪终端 docker run -it ubuntu /bin/bash 适合需要交互的应用或调试
docker run --rm 容器停止后自动删除,避免产生大量停止的容器 docker run --rm nginx 适合临时测试或一次性任务
docker run --name <容器名> 为容器指定一个自定义名称,便于后续管理和引用 docker run --name web nginx 名称必须唯一,便于记忆
docker run -p <主机端口>:<容器端口> 将容器端口映射到主机端口,使外部可以访问容器服务 docker run -p 8080:80 nginx 主机8080端口映射到容器80端口
docker run -P 自动将容器的所有暴露端口映射到主机的随机端口 docker run -P nginx Docker自动选择可用端口
docker run -v <主机路径>:<容器路径> 将主机目录挂载到容器内,实现数据持久化和共享 docker run -v /data:/app/data nginx 绑定挂载,数据在主机上
docker run -v <卷名>:<容器路径> 使用Docker管理的命名卷挂载到容器 docker run -v mydata:/data nginx Docker管理的卷,更安全
docker run --mount 新的挂载语法,更明确和灵活的挂载选项 docker run --mount type=bind,source=/data,target=/app nginx 推荐使用,语法更清晰
docker run -e <变量>=<值> 设置容器的环境变量,用于配置应用行为 docker run -e NODE_ENV=production node 可以设置多个-e参数
docker run --env-file <文件> 从文件中读取环境变量,适合大量环境变量的场景 docker run --env-file .env node 文件格式:KEY=VALUE
docker run -w <工作目录> 设置容器内的工作目录,影响命令执行的默认路径 docker run -w /app node 覆盖Dockerfile中的WORKDIR
docker run -u <用户> 指定运行容器的用户ID或用户名,用于权限控制 docker run -u 1000:1000 node 格式:用户ID:组ID
docker run --privileged 以特权模式运行容器,获得主机的所有权限 docker run --privileged ubuntu 安全风险高,谨慎使用
docker run --read-only 将容器的根文件系统设为只读,提高安全性 docker run --read-only nginx 需要配合tmpfs使用临时目录
docker create <镜像名> 创建容器但不启动,用于预先配置容器 docker create --name web nginx 需要后续使用start启动
docker start <容器ID/名称> 启动已经创建但停止的容器 docker start web 容器保持原有配置
docker start -a <容器> 启动容器并附加到容器的输出流 docker start -a web 可以看到容器的输出
docker start -i <容器> 启动容器并进入交互模式 docker start -i web 适合交互式容器
docker stop <容器ID/名称> 优雅地停止运行中的容器,发送SIGTERM信号 docker stop web 给应用时间清理资源
docker stop -t <秒数> <容器> 指定停止超时时间,超时后强制杀死 docker stop -t 30 web 默认超时时间是10秒
docker restart <容器ID/名称> 重启容器,相当于stop后再start docker restart web 保持容器配置不变
docker pause <容器ID/名称> 暂停容器中的所有进程,不释放资源 docker pause web 进程状态保持在内存中
docker unpause <容器ID/名称> 恢复暂停的容器,继续执行进程 docker unpause web 从暂停点继续执行
docker kill <容器ID/名称> 强制停止容器,发送SIGKILL信号 docker kill web 立即终止,可能丢失数据
docker kill -s <信号> <容器> 向容器发送指定的信号 docker kill -s SIGTERM web 可以发送各种系统信号
docker rm <容器ID/名称> 删除已停止的容器,释放存储空间 docker rm web 只能删除停止的容器
docker rm -f <容器ID/名称> 强制删除容器,即使正在运行 docker rm -f web 先强制停止再删除
docker rm -v <容器> 删除容器时同时删除关联的匿名卷 docker rm -v web 避免产生孤立的卷

4. 容器信息查看

命令 详细说明 示例 备注
docker ps 显示当前正在运行的容器列表,包括ID、镜像、命令、状态、端口等 docker ps 最常用的容器查看命令
docker ps -a 显示所有容器,包括运行中的和已停止的 docker ps -a 查看完整的容器历史
docker ps -q 只显示容器ID,常用于脚本中批量操作容器 docker ps -q 输出简洁,便于管道操作
docker ps -l 显示最近创建的容器,无论是否在运行 docker ps -l 快速查看最新容器
docker ps -n <数量> 显示最近创建的N个容器 docker ps -n 5 限制显示数量
docker ps --filter 根据条件过滤容器列表,支持多种过滤条件 docker ps --filter "status=running" 支持status、name、label等过滤
docker ps --format 自定义输出格式,可以指定显示的字段 docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" 自定义表格格式
docker ps -s 显示容器的大小信息,包括虚拟大小和实际大小 docker ps -s 用于分析容器存储使用
docker inspect <容器ID/名称> 显示容器的详细配置信息,包括网络、挂载、环境变量等 docker inspect web JSON格式的完整信息
docker inspect --format 使用Go模板格式化输出特定信息 docker inspect --format='{{.NetworkSettings.IPAddress}}' web 提取特定字段信息
docker logs <容器ID/名称> 查看容器的日志输出,显示stdout和stderr docker logs web 显示所有历史日志
docker logs -f <容器ID/名称> 实时跟踪容器日志输出,类似tail -f docker logs -f web 持续显示新的日志
docker logs --tail <行数> 只显示最后N行日志,避免输出过多历史日志 docker logs --tail 100 web 快速查看最新日志
docker logs --since <时间> 显示指定时间之后的日志 docker logs --since 2023-01-01 web 支持多种时间格式
docker logs --until <时间> 显示指定时间之前的日志 docker logs --until 2023-12-31 web 查看历史时间段日志
docker logs -t 在日志前显示时间戳,便于分析问题发生时间 docker logs -t web 每行日志前加时间戳
docker top <容器ID/名称> 显示容器内运行的进程信息,类似系统的top命令 docker top web 查看进程状态和资源使用
docker stats 实时显示所有容器的资源使用统计,包括CPU、内存、网络、磁盘IO docker stats 动态更新的资源监控
docker stats <容器ID/名称> 显示指定容器的资源使用统计 docker stats web 监控特定容器性能
docker stats --no-stream 只显示一次统计信息,不持续更新 docker stats --no-stream 获取当前时刻的统计
docker port <容器> 显示容器的端口映射信息 docker port web 查看端口转发配置
docker diff <容器> 显示容器文件系统相对于镜像的变化 docker diff web A=添加,D=删除,C=修改

5. 容器交互操作

命令 详细说明 示例 备注
docker exec -it <容器> /bin/bash 在运行的容器中启动bash shell,进入交互式终端 docker exec -it web /bin/bash 最常用的容器进入方式
docker exec -it <容器> /bin/sh 在容器中启动sh shell,适用于没有bash的轻量级镜像 docker exec -it web /bin/sh Alpine Linux等使用sh
docker exec -it <容器> bash 简化的bash进入方式,省略路径 docker exec -it web bash 前提是bash在PATH中
docker exec -it <容器> sh 简化的sh进入方式 docker exec -it web sh 适用于大多数Linux发行版
docker exec -u <用户> -it <容器> bash 以指定用户身份进入容器,用于权限控制 docker exec -u root -it web bash 可以切换到root或其他用户
docker exec -w <目录> -it <容器> bash 进入容器时直接切换到指定工作目录 docker exec -w /app -it web bash 避免进入后再cd
docker exec -e <变量>=<值> <容器> <命令> 在执行命令时设置环境变量 docker exec -e DEBUG=1 web node app.js 临时设置环境变量
docker exec -d <容器> <命令> 在容器中后台执行命令,不占用当前终端 docker exec -d web touch /tmp/test 适合执行不需要交互的命令
docker exec <容器> <命令> 在容器中执行单个命令并返回结果 docker exec web ls -la /app 快速执行命令查看结果
docker exec <容器> cat <文件> 查看容器内文件的内容 docker exec web cat /etc/nginx/nginx.conf 快速查看配置文件
docker exec <容器> ps aux 查看容器内的所有进程 docker exec web ps aux 诊断容器内进程状态
docker exec <容器> df -h 查看容器内的磁盘使用情况 docker exec web df -h 检查存储空间
docker exec <容器> netstat -tlnp 查看容器内的网络连接和监听端口 docker exec web netstat -tlnp 网络诊断工具
docker attach <容器ID/名称> 连接到容器的主进程,查看其输出和交互 docker attach web 连接到容器的主进程
docker attach --no-stdin <容器> 只查看容器输出,不发送输入 docker attach --no-stdin web 避免意外输入影响容器

6. 文件操作

命令 详细说明 示例 备注
docker cp <容器>:<路径> <主机路径> 从运行或停止的容器中复制文件或目录到主机 docker cp web:/app/log.txt ./ 容器可以是停止状态
docker cp <主机路径> <容器>:<路径> 从主机复制文件或目录到容器中 docker cp ./config.txt web:/app/ 可以覆盖容器内文件
docker cp <容器>:<目录> <主机目录> 复制整个目录及其内容 docker cp web:/app/logs ./logs 递归复制目录结构
docker cp -a <容器>:<路径> <主机路径> 保持文件的所有属性(权限、所有者等)进行复制 docker cp -a web:/app/data ./data 保持原始文件属性
docker cp -L <容器>:<路径> <主机路径> 跟随符号链接进行复制,复制链接指向的实际文件 docker cp -L web:/app/link.txt ./ 解析符号链接

7. 数据卷管理

命令 详细说明 示例 备注
docker volume create <卷名> 创建一个新的数据卷,由Docker管理存储位置 docker volume create mydata Docker自动选择存储位置
docker volume create --driver <驱动> 使用指定的存储驱动创建数据卷 docker volume create --driver local mydata 支持不同的存储后端
docker volume create --opt <选项> 创建数据卷时指定驱动选项,如NFS、加密等 docker volume create --opt type=nfs mydata 高级存储配置
docker volume ls 列出所有的数据卷及其驱动信息 docker volume ls 查看卷的基本信息
docker volume ls -q 只显示数据卷的名称,便于脚本处理 docker volume ls -q 简洁输出格式
docker volume ls --filter 根据条件过滤数据卷列表 docker volume ls --filter "dangling=true" 查找未使用的卷
docker volume inspect <卷名> 显示数据卷的详细信息,包括挂载点、驱动、选项等 docker volume inspect mydata JSON格式的详细信息
docker volume rm <卷名> 删除指定的数据卷,卷必须未被任何容器使用 docker volume rm mydata 删除前确保无容器使用
docker volume rm -f <卷名> 强制删除数据卷,即使有容器正在使用 docker volume rm -f mydata 可能导致数据丢失
docker volume prune 删除所有未被容器使用的数据卷,清理孤立卷 docker volume prune 批量清理未使用的卷
docker volume prune -f 强制删除未使用的数据卷,不提示确认 docker volume prune -f 自动化脚本中使用
docker run -v <卷名>:<容器路径> 将命名数据卷挂载到容器的指定路径 docker run -v mydata:/data nginx 数据持久化存储
docker run -v <主机路径>:<容器路径> 将主机目录绑定挂载到容器 docker run -v /host/data:/data nginx 直接访问主机文件
docker run -v <路径>:<容器路径>:ro 以只读模式挂载,容器无法修改挂载的内容 docker run -v /data:/app:ro nginx 保护主机数据安全
docker run --tmpfs <路径> 在容器内创建临时文件系统,数据存储在内存中 docker run --tmpfs /tmp nginx 高性能临时存储

8. 网络管理

命令 详细说明 示例 备注
docker network ls 列出所有Docker网络,包括默认网络和自定义网络 docker network ls 显示网络ID、名称、驱动、作用域
docker network ls -q 只显示网络ID,便于脚本批量操作 docker network ls -q 简洁输出格式
docker network ls --filter 根据条件过滤网络列表,如驱动类型、名称等 docker network ls --filter "driver=bridge" 查找特定类型的网络
docker network create <网络名> 创建自定义网络,默认使用bridge驱动 docker network create mynet 容器间通信的独立网络
docker network create --driver <驱动> 使用指定驱动创建网络,如bridge、overlay、macvlan等 docker network create --driver bridge mynet 不同驱动适用不同场景
docker network create --subnet <子网> 创建网络时指定IP子网范围 docker network create --subnet 172.20.0.0/16 mynet 自定义IP地址范围
docker network create --gateway <网关> 指定网络的网关地址 docker network create --gateway 172.20.0.1 mynet 控制网络路由
docker network create --ip-range <范围> 限制容器可分配的IP地址范围 docker network create --ip-range 172.20.240.0/20 mynet 更精细的IP管理
docker network inspect <网络名> 显示网络的详细配置信息,包括连接的容器、IP分配等 docker network inspect mynet 网络诊断和配置查看
docker network rm <网络名> 删除自定义网络,网络必须没有容器连接 docker network rm mynet 清理不需要的网络
docker network prune 删除所有未被容器使用的网络 docker network prune 批量清理孤立网络
docker network connect <网络> <容器> 将运行中的容器连接到指定网络 docker network connect mynet web 动态添加网络连接
docker network connect --ip <IP> 连接容器到网络时指定固定IP地址 docker network connect --ip 172.20.0.10 mynet web 静态IP分配
docker network disconnect <网络> <容器> 断开容器与指定网络的连接 docker network disconnect mynet web 动态移除网络连接
docker run --network <网络名> 创建容器时指定连接的网络 docker run --network mynet nginx 容器启动时加入网络
docker run --network=host 使用主机网络模式,容器直接使用主机的网络栈 docker run --network=host nginx 性能最好但隔离性差
docker run --network=none 无网络模式,容器没有网络连接 docker run --network=none nginx 最高安全性但无网络功能

9. Docker Compose 命令

命令 详细说明 示例 备注
docker-compose up 根据docker-compose.yml文件启动所有定义的服务 docker-compose up 前台运行,显示所有服务日志
docker-compose up -d 后台模式启动所有服务,不占用当前终端 docker-compose up -d 生产环境推荐使用
docker-compose up --build 启动服务前重新构建镜像,确保使用最新代码 docker-compose up --build 开发环境常用
docker-compose up --force-recreate 强制重新创建容器,即使配置没有变化 docker-compose up --force-recreate 解决容器状态问题
docker-compose up --scale <服务>=<数量> 扩展指定服务的实例数量,实现水平扩展 docker-compose up --scale web=3 负载均衡和高可用
docker-compose down 停止并删除所有服务容器、网络,保留数据卷 docker-compose down 清理环境但保留数据
docker-compose down -v 停止服务并删除关联的数据卷 docker-compose down -v 完全清理包括数据
docker-compose down --rmi all 停止服务并删除所有相关镜像 docker-compose down --rmi all 彻底清理环境
docker-compose start 启动已经创建但停止的服务容器 docker-compose start 不重新创建容器
docker-compose start <服务名> 启动指定的服务 docker-compose start web 选择性启动服务
docker-compose stop 停止所有运行中的服务,但不删除容器 docker-compose stop 保留容器状态
docker-compose stop <服务名> 停止指定的服务 docker-compose stop web 选择性停止服务
docker-compose restart 重启所有服务,相当于stop后start docker-compose restart 应用配置变更
docker-compose restart <服务名> 重启指定的服务 docker-compose restart web 单独重启某个服务
docker-compose pause 暂停所有服务的进程,不释放资源 docker-compose pause 临时暂停服务
docker-compose unpause 恢复暂停的服务 docker-compose unpause 继续暂停的服务
docker-compose ps 显示所有服务的容器状态 docker-compose ps 查看服务运行状态
docker-compose ps -q 只显示服务容器的ID docker-compose ps -q 脚本中批量操作
docker-compose logs 查看所有服务的日志输出 docker-compose logs 集中查看日志
docker-compose logs -f 实时跟踪所有服务的日志 docker-compose logs -f 实时监控服务
docker-compose logs <服务名> 查看指定服务的日志 docker-compose logs web 单独查看某服务日志
docker-compose exec <服务> <命令> 在运行的服务容器中执行命令 docker-compose exec web bash 进入服务容器
docker-compose exec -T <服务> <命令> 非交互式执行命令,适合脚本使用 docker-compose exec -T web ls 脚本自动化
docker-compose run <服务> <命令> 创建新容器运行一次性命令 docker-compose run web bash 临时任务执行
docker-compose run --rm <服务> <命令> 运行命令后自动删除容器 docker-compose run --rm web npm test 避免产生临时容器
docker-compose build 构建所有定义了build的服务镜像 docker-compose build 批量构建镜像
docker-compose build <服务名> 构建指定服务的镜像 docker-compose build web 单独构建某服务
docker-compose build --no-cache 不使用缓存重新构建所有镜像 docker-compose build --no-cache 确保最新构建
docker-compose pull 拉取所有服务的最新镜像 docker-compose pull 更新镜像版本
docker-compose push 推送所有服务镜像到仓库 docker-compose push 发布镜像
docker-compose config 验证并显示compose文件的最终配置 docker-compose config 配置文件调试
docker-compose config --services 列出compose文件中定义的所有服务名 docker-compose config --services 查看服务列表
docker-compose top 显示所有服务容器中运行的进程 docker-compose top 进程监控
docker-compose port <服务> <端口> 查看服务端口的映射情况 docker-compose port web 80 端口映射查询

10. 系统清理命令

命令 详细说明 示例 备注
docker system df 显示Docker系统的磁盘使用情况,包括镜像、容器、卷的空间占用 docker system df 系统存储分析
docker system df -v 详细显示每个组件的磁盘使用情况 docker system df -v 详细的存储分析
docker system prune 清理未使用的容器、网络、镜像(悬空)和构建缓存 docker system prune 安全的系统清理
docker system prune -a 清理所有未使用的资源,包括未被任何容器使用的镜像 docker system prune -a 更彻底的清理
docker system prune -f 强制清理,不提示确认信息 docker system prune -f 自动化脚本使用
docker system prune --volumes 清理时包括未使用的数据卷 docker system prune --volumes 包含卷的完整清理
docker system events 实时显示Docker系统事件,用于监控和调试 docker system events 系统活动监控
docker system info 显示Docker系统的详细信息,与docker info相同 docker system info 系统状态查看
docker container prune 删除所有已停止的容器 docker container prune 清理停止的容器
docker container prune -f 强制删除已停止的容器,不提示确认 docker container prune -f 自动化清理
docker image prune 删除所有悬空镜像(没有标签且未被容器使用) docker image prune 清理构建产生的临时镜像
docker image prune -a 删除所有未被容器使用的镜像 docker image prune -a 彻底清理镜像
docker image prune -f 强制删除悬空镜像,不提示确认 docker image prune -f 自动化镜像清理
docker volume prune 删除所有未被容器使用的数据卷 docker volume prune 清理孤立的数据卷
docker volume prune -f 强制删除未使用的数据卷,不提示确认 docker volume prune -f 自动化卷清理
docker network prune 删除所有未被容器使用的网络 docker network prune 清理孤立的网络
docker network prune -f 强制删除未使用的网络,不提示确认 docker network prune -f 自动化网络清理

11. 镜像仓库操作

命令 详细说明 示例 备注
docker login 登录到Docker Hub,需要输入用户名和密码 docker login 默认登录Docker Hub
docker login <仓库地址> 登录到指定的镜像仓库,如私有仓库 docker login registry.example.com 支持私有仓库
docker login -u <用户名> 指定用户名登录,避免交互式输入 docker login -u myuser 脚本中使用
docker login -p <密码> 指定密码登录,但不安全,不推荐在生产环境使用 docker login -p mypass 安全风险高
docker logout 退出当前Docker Hub的登录状态 docker logout 清除本地认证信息
docker logout <仓库地址> 退出指定仓库的登录状态 docker logout registry.example.com 多仓库管理
docker push <镜像名> 将本地镜像推送到仓库,镜像名需包含仓库地址 docker push myapp:v1.0 发布镜像到仓库
docker pull <镜像名> 从仓库拉取镜像到本地 docker pull myapp:v1.0 下载镜像
docker pull --all-tags <镜像> 拉取镜像的所有可用标签 docker pull --all-tags nginx 下载所有版本
docker pull --platform <平台> 拉取指定平台架构的镜像 docker pull --platform linux/amd64 nginx 多架构镜像支持

12. 高级运行参数

参数 详细说明 示例 备注
--env 或 -e 设置容器的环境变量,用于配置应用程序行为 docker run -e NODE_ENV=production node 可以设置多个环境变量
--env-file 从文件中批量读取环境变量,文件格式为KEY=VALUE docker run --env-file .env node 适合大量环境变量配置
--workdir 或 -w 设置容器内的工作目录,影响命令执行的默认路径 docker run -w /app node 覆盖Dockerfile中的WORKDIR
--user 或 -u 指定运行容器的用户ID或用户名,用于权限控制和安全 docker run -u 1000:1000 node 格式:用户ID:组ID
--memory 或 -m 限制容器可使用的最大内存量,防止内存泄漏影响主机 docker run -m 512m nginx 支持b、k、m、g单位
--memory-swap 设置内存+交换空间的总限制 docker run --memory=512m --memory-swap=1g nginx 控制总虚拟内存使用
--memory-swappiness 设置容器使用交换空间的倾向,0-100之间 docker run --memory-swappiness=0 nginx 0表示尽量不使用交换
--oom-kill-disable 禁用OOM(内存不足)杀死机制 docker run --oom-kill-disable nginx 需要同时设置内存限制
--cpus 限制容器可使用的CPU核心数,支持小数 docker run --cpus="1.5" nginx 1.5表示1.5个CPU核心
--cpu-shares 设置CPU使用权重,相对值,默认1024 docker run --cpu-shares=512 nginx 相对其他容器的CPU优先级
--cpuset-cpus 指定容器可以使用的具体CPU核心 docker run --cpuset-cpus="0,1" nginx 绑定到特定CPU核心
--cpu-period 设置CPU调度周期,单位微秒,默认100000 docker run --cpu-period=100000 nginx CFS调度器参数
--cpu-quota 设置CPU配额,在调度周期内可使用的CPU时间 docker run --cpu-quota=50000 nginx 与cpu-period配合使用
--restart 设置容器的重启策略,控制容器异常退出后的行为 docker run --restart=always nginx 生产环境推荐always
--restart=no 不自动重启容器,默认策略 docker run --restart=no nginx 手动控制容器生命周期
--restart=on-failure 只在容器非正常退出时重启,可指定最大重试次数 docker run --restart=on-failure:3 nginx 避免无限重启
--restart=unless-stopped 除非手动停止,否则总是重启 docker run --restart=unless-stopped nginx 系统重启后自动启动
--link 链接到其他容器,创建网络连接(已废弃,推荐使用自定义网络) docker run --link db:database web 旧版本的容器连接方式
--hostname 设置容器的主机名,影响容器内的hostname命令输出 docker run --hostname myhost nginx 自定义容器主机名
--add-host 在容器的/etc/hosts文件中添加主机名映射 docker run --add-host db:192.168.1.100 web 自定义域名解析
--dns 设置容器使用的DNS服务器地址 docker run --dns 8.8.8.8 nginx 自定义DNS解析
--dns-search 设置DNS搜索域,用于短域名解析 docker run --dns-search example.com nginx 域名搜索后缀
--mac-address 为容器设置自定义MAC地址 docker run --mac-address 02:42:ac:11:00:02 nginx 网络身份标识
--ip 在自定义网络中为容器分配固定IP地址 docker run --ip 172.20.0.10 nginx 静态IP分配
--privileged 以特权模式运行容器,获得主机的几乎所有权限 docker run --privileged nginx 安全风险极高,谨慎使用
--cap-add 为容器添加特定的Linux能力(capabilities) docker run --cap-add SYS_ADMIN nginx 精细化权限控制
--cap-drop 移除容器的特定Linux能力 docker run --cap-drop ALL nginx 最小权限原则
--security-opt 设置安全相关选项,如SELinux、AppArmor、seccomp等 docker run --security-opt seccomp=unconfined nginx 安全策略配置
--read-only 将容器的根文件系统设为只读,提高安全性 docker run --read-only nginx 防止文件系统被篡改
--tmpfs 在容器内创建临时文件系统,数据存储在内存中 docker run --tmpfs /tmp nginx 高性能临时存储
--ulimit 设置容器内进程的资源限制 docker run --ulimit nofile=1024:1024 nginx 进程资源控制
--device 将主机设备映射到容器内 docker run --device /dev/sda:/dev/xvda nginx 设备访问权限
--device-read-bps 限制设备的读取速度,单位字节/秒 docker run --device-read-bps /dev/sda:1mb nginx IO性能控制
--device-write-bps 限制设备的写入速度,单位字节/秒 docker run --device-write-bps /dev/sda:1mb nginx IO性能控制
--health-cmd 设置健康检查命令,用于监控容器状态 docker run --health-cmd="curl -f http://localhost/" nginx 应用健康监控
--health-interval 设置健康检查的执行间隔时间 docker run --health-interval=30s nginx 检查频率控制
--health-timeout 设置健康检查命令的超时时间 docker run --health-timeout=3s nginx 避免检查阻塞
--health-retries 设置健康检查失败的重试次数 docker run --health-retries=3 nginx 容错机制
--no-healthcheck 禁用镜像中定义的健康检查 docker run --no-healthcheck nginx 跳过健康检查

13. 容器状态和信号管理

命令 详细说明 示例 备注
docker wait <容器> 阻塞等待容器停止并返回其退出状态码 docker wait web 脚本中等待容器完成
docker kill -s SIGTERM <容器> 向容器主进程发送SIGTERM信号,请求优雅关闭 docker kill -s SIGTERM web 给应用清理时间
docker kill -s SIGKILL <容器> 向容器主进程发送SIGKILL信号,强制立即终止 docker kill -s SIGKILL web 强制终止,可能丢失数据
docker kill -s SIGUSR1 <容器> 发送用户自定义信号,应用可自定义处理逻辑 docker kill -s SIGUSR1 web 应用特定的信号处理
docker update <容器> 动态更新运行中容器的配置,如资源限制 docker update --memory 1g web 不重启容器更新配置
docker update --restart <策略> 更新容器的重启策略 docker update --restart=always web 动态修改重启行为
docker update --cpu-shares <值> 更新容器的CPU权重 docker update --cpu-shares=512 web 动态调整CPU优先级
docker rename <旧名> <新名> 重命名容器,不影响容器运行状态 docker rename web webapp 更改容器标识

14. 实用组合命令

功能 命令 详细说明
停止所有容器 docker stop $(docker ps -q) 获取所有运行容器ID并批量停止,用于快速清理环境
删除所有容器 docker rm $(docker ps -aq) 删除所有容器(包括停止的),彻底清理容器环境
强制删除所有容器 docker rm -f $(docker ps -aq) 强制删除所有容器,包括正在运行的,用于紧急清理
删除所有镜像 docker rmi $(docker images -q) 删除所有本地镜像,完全清理镜像缓存
强制删除所有镜像 docker rmi -f $(docker images -q) 强制删除所有镜像,即使有容器依赖
删除悬空镜像 docker rmi $(docker images -f "dangling=true" -q) 只删除没有标签的临时镜像,清理构建垃圾
进入最新容器 docker exec -it $(docker ps -l -q) /bin/bash 自动进入最后创建的容器,便于快速调试
查看容器IP docker inspect <容器> | grep IPAddress 提取容器的IP地址信息,用于网络诊断
查看所有容器IP docker inspect $(docker ps -q) | grep IPAddress 批量查看所有运行容器的IP地址
批量删除退出容器 docker rm $(docker ps -f "status=exited" -q) 只删除已退出的容器,保留运行中的容器
查看容器端口 docker port $(docker ps -l -q) 查看最新容器的端口映射配置
进入容器并查看日志 docker exec -it <容器> tail -f /var/log/nginx/access.log 进入容器并实时查看特定日志文件

15. Dockerfile 常用指令详解

指令 详细说明 示例 最佳实践
FROM 指定构建镜像的基础镜像,必须是Dockerfile的第一条指令 FROM ubuntu:20.04 选择官方、安全、最小的基础镜像
FROM ... AS 多阶段构建,为构建阶段命名,便于后续引用 FROM node:14 AS builder 用于优化镜像大小和构建效率
RUN 在镜像构建过程中执行命令,每个RUN创建一个新层 RUN apt-get update && apt-get install -y nginx 合并命令减少层数,清理缓存
RUN --mount 使用构建时挂载,如缓存挂载,提高构建效率 RUN --mount=type=cache,target=/var/cache/apt apt-get update 加速重复构建
COPY 从构建上下文复制文件到镜像中,推荐使用而非ADD COPY . /app 只复制必要文件,使用.dockerignore
COPY --from 从多阶段构建的其他阶段复制文件 COPY --from=builder /app/dist /usr/share/nginx/html 实现镜像瘦身
COPY --chown 复制文件时同时设置文件的所有者和组 COPY --chown=nginx:nginx . /app 避免权限问题
ADD 类似COPY但支持URL下载和自动解压tar文件 ADD app.tar.gz /app 仅在需要特殊功能时使用
WORKDIR 设置后续指令的工作目录,如果不存在会自动创建 WORKDIR /app 使用绝对路径,保持一致性
EXPOSE 声明容器运行时监听的端口,仅为文档说明 EXPOSE 80 443 不实际发布端口,需要-p参数
ENV 设置环境变量,在构建和运行时都可用 ENV NODE_ENV=production 用于配置应用行为
ARG 定义构建时参数,只在构建过程中可用 ARG VERSION=latest 用于构建时的动态配置
LABEL 为镜像添加元数据标签,用于分类和管理 LABEL version="1.0" description="My app" 添加版本、维护者等信息
CMD 指定容器启动时的默认命令,可被docker run覆盖 CMD ["nginx", "-g", "daemon off;"] 使用exec格式,避免shell包装
ENTRYPOINT 设置容器的入口点,不会被docker run覆盖 ENTRYPOINT ["./start.sh"] 与CMD配合使用,提供灵活性
VOLUME 声明挂载点,创建匿名卷 VOLUME ["/data"] 用于数据持久化
USER 指定后续指令和容器运行时的用户 USER nginx 避免使用root用户运行应用
SHELL 指定RUN、CMD、ENTRYPOINT使用的shell SHELL ["/bin/bash", "-c"] 在Windows容器中特别有用
STOPSIGNAL 设置停止容器时发送的系统信号 STOPSIGNAL SIGTERM 确保应用优雅关闭
HEALTHCHECK 定义检查容器健康状态的命令 HEALTHCHECK CMD curl -f http://localhost/ || exit 1 提供应用级健康监控
ONBUILD 设置触发器,当此镜像作为基础镜像时执行 ONBUILD COPY . /app 创建可重用的基础镜像

16. 常用服务部署示例

服务 完整部署命令 详细说明
Nginx docker run -d --name nginx -p 80:80 -v /data/html:/usr/share/nginx/html -v /data/nginx.conf:/etc/nginx/nginx.conf nginx Web服务器,映射配置文件和网站目录
Apache docker run -d --name apache -p 8080:80 -v /data/html:/usr/local/apache2/htdocs -v /data/httpd.conf:/usr/local/apache2/conf/httpd.conf httpd Apache Web服务器,自定义配置
MySQL docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=mydb -v mysql_data:/var/lib/mysql mysql:8.0 MySQL数据库,持久化数据存储
PostgreSQL docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -e POSTGRES_DB=mydb -v postgres_data:/var/lib/postgresql/data postgres:13 PostgreSQL数据库,包含初始数据库
Redis docker run -d --name redis -p 6379:6379 -v redis_data:/data redis:6.2 redis-server --appendonly yes --requirepass mypassword Redis缓存,启用持久化和密码认证
MongoDB docker run -d --name mongo -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=password -v mongo_data:/data/db mongo:5.0 MongoDB文档数据库,设置管理员账户
Elasticsearch docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" elasticsearch:7.14.0 Elasticsearch搜索引擎,单节点模式
RabbitMQ docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=password rabbitmq:3.9-management RabbitMQ消息队列,包含管理界面
Node.js docker run -d --name nodeapp -p 3000:3000 -v /app:/usr/src/app -w /usr/src/app -e NODE_ENV=production node:16 npm start Node.js应用,开发环境配置
Python Flask docker run -d --name flaskapp -p 5000:5000 -v /app:/app -w /app -e FLASK_ENV=production python:3.9 python app.py Python Flask应用,生产环境

17. 调试和故障排除

命令 详细说明 示例 使用场景
docker logs --details <容器> 查看容器的详细日志,包括额外的元数据信息 docker logs --details web 深度日志分析和调试
docker events 实时监控Docker系统事件,包括容器、镜像、网络等操作 docker events 系统活动监控和审计
docker events --filter 过滤特定类型的事件,如特定容器或事件类型 docker events --filter container=web 针对性事件监控
docker exec <容器> ps aux 查看容器内所有运行的进程及其状态 docker exec web ps aux 进程状态诊断
docker exec <容器> netstat -tlnp 查看容器内的网络连接和监听端口 docker exec web netstat -tlnp 网络连接诊断
docker exec <容器> df -h 查看容器内文件系统的磁盘使用情况 docker exec web df -h 存储空间分析
docker exec <容器> free -h 查看容器内的内存使用情况 docker exec web free -h 内存使用分析
docker exec <容器> top 实时查看容器内的进程活动 docker exec web top 实时性能监控
docker exec <容器> env 查看容器内的所有环境变量 docker exec web env 环境配置检查
docker run --rm -it <镜像> /bin/bash 创建临时调试容器,用完自动删除 docker run --rm -it ubuntu /bin/bash 快速环境测试和调试

这个详细版的Docker命令速查表提供了每个命令的深入说明、实际应用场景和最佳实践建议,可以作为Docker学习和日常运维工作的完整参考手册。

通过本教程,您已掌握Docker从开发到部署的全流程技能,可灵活选择Compose编排或手动管理方案。建议结合官方文档(Docker Docs)深入探索更多高级特性。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注