1. 为什么选择Docker与CentOS 7的组合
在Linux服务器领域,CentOS 7至今仍是许多企业级应用的首选系统。它的长期支持周期(直到2024年6月)和出色的稳定性,使其成为生产环境部署的可靠选择。而Docker作为容器化技术的代表,能够完美解决"在我机器上能跑"的经典问题。将二者结合,可以在保持系统纯净的同时,实现应用的高效隔离部署。
我管理的十几台生产服务器中,有超过60%仍运行CentOS 7+Docker的组合。这个方案最大的优势在于:既享受了CentOS 7的稳定内核(3.10.x),又能通过Docker使用最新版本的应用服务。比如我们可以在老系统上运行基于Alpine的MySQL 8.0容器,完全不用担心库依赖冲突。
2. 准备工作与环境检查
2.1 系统基础配置
在开始安装前,建议先执行以下基础优化(所有命令需要root权限):
bash复制# 更新系统基础包
yum update -y
# 安装常用工具集
yum install -y yum-utils device-mapper-persistent-data lvm2 git wget curl
# 关闭防火墙(测试环境建议操作)
systemctl stop firewalld
systemctl disable firewalld
# 关闭SELinux(容器环境下常见需求)
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
生产环境中若需保留防火墙,需额外配置防火墙规则放行Docker相关端口
2.2 存储驱动选择
CentOS 7默认使用devicemapper驱动,但实际推荐配置为overlay2。检查当前系统支持情况:
bash复制lsmod | grep overlay
若没有输出,需要加载内核模块:
bash复制modprobe overlay
echo "overlay" >> /etc/modules-load.d/overlay.conf
3. 三种Docker安装方案详解
3.1 官方仓库安装(推荐)
这是最规范的做法,能确保后续顺利升级:
bash复制# 添加官方仓库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 查看可用版本
yum list docker-ce --showduplicates | sort -r
# 安装指定版本(示例安装19.03.15)
yum install -y docker-ce-19.03.15 docker-ce-cli-19.03.15 containerd.io
# 验证安装
docker --version
3.2 软件包直接安装
适用于无外网的环境,需提前下载好rpm包:
bash复制wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-19.03.15-3.el7.x86_64.rpm
yum install -y ./docker-ce-19.03.15-3.el7.x86_64.rpm
3.3 自动化脚本安装
开发测试环境可以使用官方提供的便捷脚本:
bash复制curl -fsSL https://get.docker.com | sh
注意:此方式无法指定版本,且会安装最新版,生产环境慎用
4. 关键配置优化
4.1 存储驱动配置
修改/etc/docker/daemon.json(不存在则新建):
json复制{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
4.2 镜像加速配置
国内用户必须配置镜像加速,在daemon.json中追加:
json复制{
"registry-mirrors": [
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
4.3 服务管理命令
bash复制# 启动服务
systemctl start docker
# 设置开机自启
systemctl enable docker
# 检查状态
systemctl status docker
# 查看存储驱动是否生效
docker info | grep "Storage Driver"
5. 验证与基础使用
5.1 运行测试容器
bash复制docker run hello-world
成功运行会看到欢迎信息,表明Docker已正常工作。
5.2 常用管理命令
bash复制# 查看镜像列表
docker images
# 查看运行中的容器
docker ps
# 查看所有容器(包括停止的)
docker ps -a
# 停止/启动容器
docker stop <CONTAINER_ID>
docker start <CONTAINER_ID>
# 进入容器shell
docker exec -it <CONTAINER_ID> /bin/bash
6. 生产环境注意事项
6.1 磁盘空间管理
Docker默认将数据存储在/var/lib/docker,建议单独挂载大容量分区。可以通过修改daemon.json实现:
json复制{
"data-root": "/data/docker"
}
6.2 日志轮转
默认情况下容器日志会不断增长,需要配置日志轮转策略。在daemon.json中添加:
json复制{
"log-driver": "json-file",
"log-opts": {
"max-size": "50m",
"max-file": "3"
}
}
6.3 内核参数调优
在/etc/sysctl.conf中添加:
conf复制net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
vm.swappiness=0
执行sysctl -p生效
7. 常见问题排查
7.1 启动失败排查
如果遇到docker服务启动失败,按顺序检查:
- 查看详细日志:
bash复制journalctl -xe -u docker
- 检查存储驱动兼容性:
bash复制grep overlay /proc/filesystems
- 检查cgroup配置:
bash复制ls /sys/fs/cgroup/
7.2 镜像拉取失败
典型报错:Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled
解决方案:
- 确认镜像加速配置正确
- 临时关闭防火墙测试
- 检查DNS配置:
bash复制cat /etc/resolv.conf
7.3 容器网络异常
当容器无法连接外网时:
- 检查iptables规则:
bash复制iptables -L -n
- 重启docker网络:
bash复制systemctl restart docker
8. 升级与维护
8.1 版本升级步骤
bash复制# 查看当前版本
docker version
# 卸载旧版本(保留数据)
yum remove docker-ce docker-ce-cli containerd.io
# 安装新版本
yum install docker-ce-<NEW_VERSION>
8.2 数据备份策略
关键数据包括:
- /var/lib/docker/volumes(如果使用volume)
- 重要的容器配置文件
- 自定义镜像(建议推送到私有仓库)
备份示例命令:
bash复制# 打包volume数据
tar -czvf docker_volumes_backup.tar.gz /var/lib/docker/volumes/
# 保存镜像列表
docker images --format '{{.Repository}}:{{.Tag}}' > docker_images.list
# 批量导出镜像
while read img; do docker save $img > $(echo $img | tr '/' '_').tar; done < docker_images.list
9. 安全加固建议
9.1 非root用户操作
将普通用户加入docker组需谨慎,因为这会赋予其root等效权限。如果必须使用,建议:
bash复制# 创建docker组
groupadd docker
# 添加用户
usermod -aG docker $USER
# 刷新组权限
newgrp docker
9.2 容器安全扫描
定期使用docker自带的扫描工具:
bash复制docker scan <IMAGE_NAME>
9.3 资源限制
运行容器时添加资源限制参数:
bash复制docker run -it --cpus="1.5" --memory="512m" nginx
10. 延伸应用场景
10.1 开发环境搭建
使用Docker快速构建开发环境:
bash复制# 一键启动MySQL+Redis
docker-compose -f - up -d <<EOF
version: '3'
services:
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
redis:
image: redis:alpine
EOF
10.2 持续集成部署
在Jenkins pipeline中使用Docker:
groovy复制pipeline {
agent {
docker { image 'maven:3-jdk-11' }
}
stages {
stage('Build') {
steps {
sh 'mvn clean package'
}
}
}
}
10.3 微服务架构
典型的多容器应用部署:
bash复制# 前端+后端+数据库编排
docker-compose -f - up -d <<EOF
version: '3'
services:
frontend:
image: nginx:alpine
ports:
- "80:80"
backend:
image: tomcat:9
environment:
DB_URL: "mysql://db:3306"
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
EOF
经过多年运维实践,我强烈建议在CentOS 7上使用Docker时固定版本号,避免自动升级带来的兼容性问题。特别是在生产环境,每次升级前都应在测试环境充分验证。记录一个实用技巧:定期执行docker system prune可以清理无用镜像和容器,但务必先确认没有重要数据。