Docker指南
大约 9 分钟
Docker安装与镜像加速配置简明指南
一、Docker安装流程(CentOS 7+)
# 1. 关闭防火墙与SELinux
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 2. 安装基础依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3. 配置阿里云镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 4. 安装Docker CE
yum install docker-ce -y
# 5. 启动服务
systemctl start docker && systemctl enable docker
# 6. 验证安装
docker --version
二、镜像加速器配置步骤
# 1. 创建配置文件(推荐阿里云加速器)
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://<your-aliyun-mirror>.mirror.aliyuncs.com"]
}
EOF
# 2. 重新加载服务配置
sudo systemctl daemon-reload
# 3. 重启Docker服务
sudo systemctl restart docker
# 4. 验证加速效果
docker pull hello-world
三、操作说明
- 阿里云镜像地址获取
访问阿里云容器镜像服务 → 镜像加速器 → 获取专属加速地址 - 通用镜像源推荐
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com"
]
- 常见问题处理
- 配置文件检查:
sudo docker info | grep Mirrors
- 格式验证:
sudo json_verify < /etc/docker/daemon.json
- 错误日志查看:
journalctl -u docker.service
- 配置文件检查:
Docker核心使用指南
一、Docker基础操作
1. 容器生命周期管理
# 运行容器
docker run -d --name my_nginx -p 8080:80 nginx:latest
# 启动/停止容器
docker start/stop my_nginx
# 删除容器
docker rm -f my_nginx
2. 镜像管理
# 拉取镜像
docker pull ubuntu:22.04
# 查看镜像列表
docker images
# 删除镜像
docker rmi ubuntu:22.04
3. 状态监控
# 查看运行中容器
docker ps
# 查看容器日志
docker logs -f my_nginx
# 查看资源占用
docker stats my_nginx
二、Dockerfile语法详解
1. 核心指令说明
指令 | 功能描述 | 最佳实践示例 |
---|---|---|
FROM | 指定基础镜像 | FROM python:3.9-slim |
WORKDIR | 设置工作目录 | WORKDIR /app |
COPY | 复制本地文件到镜像 | COPY requirements.txt . |
RUN | 执行命令 | RUN pip install -r requirements.txt |
ENV | 设置环境变量 | ENV PYTHONUNBUFFERED=1 |
EXPOSE | 声明容器端口 | EXPOSE 8000 |
CMD | 容器启动命令 | CMD ["gunicorn", "app:app"] |
2. 高级特性
# 多阶段构建示例
FROM node:16 AS build
WORKDIR /app
COPY . .
RUN npm install && npm run build
FROM nginx:alpine
COPY /app/dist /usr/share/nginx/html
三、Dockerfile镜像构建
1. 标准构建流程
# 构建命令(注意最后点号)
docker build -t myapp:v1 .
# 查看构建历史
docker history myapp:v1
# 推送镜像到仓库
docker tag myapp:v1 registry.example.com/myapp:v1
docker push registry.example.com/myapp:v1
2. 构建优化技巧
- 层级优化
# 合并RUN指令减少镜像层
RUN apt-get update && \
apt-get install -y git curl && \
rm -rf /var/lib/apt/lists/*
- 缓存利用
# 优先拷贝不常变化的文件
COPY package.json .
RUN npm install
COPY . .
- 安全增强
# 使用非root用户
RUN groupadd -r appuser && useradd -r -g appuser appuser
USER appuser
四、调试与验证
1. 交互式调试
# 进入容器shell
docker exec -it my_nginx /bin/bash
# 查看文件结构
docker diff my_nginx
# 检查容器配置
docker inspect my_nginx
2. 镜像扫描
# 安全漏洞扫描
docker scan myapp:v1
# 镜像分析
docker image history myapp:v1
最佳实践建议
- 生产环境推荐使用alpine基础镜像
- 每个容器只运行单个进程
- 定期清理无用镜像:
docker system prune -a
- 使用.dockerignore文件排除非必要文件
Docker 数据管理全解
一、数据持久化方案
1. 数据卷(Volume)管理
# 创建命名卷
docker volume create app_data
# 查看所有数据卷
docker volume ls
# 挂载数据卷到容器
docker run -d --name mysql01 -v app_data:/var/lib/mysql mysql:8.0
# 删除未使用数据卷
docker volume prune
2. 绑定挂载(Bind Mount)
# 挂载主机目录到容器
docker run -d --name nginx01 -v /host/path:/container/path nginx
二、数据卷容器实践
1. 创建专用数据容器
# 创建基础数据容器
docker create --name data_container -v /data busybox
# 其他容器共享数据卷
docker run --volumes-from data_container --name app01 -d nginx
2. 数据共享验证
# 在数据容器中写入测试文件
docker exec data_container sh -c "echo 'test' > /data/test.txt"
# 在应用容器中查看文件
docker exec app01 cat /data/test.txt
三、数据备份与恢复
1. 完整备份流程
# 创建备份容器
docker run --rm --volumes-from data_container -v $(pwd):/backup busybox \
tar cvf /backup/backup.tar /data
# 解释参数:
# --rm : 执行后自动删除容器
# --volumes-from : 关联数据卷容器
# -v : 挂载备份存储目录
2. 数据恢复操作
# 创建新数据容器
docker create --name new_data_container -v /data busybox
# 执行恢复操作
docker run --rm --volumes-from new_data_container -v $(pwd):/backup busybox \
tar xvf /backup/backup.tar
四、高级数据管理技巧
1. 数据迁移方案
# 跨主机数据迁移
docker run --rm -v source_volume:/from alpine ash -c \
"cd /from && tar -cf - ." | ssh user@host "docker run --rm -i -v target_volume:/to alpine ash -c 'cd /to && tar -xpvf -'"
2. 数据卷监控
# 查看数据卷使用情况
docker system df -v
# 检查具体数据卷详情
docker inspect volume app_data
五、关键注意事项
- 数据生命周期
- 数据卷独立于容器存在
- 删除容器时需加
-v
参数才会删除关联卷
- 权限管理
# 指定挂载目录权限
docker run -v dbdata:/data/db:ro postgres
- 备份策略
- 推荐采用
cron
定时任务执行备份 - 重要数据建议使用云存储双重备份
- 推荐采用
- 灾难恢复
# 从备份文件快速重建
docker volume create restored_volume
docker run --rm -v restored_volume:/target -v $(pwd):/backup busybox \
tar xf /backup/backup.tar -C /target
最佳实践建议
- 生产环境优先使用命名卷而非绑定挂载
- 敏感数据避免直接存储在数据卷中
- 定期执行
docker volume inspect
检查数据完整性- 结合
docker-compose
实现数据卷的声明式管理
Docker 容器网络与互联指南
一、容器网络模式详解
1. 核心网络模式对比
模式 | 描述 | 适用场景 |
---|---|---|
bridge | 默认模式,创建独立网络命名空间,通过docker0网桥通信 | 单机多容器通信 |
host | 直接使用宿主机网络栈,无网络隔离 | 高性能网络需求 |
none | 禁用所有网络接口,仅保留lo回环接口 | 特殊安全场景 |
container | 共享其他容器的网络命名空间 | 容器间紧密通信 |
自定义 | 用户创建的自定义桥接网络,支持DNS解析和网络策略 | 复杂多容器应用 |
2. 网络模式切换示例
# 使用host模式运行容器
docker run -d --network host nginx
# 共享已有容器网络
docker run -d --network container:web_app redis
二、容器互联方案
1. 传统链接方式(已逐渐淘汰)
# 创建主容器
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0
# 创建关联容器
docker run -d --name webapp --link mysql:db nginx
2. 自定义网络互联(推荐方案)
# 创建自定义网络
docker network create my_network
# 将容器加入同一网络
docker run -d --name mysql --network my_network mysql:8.0
docker run -d --name webapp --network my_network nginx
三、网络配置实践
1. 自定义桥接网络
# 创建带子网的自定义网络
docker network create \
--driver bridge \
--subnet 172.28.0.0/16 \
--gateway 172.28.5.1 \
my-bridge-network
# 查看网络详情
docker network inspect my-bridge-network
2. 端口映射管理
# 随机端口映射
docker run -d -p 80 nginx
# 指定端口映射
docker run -d -p 8080:80 nginx
# 查看端口映射
docker port <container_id>
四、多容器应用实战
1. WordPress + MySQL 部署
# 创建专用网络
docker network create wp_network
# 启动数据库容器
docker run -d --name wp_db \
--network wp_network \
-e MYSQL_ROOT_PASSWORD=secret \
mysql:8.0
# 启动WordPress容器
docker run -d --name wp_app \
--network wp_network \
-p 8080:80 \
wordpress:latest
2. 网络连通性测试
# 进入应用容器测试数据库连接
docker exec -it wp_app bash
curl mysql:3306
telnet wp_db 3306
五、高级网络技巧
1. DNS解析配置
# 自定义DNS服务器
docker run --dns 8.8.8.8 --dns 114.114.114.114 nginx
# 查看容器DNS配置
docker exec <container_id> cat /etc/resolv.conf
2. 网络限速配置
# 限制容器网络带宽
docker run -d \
--name rate-limited \
--network my_network \
--blkio-weight 300 \
nginx
六、网络排错指南
1. 常用诊断命令
# 查看容器IP地址
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_id>
# 跟踪容器网络请求
docker exec <container_id> tcpdump -i eth0
2. 常见问题处理
问题现象:容器间无法通信
解决方案:
- 检查容器是否在同一网络
- 验证防火墙规则:
iptables -L -n
- 测试基础连通性:
docker exec <container> ping <target_ip>
最佳实践建议
- 生产环境推荐使用自定义桥接网络
- 避免使用已弃用的--link参数
- 跨主机通信建议使用overlay网络驱动
- 定期清理未使用网络:
docker network prune
Docker 资源配额管理指南
一、核心资源限制类型
1. CPU 资源分配
# 限制容器最多使用1个CPU核心
docker run -d --cpus=1 --name cpu_limited nginx
# 按权重分配CPU资源(默认1024)
docker run -d --cpu-shares=512 --name low_priority_app nginx
2. 内存资源限制
# 硬性内存限制(容器不能超过)
docker run -d -m 512m --name mem_limited redis
# 内存+Swap限制(总占用不超过1G)
docker run -d -m 512m --memory-swap=1g --name swap_limited python
3. 磁盘I/O控制
# 限制读写速度(单位:字节/秒)
docker run -d \
--device-read-bps /dev/sda:1mb \
--device-write-bps /dev/sda:500kb \
--name io_limited nginx
二、资源配额配置表
资源类型 | 参数 | 示例值 | 说明 |
---|---|---|---|
CPU | --cpus | 2.5 | 最多使用2.5个CPU核心 |
--cpu-shares | 1024 | CPU时间片分配权重 | |
内存 | -m / --memory | 1g | 最大物理内存限制 |
--memory-swap | 2g | 物理内存+Swap总限制 | |
磁盘IO | --blkio-weight | 500 | 块设备IO权重(10-1000) |
--device-read-iops | /dev/sda:100 | 设备读取IOPS限制 |
三、高级资源控制
1. CPU绑定核心
# 指定容器只能使用第0和第1个CPU核心
docker run -d --cpuset-cpus=0,1 --name cpu_pinned mysql
2. OOM优先级调整
# 设置OOM终止优先级(-1000到1000)
docker run -d --oom-kill-disable --name no_oom_kill redis
3. 进程数限制
# 限制容器最大进程数
docker run -d --pids-limit=100 --name process_limited nodejs
四、资源监控与调优
1. 实时监控命令
# 查看容器资源使用情况
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
# 输出示例:
# NAME CPU % MEM USAGE
# mem_limited 0.50% 512MiB / 512MiB
2. 资源限制调整
# 动态更新运行中容器的内存限制
docker update --memory=768m mem_limited
3. 压力测试工具
# 使用stress测试CPU限制
docker run -it --rm --cpus=2 polinux/stress-ng --cpu 4 --timeout 60s
五、GPU资源管理
# NVIDIA GPU支持(需安装nvidia-docker)
docker run -d --gpus all --name gpu_app nvcr.io/nvidia/pytorch:22.04-py3
# 指定使用特定GPU
docker run -d --gpus '"device=0,1"' --name multi_gpu_app tensorflow
六、关键注意事项
- 内存限制设置原则
- 必须设置
--memory-swap
才能启用Swap限制 - 物理内存限制建议设为总内存的80%
- 必须设置
- OOM Killer机制
- 默认允许OOM终止容器进程
- 使用
--oom-kill-disable
需配合严格内存限制
- 生产环境建议
# 推荐组合参数
docker run -d \
--cpus=2 \
-m 4g \
--memory-swap=4g \
--blkio-weight=300 \
--restart=on-failure \
nginx
最佳实践建议
- 所有生产容器必须设置资源限制
- 开发环境可使用
--memory-reservation
设置软限制- 定期使用
docker stats
监控资源使用趋势- 结合cAdvisor实现可视化资源监控