文档版本:v1.0 适用系统:CentOS 7/8 / Rocky Linux 8/9 / Ubuntu 20.04/22.04 Docker 版本:24.0+ / 25.0+ 编写日期:2026-05-14
1. Docker 概述
1.1 什么是 Docker
Docker 是一个开源的容器化平台,它允许开发者将应用及其依赖打包到一个轻量级、可移植的容器中运行。与传统虚拟机相比,容器共享宿主机内核,无需 Guest OS,因此启动更快、资源占用更少。
1.2 Docker vs 虚拟机
| 对比项 | Docker 容器 | 传统虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 磁盘占用 | MB 级 | GB 级 |
| 性能 | 接近原生 | 有虚拟化损耗 |
| 系统支持 | 同一内核的 Linux | 任意操作系统 |
| 隔离性 | 进程级隔离 | 完全隔离 |
| 部署密度 | 单机可运行数百个容器 | 单机通常数十个 VM |
1.3 核心概念
| 概念 | 说明 |
|---|---|
| 镜像 (Image) | 只读模板,包含运行应用所需的文件系统、依赖和配置 |
| 容器 (Container) | 镜像的运行实例,拥有独立的文件系统、网络和进程空间 |
| 仓库 (Registry) | 存储和分发镜像的服务(如 Docker Hub、阿里云镜像仓库) |
| Dockerfile | 描述镜像构建步骤的文本文件 |
| Volume | 数据卷,用于容器数据持久化 |
| Network | 容器网络,实现容器间通信 |
2. Docker 架构
2.1 架构图
![图片[1]-Docker 部署及基础命令手册-小程博客](https://www.zenly.ink/wp-content/uploads/2026/05/a4b4d286e620260514170247-1024x701.png)
2.2 架构组件说明
| 组件 | 说明 |
|---|---|
| Docker Client | 用户与 Docker 交互的命令行工具(docker 命令) |
| Docker Daemon | 后台服务进程(dockerd),负责镜像/容器/网络/数据卷的管理 |
| containerd | 容器运行时,负责容器的生命周期管理 |
| runc | OCI 标准容器运行时,负责创建和运行容器 |
| Docker Registry | 镜像仓库,存储和分发 Docker 镜像 |
2.3 Docker 分层文件系统
![图片[2]-Docker 部署及基础命令手册-小程博客](https://www.zenly.ink/wp-content/uploads/2026/05/5ae917e79920260514170252-1024x701.png)
Docker 镜像采用分层存储设计:
- 只读层(Image Layers):每个指令(如
RUN、COPY)生成一层,多层共享,节省磁盘空间 - 可写层(Container Layer):容器运行时在最顶层添加可写层,容器删除后该层数据丢失
- Copy-on-Write:修改文件时,从只读层复制到可写层再修改,不改变原始镜像
3. 部署流程总览
![图片[3]-Docker 部署及基础命令手册-小程博客](https://www.zenly.ink/wp-content/uploads/2026/05/90e22154dd20260514170304-1024x701.png)
| 步骤 | 操作 | 说明 |
|---|---|---|
| ① | 系统初始化 | 关闭 SELinux / 卸载旧版 Docker |
| ② | 安装依赖 | 安装 yum-utils / apt-transport-https 等 |
| ③ | 添加 Docker 源 | 配置阿里云等国内镜像源 |
| ④ | 安装 Docker | yum / apt 安装 docker-ce |
| ⑤ | 配置镜像加速 | 配置 daemon.json 加速器 |
| ⑥ | 启动服务 | systemctl start docker 并设为开机自启 |
| ⑦ | 验证安装 | docker version / docker run hello-world |
4. 环境准备
4.1 服务器规划
| 配置项 | Master 节点 | Worker 节点 |
|---|---|---|
| 主机名 | docker-master | docker-node1 |
| IP 地址 | 192.168.1.100 | 192.168.1.101 |
| 系统 | CentOS 7 / Rocky 8 | CentOS 7 / Rocky 8 |
| 最低配置 | 2C4G 50GB | 2C4G 50GB |
4.2 系统初始化(所有节点执行)
# 1. 关闭 SELinux
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 2. 关闭防火墙(测试环境,生产环境按需放行端口)
systemctl stop firewalld
systemctl disable firewalld
# 3. 配置时间同步
yum install -y chrony
systemctl enable chronyd --now
# 4. 配置 hosts 解析
cat >> /etc/hosts <<EOF
192.168.1.100 docker-master
192.168.1.101 docker-node1
EOF
4.3 卸载旧版 Docker(如已安装)
# CentOS/Rocky
yum remove -y docker docker-client docker-client-latest \
docker-common docker-latest docker-latest-logrotate \
docker-logrotate docker-engine
# Ubuntu/Debian
apt remove -y docker docker.io containerd runc
5. 安装 Docker
5.1 CentOS 7 / Rocky Linux 8/9
Step 1:安装依赖工具
yum install -y yum-utils device-mapper-persistent-data lvm2
Step 2:添加 Docker 官方 Yum 源(阿里云镜像)
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Step 3:安装 Docker CE
# 安装最新版
yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 或安装指定版本
# 查看可用版本
yum list docker-ce --showduplicates | sort -r
# 安装指定版本
yum install -y docker-ce-24.0.9 docker-ce-cli-24.0.9 containerd.io
Step 4:启动并设为开机自启
systemctl enable docker --now
5.2 Ubuntu / Debian
Step 1:安装依赖工具
apt update
apt install -y ca-certificates curl gnupg lsb-release
Step 2:添加 Docker 官方 GPG Key
mkdir -p /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | \
gpg --dearmor -o /etc/apt/keyrings/docker.gpg
Step 3:添加 Docker Apt 源
echo "deb [arch=$(dpkg --print-architecture) \
signed-by=/etc/apt/keyrings/docker.gpg] \
https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
Step 4:安装 Docker CE
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
Step 5:启动并设为开机自启
systemctl enable docker --now
5.3 验证安装
# 查看 Docker 版本
docker version
# 查看 Docker 系统信息
docker info
# 运行测试容器
docker run --rm hello-world
# 期望输出:
# Hello from Docker!
# This message shows that your installation appears to be working correctly.
6. 配置镜像加速
国内环境拉取 Docker Hub 镜像较慢,需要配置镜像加速器。
6.1 创建配置文件
mkdir -p /etc/docker
6.2 编辑 daemon.json
cat > /etc/docker/daemon.json <<'EOF'
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com",
"https://docker.mirrors.ustc.edu.cn"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"storage-driver": "overlay2",
"exec-opts": [
"native.cgroupdriver=systemd"
]
}
EOF
⚠️ 注意:
registry-mirrors中的加速地址需替换为你实际可用的加速器地址。 常用加速器:阿里云(需登录获取专属地址)、腾讯云、中科大等。
6.3 重载配置并重启
systemctl daemon-reload
systemctl restart docker
6.4 验证加速器生效
docker info | grep -A 5 "Registry Mirrors"
# 期望输出:
# Registry Mirrors:
# https://mirror.ccs.tencentyun.com/
# https://docker.mirrors.ustc.edu.cn/
7. Docker 基础命令
7.1 命令格式
docker [OPTIONS] COMMAND [SUBCOMMAND] [ARGS...]
7.2 全局常用选项
| 选项 | 说明 |
|---|---|
-D | 开启 Debug 模式 |
-H | 指定 Docker Daemon 连接地址 |
-v | 打印版本信息 |
--help | 查看帮助 |
7.3 命令分类速览
docker
├── 镜像操作:images / pull / push / build / rmi / tag / save / load
├── 容器操作:run / start / stop / restart / rm / exec / logs / ps
├── 数据管理:volume / cp
├── 网络管理:network
├── 系统管理:info / version / system
└── 编排工具:compose
8. Docker 镜像管理
8.1 搜索镜像
# 在 Docker Hub 搜索镜像
docker search nginx
# 过滤星级大于 100 的官方镜像
docker search --filter=is-official=true --filter=stars=100 nginx
8.2 下载镜像
# 下载最新版
docker pull nginx
# 下载指定版本
docker pull nginx:1.25.4
# 下载指定平台的镜像
docker pull --platform linux/amd64 nginx:alpine
8.3 查看本地镜像
# 列出所有镜像
docker images
# 或
docker image ls
# 只显示镜像 ID
docker images -q
# 过滤显示
docker images --filter "dangling=true" # 仅显示悬空镜像
docker images --format "{{.Repository}}:{{.Tag}} {{.Size}}" # 自定义格式
输出示例:
| REPOSITORY | TAG | IMAGE ID | CREATED | SIZE |
|---|---|---|---|---|
| nginx | latest | 39286ab8a5e1 | 2 days ago | 188MB |
| redis | 7.2 | e579380f268d | 5 days ago | 138MB |
| centos | 7 | eeb6ee3f44bd | 3 weeks ago | 204MB |
8.4 删除镜像
# 删除指定镜像
docker rmi nginx:1.25.4
# 强制删除(即使有容器在使用)
docker rmi -f nginx:1.25.4
# 删除所有悬空镜像(无标签的)
docker image prune
# 删除所有未被容器使用的镜像
docker image prune -a
8.5 镜像标签
# 给镜像打标签
docker tag nginx:latest myregistry.com/library/nginx:latest
8.6 镜像导入导出
# 导出镜像为 tar 文件
docker save -o nginx.tar nginx:latest
# 导入 tar 文件为镜像
docker load -i nginx.tar
# 查看导出文件
ls -lh nginx.tar
8.7 查看镜像详情
# 查看镜像详细信息(JSON 格式)
docker inspect nginx:latest
# 查看镜像构建历史
docker history nginx:latest
9. Docker 容器管理
9.1 创建并运行容器
# 基本运行
docker run nginx
# 常用参数完整示例
docker run -d \
--name my-nginx \
-p 8080:80 \
-v /data/html:/usr/share/nginx/html \
--restart=always \
-e TZ=Asia/Shanghai \
--memory=512m \
--cpus=1.0 \
nginx:latest
docker run 常用参数详解:
| 参数 | 说明 | 示例 |
|---|---|---|
-d | 后台运行(守护模式) | -d |
--name | 容器命名 | --name my-nginx |
-p | 端口映射(宿主:容器) | -p 8080:80 |
-P | 随机端口映射 | -P |
-v | 挂载数据卷 | -v /data:/app |
-e | 设置环境变量 | -e MYSQL_ROOT_PASSWORD=123 |
--restart | 重启策略 | --restart=always |
--network | 指定网络 | --network my-net |
--memory | 内存限制 | --memory=512m |
--cpus | CPU 限制 | --cpus=1.0 |
--rm | 容器退出后自动删除 | --rm |
-it | 交互式终端 | -it ubuntu bash |
--privileged | 特权模式 | --privileged |
重启策略说明:
| 策略 | 说明 |
|---|---|
no | 不自动重启(默认) |
always | 总是重启(包括手动停止后 Docker 重启时) |
unless-stopped | 总是重启,除非手动停止 |
on-failure[:max] | 非正常退出时重启,可设置最大次数 |
9.2 查看容器
# 查看运行中的容器
docker ps
# 查看所有容器(含已停止)
docker ps -a
# 只显示容器 ID
docker ps -q
# 自定义格式输出
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
# 查看最近创建的 3 个容器
docker ps -n 3
9.3 容器生命周期管理
# 启动已停止的容器
docker start my-nginx
# 停止运行中的容器
docker stop my-nginx
# 重启容器
docker restart my-nginx
# 强制终止容器
docker kill my-nginx
# 暂停容器
docker pause my-nginx
# 恢复暂停的容器
docker unpause my-nginx
# 删除已停止的容器
docker rm my-nginx
# 强制删除运行中的容器
docker rm -f my-nginx
# 删除所有已停止的容器
docker container prune
9.4 进入容器
# 方式一:exec(推荐,退出后容器不会停止)
docker exec -it my-nginx /bin/bash
# 方式二:attach(退出后容器会停止,慎用)
docker attach my-nginx
# 方式三:若无 bash,使用 sh
docker exec -it my-nginx /bin/sh
9.5 查看容器日志
# 查看容器日志
docker logs my-nginx
# 实时跟踪日志(类似 tail -f)
docker logs -f my-nginx
# 查看最近 100 行日志
docker logs --tail 100 my-nginx
# 查看指定时间段日志
docker logs --since "2026-05-14T08:00:00" my-nginx
# 查看最近 30 分钟的日志
docker logs --since 30m my-nginx
9.6 容器资源查看
# 查看容器资源占用(实时)
docker stats
# 查看指定容器
docker stats my-nginx
# 只显示一次(不刷新)
docker stats --no-stream
# 查看容器详细信息
docker inspect my-nginx
# 查看容器内进程
docker top my-nginx
# 查看端口映射
docker port my-nginx
9.7 容器与宿主机文件复制
# 从容器复制文件到宿主机
docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf
# 从宿主机复制文件到容器
docker cp ./index.html my-nginx:/usr/share/nginx/html/index.html
9.8 提交容器为镜像
# 将容器修改提交为新镜像
docker commit -m "Add custom config" -a "admin" my-nginx my-nginx:v2
# 查看新镜像
docker images my-nginx
10. Docker 数据管理
10.1 数据卷 (Volume)
创建与管理:
# 创建数据卷
docker volume create my-vol
# 列出所有数据卷
docker volume ls
# 查看数据卷详情
docker volume inspect my-vol
# 删除数据卷
docker volume rm my-vol
# 删除所有未使用的数据卷
docker volume prune
挂载数据卷:
# 方式一:使用 -v 挂载
docker run -d --name my-nginx -v my-vol:/usr/share/nginx/html nginx
# 方式二:使用 --mount 挂载(更明确)
docker run -d --name my-nginx \
--mount source=my-vol,target=/usr/share/nginx/html nginx
10.2 绑定挂载 (Bind Mount)
# 方式一:-v 挂载宿主机目录
docker run -d --name my-nginx \
-v /data/html:/usr/share/nginx/html:ro \
nginx
# 方式二:--mount 挂载(推荐)
docker run -d --name my-nginx \
--mount type=bind,source=/data/html,target=/usr/share/nginx/html,readonly \
nginx
挂载权限说明:
| 选项 | 说明 |
|---|---|
| 默认 | 读写(rw) |
:ro | 只读(read-only) |
:rw | 读写(默认值) |
10.3 Volume vs Bind Mount 对比
| 对比项 | Volume | Bind Mount |
|---|---|---|
| 存储位置 | /var/lib/docker/volumes/ | 宿主机任意目录 |
| 管理方式 | Docker 命令管理 | 需手动管理 |
| 生命周期 | 独立于容器 | 独立于容器 |
| 可移植性 | ✅ 好 | ❌ 依赖宿主机路径 |
| 适用场景 | 持久化数据、共享数据 | 配置文件、代码挂载 |
11. Docker 网络管理
11.1 网络模式
| 模式 | 说明 | 使用场景 |
|---|---|---|
| bridge | 默认模式,容器通过虚拟网桥通信 | 单机多容器通信 |
| host | 容器直接使用宿主机网络 | 需要最高网络性能 |
| none | 容器无网络 | 安全隔离场景 |
| overlay | 跨主机容器通信 | Swarm / 集群场景 |
| macvlan | 容器拥有独立 MAC 地址 | 需要直接接入物理网络 |
11.2 网络管理命令
# 列出所有网络
docker network ls
# 创建自定义网络
docker network create my-net
# 创建指定网段的网络
docker network create --subnet=172.20.0.0/16 --gateway=172.20.0.1 my-net
# 查看网络详情
docker network inspect my-net
# 删除网络
docker network rm my-net
# 清理未使用的网络
docker network prune
11.3 容器加入网络
# 运行时指定网络
docker run -d --name my-nginx --network my-net nginx
# 运行中的容器加入网络
docker network connect my-net my-nginx
# 容器断开网络
docker network disconnect my-net my-nginx
11.4 容器间通信
同一自定义网络中的容器可通过容器名互访:
# 创建网络
docker network create app-net
# 启动多个容器加入同一网络
docker run -d --name redis --network app-net redis:7
docker run -d --name app --network app-net my-app
# app 容器中可通过容器名 redis 访问 Redis
# 如:redis://redis:6379
12. Dockerfile 与镜像构建
12.1 Dockerfile 指令
| 指令 | 说明 | 示例 |
|---|---|---|
FROM | 基础镜像 | FROM python:3.11-slim |
WORKDIR | 设置工作目录 | WORKDIR /app |
COPY | 复制文件到镜像 | COPY . /app |
ADD | 复制文件(支持解压和URL) | ADD app.tar.gz /opt |
RUN | 构建时执行命令 | RUN pip install -r requirements.txt |
ENV | 设置环境变量 | ENV TZ=Asia/Shanghai |
EXPOSE | 声明端口 | EXPOSE 8080 |
CMD | 容器启动默认命令 | CMD ["python", "app.py"] |
ENTRYPOINT | 容器入口点 | ENTRYPOINT ["python"] |
ARG | 构建参数 | ARG VERSION=1.0 |
VOLUME | 声明数据卷 | VOLUME ["/data"] |
USER | 指定运行用户 | USER app |
HEALTHCHECK | 健康检查 | HEALTHCHECK CMD curl -f http://localhost/ |
12.2 Dockerfile 最佳实践
# 1. 使用精简基础镜像
FROM python:3.11-slim AS builder
# 2. 设置工作目录
WORKDIR /app
# 3. 先复制依赖文件(利用缓存层)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 4. 再复制源码(代码变动不影响依赖缓存层)
COPY . .
# 5. 设置环境变量
ENV PYTHONUNBUFFERED=1 \
TZ=Asia/Shanghai
# 6. 声明端口
EXPOSE 8080
# 7. 使用非 root 用户
RUN useradd -m appuser
USER appuser
# 8. 启动命令
CMD ["python", "app.py"]
12.3 构建镜像
# 基本构建
docker build -t my-app:v1.0 .
# 指定 Dockerfile
docker build -f Dockerfile.prod -t my-app:v1.0 .
# 构建时不使用缓存
docker build --no-cache -t my-app:v1.0 .
# 指定构建参数
docker build --build-arg VERSION=2.0 -t my-app:v2.0 .
12.4 多阶段构建
# 阶段一:编译
FROM golang:1.21 AS builder
WORKDIR /src
COPY . .
RUN CGO_ENABLED=0 go build -o /app/myapp
# 阶段二:运行(最终镜像只有编译产物,体积更小)
FROM alpine:3.19
RUN apk add --no-cache ca-certificates tzdata
COPY --from=builder /app/myapp /usr/local/bin/myapp
EXPOSE 8080
CMD ["myapp"]
13. Docker Compose 编排
13.1 安装 Docker Compose
Docker Compose V2 已包含在 docker-compose-plugin 中(前文安装 Docker 时已安装)。
# 验证安装
docker compose version
# 输出示例:Docker Compose version v2.24.5
13.2 compose.yml 文件示例
# compose.yml
version: "3.8"
services:
# Web 应用
web:
image: nginx:1.25-alpine
container_name: my-web
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html:ro
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- api
networks:
- app-net
restart: unless-stopped
# API 服务
api:
build:
context: ./api
dockerfile: Dockerfile
container_name: my-api
ports:
- "3000:3000"
environment:
- DB_HOST=db
- DB_PORT=3306
- DB_NAME=myapp
- DB_USER=root
- DB_PASSWORD=123456
depends_on:
db:
condition: service_healthy
networks:
- app-net
restart: unless-stopped
# MySQL 数据库
db:
image: mysql:8.0
container_name: my-db
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=myapp
volumes:
- db-data:/var/lib/mysql
ports:
- "3306:3306"
networks:
- app-net
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
# 数据卷
volumes:
db-data:
# 网络
networks:
app-net:
driver: bridge
13.3 Docker Compose 常用命令
# 启动所有服务(后台运行)
docker compose up -d
# 启动并重新构建镜像
docker compose up -d --build
# 查看服务状态
docker compose ps
# 查看服务日志
docker compose logs -f
# 查看指定服务日志
docker compose logs -f api
# 进入容器
docker compose exec api /bin/bash
# 停止所有服务
docker compose stop
# 停止并删除所有容器、网络
docker compose down
# 停止并删除所有容器、网络、数据卷
docker compose down -v
# 重启指定服务
docker compose restart api
# 扩容(启动多个实例)
docker compose up -d --scale api=3
14. 常用运维命令速查
14.1 系统管理
| 操作 | 命令 |
|---|---|
| 启动 Docker | systemctl start docker |
| 停止 Docker | systemctl stop docker |
| 重启 Docker | systemctl restart docker |
| 开机自启 | systemctl enable docker |
| 查看状态 | systemctl status docker |
| Docker 信息 | docker info |
| Docker 版本 | docker version |
| 磁盘占用 | docker system df |
| 清理所有无用资源 | docker system prune -a |
14.2 镜像操作
| 操作 | 命令 |
|---|---|
| 搜索镜像 | docker search <关键词> |
| 拉取镜像 | docker pull <镜像名>:<标签> |
| 列出镜像 | docker images |
| 删除镜像 | docker rmi <镜像名>:<标签> |
| 导出镜像 | docker save -o <文件名>.tar <镜像名> |
| 导入镜像 | docker load -i <文件名>.tar |
| 镜像打标签 | docker tag <源镜像> <目标镜像> |
| 推送镜像 | docker push <镜像名> |
| 构建镜像 | docker build -t <镜像名> . |
| 镜像详情 | docker inspect <镜像名> |
| 镜像历史 | docker history <镜像名> |
14.3 容器操作
| 操作 | 命令 |
|---|---|
| 运行容器 | docker run -d --name <名> <镜像> |
| 列出运行中容器 | docker ps |
| 列出所有容器 | docker ps -a |
| 启动容器 | docker start <容器名/ID> |
| 停止容器 | docker stop <容器名/ID> |
| 重启容器 | docker restart <容器名/ID> |
| 删除容器 | docker rm <容器名/ID> |
| 进入容器 | docker exec -it <容器名> /bin/bash |
| 查看日志 | docker logs -f <容器名> |
| 查看资源占用 | docker stats |
| 查看容器详情 | docker inspect <容器名> |
| 复制文件 | docker cp <容器名>:<路径> <宿主路径> |
| 提交为镜像 | docker commit <容器名> <新镜像名> |
14.4 数据卷操作
| 操作 | 命令 |
|---|---|
| 创建数据卷 | docker volume create <卷名> |
| 列出数据卷 | docker volume ls |
| 查看数据卷详情 | docker volume inspect <卷名> |
| 删除数据卷 | docker volume rm <卷名> |
| 清理未用数据卷 | docker volume prune |
14.5 网络操作
| 操作 | 命令 |
|---|---|
| 列出网络 | docker network ls |
| 创建网络 | docker network create <网络名> |
| 查看网络详情 | docker network inspect <网络名> |
| 容器加入网络 | docker network connect <网络名> <容器名> |
| 容器断开网络 | docker network disconnect <网络名> <容器名> |
| 删除网络 | docker network rm <网络名> |
| 清理未用网络 | docker network prune |
15. 常见问题排查
❌ 问题一:docker 命令需要 sudo
原因:当前用户不在 docker 用户组中。
# 将当前用户加入 docker 组
sudo usermod -aG docker $USER
# 刷新组权限(或重新登录)
newgrp docker
# 验证
docker ps
⚠️ 安全提醒:加入 docker 组等效于拥有 root 权限,生产环境需谨慎。
❌ 问题二:镜像拉取超时 / 失败
# 1. 检查网络连通性
ping -c 3 registry-1.docker.io
# 2. 确认镜像加速器配置
cat /etc/docker/daemon.json
# 3. 重启 Docker
systemctl restart docker
# 4. 尝试使用其他镜像源
docker pull registry.cn-hangzhou.aliyuncs.com/library/nginx:latest
# 5. 手动导入离线镜像
docker load -i nginx.tar
❌ 问题三:容器启动后立即退出
# 查看容器退出码
docker ps -a --filter "status=exited"
# 查看退出日志
docker logs <容器名>
# 常见退出码
# 0 - 正常退出(如一次性任务完成)
# 1 - 应用错误
# 137 - OOM 被杀死(内存不足)
# 139 - 段错误(Segmentation Fault)
解决方法:
# 前台运行查看详细报错
docker run -it --rm <镜像名> /bin/bash
# 查看容器退出前最后的日志
docker logs --tail 50 <容器名>
❌ 问题四:容器时间不正确
# 方式一:挂载宿主机时区文件
docker run -d -v /etc/localtime:/etc/localtime:ro nginx
# 方式二:设置环境变量
docker run -d -e TZ=Asia/Shanghai nginx
# 方式三:在 Dockerfile 中设置
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
❌ 问题五:磁盘空间不足
# 查看 Docker 磁盘使用
docker system df
# 输出示例:
# Images 5 1.2GB
# Containers 3 150MB
# Local Volumes 2 500MB
# Build Cache 10 800MB
# 清理无用资源(删除停止的容器、悬空镜像、未用网络)
docker system prune
# 深度清理(包括未被容器使用的镜像和构建缓存)
docker system prune -a
# 只清理构建缓存
docker builder prune
# 设置日志大小限制(在 daemon.json 中)
{
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
❌ 问题六:容器间无法通信
# 1. 检查是否在同一网络
docker network inspect <网络名>
# 2. 确认防火墙未拦截
iptables -L -n | grep DROP
# 3. 测试容器间连通性
docker exec -it <容器A> ping <容器B>
# 4. 注意:默认 bridge 网络不支持容器名解析
# 需使用自定义网络或 --link(已弃用)
docker network create my-net
docker run --network my-net ...
❌ 问题七:端口冲突
# 查看端口占用
ss -tlnp | grep :8080
# 修改映射端口
docker run -p 8081:80 nginx # 改用 8081
# 或停止占用端口的进程
kill -9 <PID>
附录 A:Docker 目录结构
/var/lib/docker/
├── buildkit/ # 构建缓存
├── containers/ # 容器数据
├── image/ # 镜像元数据
├── network/ # 网络配置
├── overlay2/ # 存储驱动数据
├── plugins/ # 插件
├── swarm/ # Swarm 数据
├── tmp/ # 临时文件
├── trust/ # 信任数据
└── volumes/ # 数据卷
附录 B:Docker 常用端口
| 端口 | 服务 | 说明 |
|---|---|---|
| 2375 | Docker Daemon | HTTP 远程 API(非加密) |
| 2376 | Docker Daemon | HTTPS 远程 API(加密) |
| 5000 | Registry | Docker 私有仓库 |
| 9000 | Portainer | 容器管理 UI |
附录 C:卸载 Docker
# CentOS/Rocky
yum remove -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
rm -rf /var/lib/docker /var/lib/containerd /etc/docker
# Ubuntu/Debian
apt purge -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
rm -rf /var/lib/docker /var/lib/containerd /etc/docker
📌 文档维护提示:本文档基于 Docker CE 24.0+ 编写,如需了解 Kubernetes 容器编排,请参阅《Kubernetes 集群部署手册》。如需可视化容器管理界面,推荐部署 Portainer。














暂无评论内容