跳至主要內容

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

三、操作说明

  1. 阿里云镜像地址获取
    访问阿里云容器镜像服务open in new window → 镜像加速器 → 获取专属加速地址
  2. 通用镜像源推荐
"registry-mirrors": [
  "https://docker.mirrors.ustc.edu.cn",
  "https://hub-mirror.c.163.com"
]
  1. 常见问题处理
    • 配置文件检查: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 --from=build /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. 构建优化技巧

  1. 层级优化
# 合并RUN指令减少镜像层
RUN apt-get update && \
    apt-get install -y git curl && \
    rm -rf /var/lib/apt/lists/*
  1. 缓存利用
# 优先拷贝不常变化的文件
COPY package.json .
RUN npm install
COPY . .
  1. 安全增强
# 使用非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

最佳实践建议

  1. 生产环境推荐使用alpine基础镜像
  2. 每个容器只运行单个进程
  3. 定期清理无用镜像:docker system prune -a
  4. 使用.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

五、关键注意事项

  1. 数据生命周期
    • 数据卷独立于容器存在
    • 删除容器时需加-v参数才会删除关联卷
  2. 权限管理
# 指定挂载目录权限
docker run -v dbdata:/data/db:ro postgres
  1. 备份策略
    • 推荐采用cron定时任务执行备份
    • 重要数据建议使用云存储双重备份
  2. 灾难恢复
# 从备份文件快速重建
docker volume create restored_volume
docker run --rm -v restored_volume:/target -v $(pwd):/backup busybox \
tar xf /backup/backup.tar -C /target

最佳实践建议

  1. 生产环境优先使用命名卷而非绑定挂载
  2. 敏感数据避免直接存储在数据卷中
  3. 定期执行docker volume inspect检查数据完整性
  4. 结合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. 常见问题处理

问题现象:容器间无法通信
解决方案

  1. 检查容器是否在同一网络
  2. 验证防火墙规则:iptables -L -n
  3. 测试基础连通性:docker exec <container> ping <target_ip>

最佳实践建议

  1. 生产环境推荐使用自定义桥接网络
  2. 避免使用已弃用的--link参数
  3. 跨主机通信建议使用overlay网络驱动
  4. 定期清理未使用网络: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--cpus2.5最多使用2.5个CPU核心
--cpu-shares1024CPU时间片分配权重
内存-m / --memory1g最大物理内存限制
--memory-swap2g物理内存+Swap总限制
磁盘IO--blkio-weight500块设备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

六、关键注意事项

  1. 内存限制设置原则
    • 必须设置--memory-swap才能启用Swap限制
    • 物理内存限制建议设为总内存的80%
  2. OOM Killer机制
    • 默认允许OOM终止容器进程
    • 使用--oom-kill-disable需配合严格内存限制
  3. 生产环境建议
# 推荐组合参数
docker run -d \
  --cpus=2 \
  -m 4g \
  --memory-swap=4g \
  --blkio-weight=300 \
  --restart=on-failure \
  nginx

最佳实践建议

  1. 所有生产容器必须设置资源限制
  2. 开发环境可使用--memory-reservation设置软限制
  3. 定期使用docker stats监控资源使用趋势
  4. 结合cAdvisor实现可视化资源监控