1. 为什么要在CentOS 7上安装Docker?
在当今的云计算和微服务架构中,容器化技术已经成为不可或缺的一部分。Docker作为最流行的容器化平台,为开发者提供了轻量级、可移植的运行环境。CentOS 7作为企业级Linux发行版,其稳定性和长期支持(LTS)特性使其成为生产环境的首选。
选择在CentOS 7上部署Docker有几个显著优势:
- 系统稳定性:CentOS 7的内核经过充分测试,与Docker的兼容性良好
- 长期支持:CentOS 7将持续维护到2024年,适合长期运行的容器环境
- 企业级特性:支持SELinux等安全机制,与Docker的安全特性相辅相成
- 广泛的文档支持:作为主流Linux发行版,遇到问题更容易找到解决方案
提示:虽然CentOS 8已经发布,但许多企业仍在使用CentOS 7,了解其上的Docker安装方法具有实际价值。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 安装前的准备工作
2.1 系统要求检查
在开始安装前,需要确认系统满足以下基本要求:
- 64位CentOS 7系统(运行
uname -m应显示x86_64) - 内核版本3.10或更高(运行
uname -r检查) - 至少2GB内存(推荐4GB以上)
- 足够的磁盘空间(建议20GB以上)
我遇到过不少因为系统版本不匹配导致的安装失败案例。有一次,用户尝试在32位系统上安装Docker,结果浪费了大量时间排查问题。所以第一步的系统检查非常重要。
2.2 卸载旧版本
如果你的系统上曾经安装过旧版Docker(可能叫docker或docker-engine),需要先彻底卸载:
bash复制sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
这个步骤经常被忽略,但旧版本残留的文件可能导致新版本安装失败或运行异常。特别是从其他Linux发行版迁移过来的系统,更需要注意这一点。
2.3 安装依赖工具
Docker需要一些基础工具才能正常运行:
bash复制sudo yum install -y yum-utils device-mapper-persistent-data lvm2
这些包的作用分别是:
- yum-utils:提供yum-config-manager等实用工具
- device-mapper-persistent-data和lvm2:为Docker提供存储驱动支持
3. Docker安装的三种方法及选择建议
3.1 方法一:使用官方脚本快速安装(适合测试环境)
Docker官方提供了一个便捷的安装脚本:
bash复制curl -fsSL https://get.docker.com | sh
这个方法的优点是简单快捷,但缺点也很明显:
- 无法控制安装的具体版本
- 不适合生产环境
- 可能包含你不需要的额外组件
我通常只在临时测试环境中使用这个方法。有一次在客户现场演示时,时间紧迫就用了这个方式,结果后来发现安装的是edge版本,稳定性不如稳定版。
3.2 方法二:通过Yum仓库安装(推荐用于生产环境)
这是我最推荐的生产环境安装方式,步骤如下:
- 添加Docker官方仓库:
bash复制sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 安装Docker CE(社区版):
bash复制sudo yum install docker-ce docker-ce-cli containerd.io
- 验证安装:
bash复制sudo docker --version
这种方法的好处是:
- 可以通过yum管理Docker的更新
- 可以选择特定版本安装
- 官方仓库经过充分测试,兼容性有保障
注意:如果公司有网络限制,可能需要配置代理或使用国内镜像源。我曾经遇到过因为网络问题导致仓库添加失败的情况,这时可以考虑使用阿里云等国内镜像源。
3.3 方法三:手动下载RPM包安装(适合无外网环境)
在某些隔离环境中,可以下载RPM包手动安装:
- 访问Docker官方下载页面获取合适的RPM包
- 使用yum localinstall命令安装:
bash复制sudo yum localinstall /path/to/package.rpm
这种方法虽然麻烦,但在某些安全要求严格的金融行业环境中是唯一选择。我曾经为一家银行实施过这种方案,需要提前下载所有依赖包,过程相当繁琐。
4. 安装后的必要配置
4.1 启动Docker服务并设置开机自启
安装完成后,需要启动Docker服务:
bash复制sudo systemctl start docker
sudo systemctl enable docker
验证服务状态:
bash复制sudo systemctl status docker
4.2 配置非root用户使用Docker(重要安全实践)
默认情况下,Docker需要root权限。为了安全起见,应该将普通用户加入docker组:
bash复制sudo usermod -aG docker $USER
然后需要注销重新登录使更改生效。这个步骤经常被忽视,导致用户困惑为什么不能直接运行docker命令。
4.3 配置国内镜像加速器(提升拉取速度)
国内用户应该配置镜像加速器以提高下载速度。以阿里云为例:
- 登录阿里云容器镜像服务获取专属加速器地址
- 创建或修改/etc/docker/daemon.json:
json复制{
"registry-mirrors": ["https://your-aliyun-mirror.mirror.aliyuncs.com"]
}
- 重启Docker服务:
bash复制sudo systemctl daemon-reload
sudo systemctl restart docker
我曾经对比过使用和不使用镜像加速器的速度差异,在某些情况下能提升10倍以上的下载速度。
5. 验证安装与基本使用
5.1 运行测试容器
验证Docker是否正常工作:
bash复制docker run hello-world
这个命令会下载一个测试镜像并运行,如果看到欢迎信息说明安装成功。
5.2 常用命令速查
掌握这些基本命令就能开始使用Docker:
bash复制# 查看Docker信息
docker info
# 列出本地镜像
docker images
# 拉取镜像
docker pull nginx
# 运行容器
docker run -d -p 80:80 --name mynginx nginx
# 查看运行中的容器
docker ps
# 停止容器
docker stop mynginx
# 删除容器
docker rm mynginx
# 删除镜像
docker rmi nginx
5.3 解决常见安装问题
问题1:Virtualization support not detected
如果在启动Docker时遇到虚拟化支持问题,可以:
- 检查BIOS中是否启用了虚拟化支持(Intel VT-x/AMD-V)
- 运行以下命令检查:
bash复制grep -E --color 'vmx|svm' /proc/cpuinfo
如果没有输出,说明CPU虚拟化支持未启用。
问题2:防火墙/SELinux冲突
CentOS 7默认启用了SELinux和firewalld,可能导致Docker网络问题。解决方法:
bash复制# 临时关闭防火墙
sudo systemctl stop firewalld
# 永久关闭(不推荐生产环境)
sudo systemctl disable firewalld
# 更好的方法是配置防火墙规则
sudo firewall-cmd --permanent --zone=trusted --add-interface=docker0
sudo firewall-cmd --permanent --zone=trusted --add-port=2376/tcp
sudo systemctl restart firewalld
对于SELinux,可以设置为宽容模式测试:
bash复制sudo setenforce 0
但在生产环境中,应该正确配置SELinux策略而不是禁用它。
6. 生产环境优化建议
6.1 数据存储配置
默认情况下,Docker使用/var/lib/docker作为存储位置。对于生产环境,建议:
- 使用独立的磁盘或分区挂载到/var/lib/docker
- 考虑使用direct-lvm模式提高性能
配置示例:
bash复制# 创建物理卷
pvcreate /dev/sdb
# 创建卷组
vgcreate docker /dev/sdb
# 创建逻辑卷
lvcreate --wipesignatures y -n thinpool docker -l 95%VG
lvcreate --wipesignatures y -n thinpoolmeta docker -l 1%VG
# 转换为精简池
lvconvert -y --zero n -c 512K --thinpool docker/thinpool --poolmetadata docker/thinpoolmeta
6.2 日志管理
Docker容器默认日志可能占用大量磁盘空间。建议配置日志轮转:
json复制{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
6.3 资源限制
为了防止单个容器占用过多资源,应该设置限制:
bash复制docker run -it --cpus=".5" --memory="512m" ubuntu /bin/bash
这限制容器最多使用0.5个CPU核心和512MB内存。
7. 升级与维护
7.1 升级Docker版本
要升级Docker,可以先查看可用版本:
bash复制yum list docker-ce --showduplicates | sort -r
然后安装特定版本:
bash复制sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
7.2 定期清理无用资源
Docker会积累很多无用的镜像、容器和网络,应该定期清理:
bash复制# 删除所有停止的容器
docker container prune
# 删除所有未被使用的镜像
docker image prune -a
# 删除所有未被使用的网络
docker network prune
# 删除所有未被使用的资源
docker system prune
我曾经遇到过一个开发服务器因为长期不清理,导致磁盘被Docker占满的情况。设置定期清理任务可以避免这个问题。
8. 安全最佳实践
8.1 用户权限管理
- 不要将docker组权限授予不可信用户
- 考虑使用rootless模式运行Docker
- 定期审计docker组成员
8.2 镜像安全
- 只从可信来源拉取镜像
- 扫描镜像中的漏洞
- 使用内容信任(Docker Content Trust)验证镜像
8.3 网络隔离
- 为不同应用使用不同的Docker网络
- 限制容器间的网络通信
- 避免使用--net=host模式
在一次安全评估中,我发现客户的生产环境容器全部使用host网络模式,这导致容器突破了网络隔离,带来了严重的安全风险。
