1. Docker 在 CentOS 上的完整安装指南
作为容器化技术的标杆,Docker 已经成为现代应用部署的标准配置。在 CentOS 这个企业级 Linux 发行版上部署 Docker,需要考虑系统兼容性、存储驱动选择、权限管理等实际问题。本文将基于最新的 CentOS 7/8 系统,手把手带你完成 Docker 的完整安装与基础配置。
提示:本文所有命令均以 root 用户执行,普通用户请使用 sudo 提权。建议在操作前使用
yum update更新系统到最新状态。
1.1 环境准备与依赖检查
在开始安装前,我们需要确认系统环境满足 Docker 的运行要求:
# 检查内核版本(需3.10以上) uname -r # 检查存储驱动(推荐overlay2) lsmod | grep overlay # 检查cgroups是否启用 grep cgroup /proc/filesystems对于 CentOS 7 用户,需要确保系统已启用extras仓库:
yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --enable extrasCentOS 8 用户则需要配置 PowerTools 仓库:
dnf install -y dnf-plugins-core dnf config-manager --set-enabled PowerTools1.2 官方仓库安装 Docker CE
推荐使用 Docker 官方仓库进行安装,确保获取最新稳定版本:
# 添加Docker官方仓库 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装Docker引擎 yum install -y docker-ce docker-ce-cli containerd.io # 启动Docker服务 systemctl enable --now docker验证安装是否成功:
docker version docker run hello-world如果看到 "Hello from Docker!" 的输出,说明基础环境已就绪。
2. 存储驱动与网络配置优化
2.1 存储驱动选择与配置
CentOS 默认使用devicemapper驱动,但在生产环境推荐overlay2。修改/etc/docker/daemon.json:
{ "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ] }然后重启服务:
systemctl restart docker验证驱动变更:
docker info | grep "Storage Driver"2.2 网络与防火墙配置
CentOS 的 firewalld 可能会影响容器网络,建议添加以下规则:
firewall-cmd --permanent --zone=public --add-masquerade firewall-cmd --permanent --zone=public --add-port=2376/tcp firewall-cmd --permanent --zone=public --add-port=2377/tcp firewall-cmd --permanent --zone=public --add-port=7946/tcp firewall-cmd --permanent --zone=public --add-port=7946/udp firewall-cmd --permanent --zone=public --add-port=4789/udp firewall-cmd --reload对于需要固定IP的场景,可以创建自定义网络:
docker network create --subnet=172.20.0.0/16 mynet3. 国内镜像加速与常用配置
3.1 配置国内镜像源
修改/etc/docker/daemon.json添加镜像加速器:
{ "registry-mirrors": [ "https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn" ], "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "data-root": "/var/lib/docker" }重载配置:
systemctl daemon-reload systemctl restart docker3.2 用户权限管理
将普通用户加入 docker 组以获取权限:
usermod -aG docker your_username警告:docker 组权限等同于 root,生产环境建议结合 sudo 精细控制。
4. 常见问题排查指南
4.1 虚拟化支持问题
如果遇到 "Virtualization support not detected" 错误:
- 检查 BIOS 中 VT-x/AMD-v 是否启用
- 确认内核模块已加载:
lsmod | grep kvm - 对于嵌套虚拟化:
cat /sys/module/kvm_intel/parameters/nested
4.2 存储空间不足处理
Docker 默认使用/var/lib/docker目录,空间不足时可以迁移:
systemctl stop docker rsync -avz /var/lib/docker /new/path/ mv /var/lib/docker /var/lib/docker.bak ln -s /new/path/docker /var/lib/docker systemctl start docker4.3 容器时区同步
解决容器内时区不一致问题:
# 运行容器时挂载时区文件 docker run -v /etc/localtime:/etc/localtime:ro ... # 或在Dockerfile中添加 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime5. 生产环境最佳实践
5.1 资源限制与监控
启动容器时设置资源限制:
docker run -it --cpus="1.5" --memory="2g" --memory-swap="3g" ...使用 cAdvisor 监控资源使用:
docker run -d \ --name=cadvisor \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:ro \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --publish=8080:8080 \ google/cadvisor:latest5.2 日志管理方案
配置日志轮转和集中收集:
# 单个容器日志限制 docker run --log-opt max-size=50m --log-opt max-file=3 ... # 全局日志配置(/etc/docker/daemon.json) { "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" } }对于生产环境,建议使用 ELK 或 Loki 等日志系统集中管理。
5.3 安全加固措施
启用用户命名空间隔离:
echo "dockremap:165536:65536" >> /etc/subuid echo "dockremap:165536:65536" >> /etc/subgid然后在
/etc/docker/daemon.json添加:{ "userns-remap": "dockremap" }禁用特权容器:
docker run --security-opt=no-new-privileges ...定期扫描镜像漏洞:
docker scan your-image
6. 常用工具与扩展组件
6.1 Docker Compose 安装
对于 CentOS 7:
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-composeCentOS 8 可直接通过 pip 安装:
dnf install -y python3-pip pip3 install docker-compose6.2 可视化管理工具
安装 Portainer 管理界面:
docker volume create portainer_data docker run -d -p 9000:9000 \ --name=portainer \ --restart=always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ portainer/portainer-ce6.3 构建优化工具
使用 BuildKit 提升构建效率:
export DOCKER_BUILDKIT=1 # 或在/etc/docker/daemon.json中添加 { "features": { "buildkit": true } }多阶段构建示例:
FROM golang:1.16 AS builder WORKDIR /app COPY . . RUN go build -o myapp . FROM alpine:latest COPY --from=builder /app/myapp /usr/local/bin/myapp CMD ["myapp"]7. 系统服务集成与维护
7.1 系统启动项优化
调整 Docker 服务启动顺序:
systemctl enable docker systemctl list-dependencies docker7.2 定期维护任务
清理无用资源:
docker system prune -f docker volume prune -f镜像仓库垃圾回收:
docker exec registry /bin/registry garbage-collect /etc/docker/registry/config.yml健康检查脚本示例:
#!/bin/bash if ! docker ps > /dev/null 2>&1; then systemctl restart docker fi
7.3 备份与恢复策略
容器配置备份:
docker inspect <container> > container_backup.json数据卷备份:
docker run --rm --volumes-from <container> -v $(pwd):/backup alpine \ tar cvf /backup/backup.tar /volume/path完整镜像导出:
docker save -o myimages.tar image1 image2
8. 性能调优实战技巧
8.1 文件系统优化
对于高性能场景,建议使用 xfs 文件系统:
# 创建xfs文件系统 mkfs.xfs -f /dev/sdb1 mkdir -p /var/lib/docker mount -o pquota /dev/sdb1 /var/lib/docker在/etc/fstab中添加:
/dev/sdb1 /var/lib/docker xfs defaults,pquota 0 08.2 内核参数调整
优化/etc/sysctl.conf:
# 容器网络性能优化 net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.ip_local_port_range = 1024 65000 # 内存与交换分区 vm.swappiness = 10 vm.overcommit_memory = 1 # 文件系统 fs.file-max = 1000000 fs.inotify.max_user_instances = 8192应用配置:
sysctl -p8.3 容器运行时优化
使用
--oom-kill-disable谨慎控制内存:docker run -m 2g --oom-kill-disable ...调整 CPU 调度策略:
docker run --cpus="2" --cpu-shares=512 ...禁用 swap 以提高性能:
docker run --memory-swappiness=0 ...
9. 典型应用部署示例
9.1 Nextcloud 私有云部署
使用 Docker Compose 快速部署:
version: '3' services: db: image: mariadb:10.5 command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW volumes: - db_data:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=nextcloud - MYSQL_PASSWORD=nextcloud - MYSQL_DATABASE=nextcloud - MYSQL_USER=nextcloud app: image: nextcloud:latest ports: - 8080:80 volumes: - nextcloud_data:/var/www/html depends_on: - db environment: - MYSQL_HOST=db - MYSQL_USER=nextcloud - MYSQL_PASSWORD=nextcloud - MYSQL_DATABASE=nextcloud volumes: db_data: nextcloud_data:启动服务:
docker-compose up -d9.2 EMQX MQTT 服务器部署
生产环境配置示例:
docker run -d --name emqx \ -p 1883:1883 -p 8083:8083 -p 8883:8883 \ -p 8084:8084 -p 18083:18083 \ -v /etc/emqx/emqx.conf:/etc/emqx/emqx.conf \ -v /var/lib/emqx/data:/var/lib/emqx/data \ -v /var/log/emqx:/var/log/emqx \ --restart always \ emqx/emqx:latest10. 升级与版本管理
10.1 Docker 版本升级
CentOS 7 升级步骤:
yum remove docker-ce docker-ce-cli containerd.io yum install -y docker-ce docker-ce-cli containerd.io systemctl restart dockerCentOS 8 升级方法:
dnf upgrade docker-ce docker-ce-cli containerd.io10.2 容器数据迁移方案
提交容器为镜像:
docker commit <container> myimage docker save myimage > myimage.tar使用 volume 备份:
docker run --rm --volumes-from <container> -v $(pwd):/backup busybox \ tar cvf /backup/volume.tar /data完整迁移示例:
# 源主机 docker save myapp | gzip > myapp.tar.gz scp myapp.tar.gz user@newhost:/tmp/ # 目标主机 gunzip -c /tmp/myapp.tar.gz | docker load
11. 企业级扩展方案
11.1 Docker Swarm 集群部署
初始化 Swarm 集群:
docker swarm init --advertise-addr <MANAGER_IP>添加工作节点:
docker swarm join --token <TOKEN> <MANAGER_IP>:2377部署服务示例:
docker service create --name web --replicas 3 -p 80:80 nginx11.2 私有镜像仓库搭建
部署 Harbor 私有仓库:
docker-compose -f harbor.yml up -d客户端配置:
# /etc/docker/daemon.json { "insecure-registries" : ["harbor.yourdomain.com"] }登录仓库:
docker login harbor.yourdomain.com12. 故障诊断工具箱
12.1 日志收集与分析
查看 Docker 守护进程日志:
journalctl -u docker -f容器日志导出:
docker logs <container> > container.log 2>&1使用
dive分析镜像层:docker run --rm -it wagoodman/dive:latest <image>
12.2 网络诊断技巧
检查容器网络:
docker exec -it <container> ip a测试端口连通性:
docker run --rm -it alpine nc -zv <host> <port>抓包分析:
docker run --rm -it --net container:<container> nicolaka/netshoot tcpdump -i eth0 -w /tmp/capture.pcap
13. 安全加固深度实践
13.1 容器运行时保护
启用 seccomp 配置文件:
docker run --security-opt seccomp=/path/to/profile.json ...应用 AppArmor 策略:
docker run --security-opt apparmor=docker-default ...限制系统调用:
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE ...
13.2 镜像安全扫描
使用 Trivy 扫描漏洞:
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \ aquasec/trivy image your-image构建时扫描:
docker build --security-opt=no-new-privileges --label=com.docker.scan.enabled=true .14. 监控与告警体系
14.1 Prometheus 监控方案
配置 Docker 指标暴露:
# /etc/docker/daemon.json { "metrics-addr" : "0.0.0.0:9323", "experimental" : true }Prometheus 配置示例:
scrape_configs: - job_name: 'docker' static_configs: - targets: ['docker-host:9323']14.2 告警规则配置
监控容器内存使用:
groups: - name: docker-alerts rules: - alert: ContainerMemoryUsage expr: (container_memory_usage_bytes{name!=""} / container_spec_memory_limit_bytes{name!=""}) > 0.9 for: 5m labels: severity: warning annotations: summary: "High memory usage in container {{ $labels.name }}"15. 持续集成与交付
15.1 GitLab CI 集成示例
.gitlab-ci.yml配置:
stages: - build - test - deploy build_image: stage: build script: - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA . - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA deploy_prod: stage: deploy script: - docker-compose -f docker-compose.prod.yml up -d when: manual only: - master15.2 多环境部署策略
使用 Docker Stack 管理多环境:
# 生产环境部署 docker stack deploy -c docker-compose.prod.yml myapp # 预发布环境 docker stack deploy -c docker-compose.staging.yml myapp-staging16. 高级网络模式实战
16.1 Macvlan 网络配置
创建物理网络直通:
docker network create -d macvlan \ --subnet=192.168.1.0/24 \ --gateway=192.168.1.1 \ -o parent=eth0 \ macvlan_net运行容器:
docker run --net=macvlan_net --ip=192.168.1.100 ...16.2 IPv6 支持配置
启用 Docker IPv6:
{ "ipv6": true, "fixed-cidr-v6": "2001:db8:1::/64" }创建 IPv6 网络:
docker network create --ipv6 --subnet=2001:db8:1::/64 ipv6_net17. 多架构镜像支持
17.1 构建多平台镜像
使用 buildx 创建跨平台镜像:
docker buildx create --use docker buildx build --platform linux/amd64,linux/arm64 -t your-image .17.2 运行 ARM 容器
在 x86 主机运行 ARM 容器:
docker run --platform linux/arm64 arm64v8/alpine18. 容器化传统应用
18.1 迁移物理机应用到容器
分析现有应用:
ldd /path/to/your/app创建最小化镜像:
FROM alpine:latest COPY app /usr/local/bin/ CMD ["app"]数据卷映射:
docker run -v /host/config:/etc/app -v /host/data:/var/lib/app ...
18.2 容器化 Windows 服务
通过 Wine 运行 Windows 应用:
FROM ubuntu:latest RUN dpkg --add-architecture i386 && \ apt update && \ apt install -y wine32 COPY app.exe /app/ CMD ["wine", "/app/app.exe"]19. 性能基准测试方法
19.1 容器启动速度测试
time docker run --rm alpine echo "hello"19.2 网络性能测试
使用 iperf3 测试容器间带宽:
# 服务端 docker run -it --rm -p 5201:5201 networkstatic/iperf3 -s # 客户端 docker run -it --rm networkstatic/iperf3 -c server-ip19.3 存储 IO 测试
docker run --rm -it --volume /tmp:/data alpine \ dd if=/dev/zero of=/data/testfile bs=1G count=1 oflag=direct20. 未来技术演进方向
20.1 容器与虚拟机融合
使用 Kata Containers 获得虚拟机级别隔离:
docker run --runtime=kata-runtime ...20.2 无守护进程模式
尝试 rootless 模式运行:
dockerd-rootless-setuptool.sh install systemctl --user start docker20.3 服务网格集成
配合 Istio 实现高级流量管理:
# docker-compose.yml services: app: labels: - "com.docker.compose.service=app" - "traefik.enable=true" - "traefik.http.routers.app.rule=Host(`app.example.com`)"