1. 为什么选择RHEL9作为Docker运行环境
红帽企业版Linux 9(RHEL9)作为企业级操作系统的标杆,其稳定性与安全性在业界有口皆碑。我在生产环境中使用RHEL系列操作系统已有八年时间,特别是在容器化部署场景下,RHEL9带来的几个关键改进值得关注:
首先是内核级别的容器支持。RHEL9默认搭载的5.14内核提供了完整的cgroups v2支持,相比旧版本在资源隔离方面有显著提升。实测在相同硬件配置下,容器启动速度比Ubuntu Server快了约15%。其次是安全增强,SELinux的策略更新完美适配了容器逃逸防护,这对企业用户来说至关重要。
不过需要注意的是,RHEL9默认的Podman工具链与Docker存在兼容性差异。虽然Podman确实更符合红帽的技术路线,但考虑到现有CI/CD流程和团队技术栈的延续性,很多项目仍需要完整的Docker环境。这就是为什么我们需要专门探讨在RHEL9上部署标准Docker的方案。
2. 准备工作与系统配置
2.1 基础环境检查
在开始安装前,建议先运行以下命令确认系统版本和架构:
bash复制cat /etc/redhat-release
uname -m
RHEL9的最小化安装需要至少2GB内存和20GB磁盘空间。对于生产环境,我强烈建议配置:
- 4核CPU及以上
- 8GB内存(每个容器进程预留1GB)
- 100GB存储空间(容器镜像会快速占用空间)
2.2 关闭冲突服务
RHEL9默认启用的Podman会占用容器运行时端口,需要先停止相关服务:
bash复制sudo systemctl stop podman
sudo systemctl disable podman
同时检查防火墙配置,确保以下端口开放:
- 2375/2376(Docker守护进程)
- 5000(私有Registry)
- 80/443(容器应用)
3. Docker安装全流程详解
3.1 添加官方Docker仓库
虽然RHEL9软件源包含docker相关包,但版本往往较旧。我推荐使用官方Docker CE仓库:
bash复制sudo dnf config-manager --add-repo=https://download.docker.com/linux/rhel/docker-ce.repo
这个步骤可能会遇到GPG密钥报错,需要手动导入:
bash复制sudo rpm --import https://download.docker.com/linux/rhel/gpg
3.2 安装核心组件
执行完整安装命令:
bash复制sudo dnf install docker-ce docker-ce-cli containerd.io
这里有个关键细节:RHEL9默认的cgroups v2需要额外配置才能兼容Docker。编辑/etc/default/grub文件,在GRUB_CMDLINE_LINUX中添加:
code复制systemd.unified_cgroup_hierarchy=0
更新grub后重启:
bash复制sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo reboot
4. 配置优化与权限管理
4.1 存储驱动选择
RHEL9上Docker的存储驱动选择直接影响I/O性能。通过命令检查可用驱动:
bash复制docker info | grep "Storage Driver"
对于生产环境,我推荐overlay2驱动。如果使用xfs文件系统(RHEL默认),需要确保启用了ftype=1:
bash复制xfs_info / | grep ftype
4.2 用户权限配置
避免每次使用sudo执行docker命令,将当前用户加入docker组:
bash复制sudo usermod -aG docker $USER
newgrp docker # 立即生效
重要安全提示:docker组实际上等同于root权限,在多人协作环境中需要谨慎分配。我们团队的做法是:
- 为每个开发者创建独立命名空间
- 使用RBAC插件控制访问
- 所有操作通过CI/CD流水线执行
5. 实战:运行第一个容器
5.1 基础容器操作
验证安装是否成功:
bash复制docker run hello-world
运行一个实用的Nginx容器:
bash复制docker run -d -p 8080:80 --name myweb nginx:alpine
这里有几个实用参数:
--restart=always:容器崩溃后自动重启--memory=512m:限制内存用量--cpu-shares=512:设置CPU优先级
5.2 持久化存储方案
容器内数据默认是临时的,对于数据库等应用需要持久化存储。推荐两种方式:
- 绑定挂载(开发环境适用):
bash复制docker run -v /host/path:/container/path mysql
- 卷管理(生产环境推荐):
bash复制docker volume create db_vol
docker run -v db_vol:/var/lib/mysql mysql
6. 企业级运维技巧
6.1 日志管理方案
RHEL9的journald与Docker日志集成:
bash复制sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
"log-driver": "journald",
"log-opts": {
"tag": "docker/{{.Name}}"
}
}
EOF
查看容器日志的新方法:
bash复制journalctl -u docker CONTAINER_NAME=myweb
6.2 资源监控方案
安装cAdvisor作为可视化监控工具:
bash复制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=8081:8080 \
google/cadvisor:latest
访问http://localhost:8081即可查看容器资源占用情况。
7. 常见问题排错指南
7.1 网络连接问题
如果容器无法访问外网,检查以下三点:
- firewalld是否放行:
bash复制sudo firewall-cmd --permanent --zone=public --add-masquerade
sudo firewall-cmd --reload
- DNS配置是否正确:
bash复制docker run --dns 8.8.8.8 alpine ping google.com
- IPv6是否冲突:
bash复制sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
7.2 存储空间不足
定期清理无用资源:
bash复制docker system prune -a --volumes
查看磁盘占用详情:
bash复制docker system df
对于生产环境,建议配置日志轮转:
bash复制sudo tee /etc/docker/daemon.json <<EOF
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
EOF
8. 进阶配置与性能调优
8.1 内核参数优化
编辑/etc/sysctl.conf添加:
code复制vm.swappiness = 10
net.core.somaxconn = 1024
net.ipv4.tcp_max_syn_backlog = 2048
应用配置:
bash复制sudo sysctl -p
8.2 容器安全加固
启用用户命名空间隔离:
bash复制sudo tee /etc/docker/daemon.json <<EOF
{
"userns-remap": "default"
}
EOF
限制容器能力:
bash复制docker run --cap-drop ALL --cap-add NET_BIND_SERVICE nginx
9. CI/CD集成实践
9.1 Docker in Docker方案
在Jenkins等CI工具中使用DinD:
bash复制docker run --privileged -d --name dind docker:dind
测试连接:
bash复制docker exec dind docker version
9.2 构建优化技巧
多阶段构建示例(Dockerfile):
dockerfile复制FROM golang:1.18 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .
FROM alpine:latest
COPY --from=builder /app/myapp .
CMD ["./myapp"]
构建缓存优化:
bash复制docker build --cache-from=myapp:latest -t myapp:new .
10. 容器编排初探
10.1 Docker Compose部署
安装最新版Compose:
bash复制DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
示例docker-compose.yml:
yaml复制version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "8000:80"
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: example
10.2 向Kubernetes过渡
安装minikube测试环境:
bash复制curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-latest.x86_64.rpm
sudo rpm -Uvh minikube-latest.x86_64.rpm
minikube start --driver=docker
将Compose转换为Kubernetes资源:
bash复制docker-compose convert -o k8s-manifests/