Skip to main content

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>容器重启策略alwaysunless-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 总结与实战建议

  1. 固定名字与端口,方便运维、监控和排障
  2. 重启策略必选,保证容器异常退出自恢复
  3. 数据挂载宿主机,保证可重建、持久化
  4. 明确版本,禁止使用 latest
  5. 资源限制和日志滚动,保证宿主机性能与稳定
  6. 网络规划统一,服务名即主机名,避免混乱

掌握这些参数,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 更新

流程:

  1. Webhook 接收请求
  2. git pull
  3. 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 标准
  • 运维操作参考手册