Docker 工作实用手册(安装 · 部署 · 运维)
定位:可直接用于工作的 Docker 笔记
原则:
- 不讲概念、不讲历史
- 只记录「常用」「核心」「能提升效率和稳定性」的内容
- 适合内网 / 生产 / 长期维护
一、Docker 安装(生产常用)
1.1 Linux 安装 Docker
# 基础依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加 Docker 仓库(有外网)
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装
yum install -y docker-ce docker-ce-cli containerd.io
# 启动并设置开机自启
systemctl start docker
systemctl enable docker
1.2 修改 Docker 数据目录(强烈建议)
作用说明(为什么必须改)
Docker 数据目录默认位于:
/var/lib/docker
该目录会存放:
- 所有镜像(image)
- 所有容器数据(container)
- 容器日志
- volume 元数据
在生产或长期使用场景下,如果不修改,会带来以下问题:
问题 1:系统盘被快速打满(最常见)
/var通常在系统盘- 镜像、日志、volume 会持续增长
- 磁盘满 = Docker 全部异常
一旦出现:
- 无法启动新容器
- 已有容器异常退出
- 系统服务异常
问题 2:系统与业务数据混在一起,不可维护
默认结构:
/
├── /var/lib/docker # Docker 数据
├── /var/log # 系统日志
问题:
- Docker 数据和系统数据耦合
- 迁移、备份、扩容都非常困难
问题 3:磁盘扩容/迁移成本极高
- 系统盘通常难扩容
- 一旦 Docker 数据量大,只能:
- 停机
- 整盘迁移
正确做法(生产通用)
将 Docker 数据目录统一放到独立数据盘:
/data/docker
好处:
- 系统盘与业务盘解耦
- 数据盘可单独扩容
- 便于备份和迁移
- 降低系统故障风险
实际修改步骤
systemctl stop docker
mkdir -p /data/docker
vim /etc/docker/daemon.json
{
"data-root": "/data/docker",
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
systemctl daemon-reload
systemctl start docker
工作经验总结(建议写进规范)
- 新服务器第一步就改
- 永远不要让 Docker 数据进系统盘
/data统一作为业务与容器数据根目录
二、镜像管理(效率 & 离线)
2.1 常用命令
docker images
docker pull nginx:1.24
docker rmi nginx:1.24
2.2 离线环境(必备)
# 导出多个镜像
docker save nginx:1.24 php:8.2-fpm -o images.tar
# 导入镜像
docker load -i images.tar
2.3 镜像清理(释放磁盘)
docker image prune
docker system prune
三、容器运行(docker run 核心用法)
3.1 通用运行模板
docker run -d \
--name app-name \
--restart always \
-p 8080:80 \
-v /data/app:/app \
-e TZ=Asia/Shanghai \
image:tag
3.2 容器运行参数分类与说明
1. 基本控制参数
| 参数 | 作用 | 建议/注意事项 |
|---|---|---|
--name <container> | 给容器指定名字 | 固定名字便于管理、监控、排障 |
-d / --detach | 后台运行容器 | 生产环境必用,调试可忽略 |
--restart <policy> | 容器重启策略 | always 或 unless-stopped,确保服务自恢复 |
-e KEY=VALUE | 设置环境变量 | 必须统一时区、数据库密码等配置 |
-p <host>:<container> | 端口映射 | 明确映射,避免冲突,便于防火墙配置 |
2. 数据与卷挂载参数
| 参数 | 作用 | 建议 |
|---|---|---|
-v /host/path:/container/path | 宿主机目录挂载 | 所有重要数据、配置和日志必须挂载 |
--mount type=volume,... | Docker volume 挂载 | 适合容器内部管理数据,便于跨主机迁移 |
--tmpfs /container/path | 内存临时挂载 | 临时数据或缓存,避免频繁磁盘 I/O |
3. 资源限制参数
| 参数 | 作用 | 建议 |
|---|---|---|
--memory | 限制容器内存 | 避免单个容器占满宿主机内存 |
--cpus | 限制容器 CPU 使用 | 控制资源占用,保证多容器稳定 |
--ulimit | 调整文件描述符或进程限制 | 高并发服务必备,避免超限崩溃 |
4. 网络与主机参数
| 参数 | 作用 | 建议 |
|---|---|---|
--network | 指定容器网络 | 使用自定义 bridge,服务名作为主机名 |
--link | 旧版容器间连接 | 已不推荐,用 network 替代 |
--hostname | 设置容器主机名 | 部分应用依赖 hostname,可固定 |
5. 日志与调试参数
| 参数 | 作用 | 建议 |
|---|---|---|
--log-driver | 指定日志驱动 | 推荐 json-file 并设置 max-size/max-file |
--log-opt | 日志选项 | 控制日志滚动,避免磁盘满 |
-it | 交互模式,附终端 | 调试或临时容器使用,不适合生产长期运行 |
6. 其他重要参数
| 参数 | 作用 | 建议 |
|---|---|---|
--privileged | 赋予容器额外权限 | 仅特殊场景使用,安全风险高 |
--cap-add / --cap-drop | 精细权限控制 | 用于限制容器能力,增强安全 |
--rm | 容器退出自动删除 | 临时容器可用,生产服务不要用 |
3.3 总结与实战建议
- 固定名字与端口,方便运维、监控和排障
- 重启策略必选,保证容器异常退出自恢复
- 数据挂载宿主机,保证可重建、持久化
- 明确版本,禁止使用
latest - 资源限制和日志滚动,保证宿主机性能与稳定
- 网络规划统一,服务名即主机名,避免混乱
掌握这些参数,Docker 容器就能达到稳定、高效、可维护的生产运行状态。
强烈建议使用的参数:
--restart always- 明确
--name - 固定
tag,禁止latest
四、数据挂载(工作中最关键)
4.1 绑定宿主机目录(推荐)
-v /host/path:/container/path
建议目录规范:
/data/app/
├── code/
├── logs/
├── conf/
└── data/
五、Dockerfile(只写常用)
5.1 PHP 实用模板
FROM php:8.2-fpm
RUN docker-php-ext-install pdo_mysql
WORKDIR /var/www/html
5.2 构建
docker build -t my-php:8.2 .
六、Docker Compose(生产必用)
6.1 标准模板(PHP + Nginx)
version: '3.9'
services:
php:
image: my-php:8.2
container_name: app-php
restart: always
volumes:
- /data/app/code:/var/www/html
nginx:
image: nginx:1.24
container_name: app-nginx
restart: always
ports:
- "8080:80"
volumes:
- /data/app/code:/var/www/html
- /data/app/conf/nginx.conf:/etc/nginx/nginx.conf
depends_on:
- php
6.2 常用命令
docker-compose up -d
docker-compose down
docker-compose ps
docker-compose logs -f
七、网络(只记实用规则)
- Compose 中 服务名 = 主机名
- 不使用 IP 访问容器
php -> http://nginx
八、权限与 UID(高频问题)
8.1 现象
- 宿主机文件 UID = 1000
- 容器内用户 = www-data (33)
8.2 解决方式
docker run -u 1000:1000 image
或 Dockerfile 内统一 UID。
九、日志与排障
9.1 查看日志
docker logs container
docker-compose logs -f
9.2 常见问题速查
| 问题 | 排查点 |
|---|---|
| 启动即退出 | docker logs |
| 端口不通 | -p / 防火墙 |
| 文件无权限 | UID / volume |
十、性能与稳定性建议
10.1 资源限制
deploy:
resources:
limits:
memory: 512M
10.2 镜像优化
- 避免 latest
- 定期清理
- 不在容器中写日志到 stdout 过大
十一、强烈推荐的工作习惯
- 一个服务一个 compose
- 所有配置、日志、数据都挂载
- 任何容器都能 rm + up 重建
- 所有命令可脚本化
本文档是:
- Docker 工作速查表
- 内网/生产环境实践总结
- 可持续扩展的个人文档
十二、Docker「标准化模板」合集(直接复制用)
12.1 PHP 项目标准目录 + docker-compose
目录规范(推荐)
/data/php-app/
├── code/ # PHP 代码
├── conf/
│ ├── nginx.conf
│ └── php.ini
├── logs/
│ ├── nginx/
│ └── php/
├── data/ # 业务数据
└── docker-compose.yml
docker-compose.yml(生产可用)
version: '3.9'
services:
php:
image: php:8.2-fpm
container_name: php-app-php
restart: always
volumes:
- ./code:/var/www/html
- ./conf/php.ini:/usr/local/etc/php/php.ini
- ./logs/php:/var/log/php
nginx:
image: nginx:1.24
container_name: php-app-nginx
restart: always
ports:
- "8080:80"
volumes:
- ./code:/var/www/html
- ./conf/nginx.conf:/etc/nginx/nginx.conf
- ./logs/nginx:/var/log/nginx
depends_on:
- php
12.2 Python 服务模板(API / 脚本服务)
Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]
docker-compose.yml
version: '3.9'
services:
python-app:
image: python-app:1.0
container_name: python-app
restart: always
volumes:
- ./app:/app
12.3 通用 Web 服务模板(前后端/二进制)
version: '3.9'
services:
web:
image: app-image:1.0
container_name: web-app
restart: always
ports:
- "9000:9000"
volumes:
- ./conf:/app/conf
- ./logs:/app/logs
十三、内网 / 无外网专项
13.1 Docker 离线安装完整流程
# 有网机器下载
yum install -y docker-ce docker-ce-cli containerd.io
# 拷贝 /var/cache/yum 到内网
# 内网安装
yum install -y *.rpm
13.2 镜像离线管理
# 导出
docker save nginx:1.24 php:8.2-fpm -o base-images.tar
# 导入
docker load -i base-images.tar
13.3 镜像版本管理策略(推荐)
- 禁止使用
latest - 统一语义版本
nginx:1.24.0
php:8.2.10
app:1.3.5
13.4 内网 registry 是否有必要?
结论:
- 镜像 >10 个 / 多台服务器 → 有必要
- 少量服务器 →
docker save/load更简单
最简 registry 部署
docker run -d \
--name registry \
-p 5000:5000 \
-v /data/registry:/var/lib/registry \
registry:2
十四、自动化 & 运维效率
14.1 Shell 一键部署脚本
#!/bin/bash
cd /data/php-app || exit
docker-compose pull
docker-compose up -d
14.2 Python 自动部署(示意)
import subprocess
subprocess.run(["docker-compose", "up", "-d"], check=True)
14.3 Webhook + docker-compose 更新
流程:
- Webhook 接收请求
- git pull
- docker-compose up -d
14.4 零停机“准生产”更新方案
- 多容器副本
- 滚动重启
docker-compose up -d --no-deps --scale web=2
docker-compose restart web
十五、性能 & 稳定性进阶(经验总结)
15.1 容器日志防止打满磁盘
已在 daemon.json 中设置:
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
15.2 MySQL / PHP / Redis 常用参数建议
MySQL
- 数据目录必须挂载
- 禁用不必要组件
command: --max-connections=500 --character-set-server=utf8mb4
PHP
- 调整 memory_limit
- 关闭 display_errors
Redis
- 必须开启持久化
appendonly yes
15.3 宿主机配置建议(非常重要)
- 磁盘空间充足(日志 + volume)
- 禁用 swap 或限制使用
- 文件描述符调大
ulimit -n 65535
本章节内容可作为:
- 新项目模板库
- 内网 Docker 标准
- 运维操作参考手册