在RHEL 9.6系统上部署Docker-CE(社区版)是容器化应用的起点。不同于简单的软件安装,Docker部署需要特别关注网络转发和存储驱动等核心配置,这些因素直接影响后续容器运行的稳定性和性能。
官方Docker仓库在国内访问速度较慢,使用阿里云镜像源可以显著提升安装效率。这里有个细节需要注意:关闭GPG校验(gpgcheck=0)可以避免因密钥问题导致的安装失败,但在生产环境中建议保持开启并配置正确的GPG密钥以提高安全性。
bash复制cat > /etc/yum.repos.d/docker.repo << EOF
[docker]
name = docker
baseurl = https://mirrors.aliyun.com/docker-ce/linux/rhel/9.6/x86_64/stable/
gpgcheck = 0
EOF
提示:如果遇到"无法读取客户身份"的警告,可以忽略不影响Docker安装。这是RHEL订阅管理的提示,与Docker安装无关。
使用dnf工具安装时,建议同时安装docker-ce-cli和containerd.io,确保完整的容器运行时环境:
bash复制dnf install docker-ce docker-ce-cli containerd.io -y
安装完成后,关键的配置调整在/lib/systemd/system/docker.service文件中。默认情况下Docker可能不会启用iptables,这在RHEL 9.6上会导致容器网络问题:
bash复制vim /lib/systemd/system/docker.service
# 修改ExecStart行,确保包含--iptables=true参数
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --iptables=true
容器网络需要内核模块和系统参数的支持。首先加载必要的内核模块:
bash复制echo br_netfilter > /etc/modules-load.d/docker_mod.conf
modprobe -a br_netfilter
然后配置系统参数,允许网络转发和桥接流量通过iptables:
bash复制cat > /etc/sysctl.d/docker.conf <<EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
这些配置确保了:
bash复制systemctl enable --now docker
docker info | grep -i 'registry mirrors'
如果看到配置的镜像地址,说明服务已正常启动。至此,一个生产可用的Docker环境就配置完成了。
国内用户应该配置镜像加速器以提升拉取速度。阿里云、腾讯云等均提供免费的Docker镜像加速服务。配置方法:
bash复制cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://docker.1ms.run"]
}
EOF
systemctl restart docker
经验:配置完成后务必检查docker info输出中的Registry Mirrors项,确认配置已生效。有时JSON格式错误会导致配置不生效。
镜像管理是Docker使用的核心。以下是一些实用技巧:
镜像搜索与拉取:
bash复制docker search nginx # 搜索镜像
docker pull nginx:1.26 # 拉取特定版本
镜像导出与导入:
bash复制docker save -o nginx.tar nginx:1.26 # 导出
docker load -i nginx.tar # 导入
镜像历史查看:
bash复制docker history nginx:1.26
这个命令可以查看镜像的构建历史,对于分析第三方镜像非常有用。
镜像清理:
bash复制docker image prune -a # 清理所有未使用的镜像
容器操作是日常使用最频繁的部分。几个关键场景:
运行容器:
bash复制docker run -d --name web -p 80:80 nginx:1.26 # 后台运行
docker run -it --name test busybox:latest # 交互式运行
容器状态管理:
bash复制docker ps -a # 查看所有容器
docker start/stop/restart web # 启停容器
容器交互:
bash复制docker exec -it web /bin/bash # 进入运行中的容器
使用Ctrl+P, Ctrl+Q可以退出容器而不停止它。
文件操作:
bash复制docker cp /host/file web:/container/path # 主机到容器
docker cp web:/container/path /host/file # 容器到主机
容器提交:
bash复制docker commit web my-nginx:v1 # 将容器保存为新镜像
注意事项:生产环境中应避免直接使用docker commit,而应该使用Dockerfile构建可复现的镜像。
Dockerfile是构建镜像的蓝图,理解每个指令的细微差别至关重要:
FROM:指定基础镜像。建议使用官方镜像的特定版本,避免使用latest标签。
dockerfile复制FROM busybox:1.35
COPY vs ADD:
dockerfile复制COPY app.jar /opt/ # 推荐常规文件复制使用COPY
ADD https://example.com/file.tar.gz /tmp/ # 需要特殊功能时使用ADD
RUN:执行命令。多条RUN指令会产生多个镜像层,应该合并:
dockerfile复制RUN apt-get update && \
apt-get install -y python3 && \
rm -rf /var/lib/apt/lists/*
ENV:设置环境变量。这些变量可以在后续指令和容器运行时使用。
dockerfile复制ENV APP_HOME=/usr/src/app
WORKDIR $APP_HOME
VOLUME:声明匿名卷。即使容器被删除,卷中的数据也会保留。
dockerfile复制VOLUME ["/data"]
EXPOSE:声明容器监听的端口。这只是一个文档说明,实际端口映射需要在运行时指定。
dockerfile复制EXPOSE 8080
WORKDIR:设置工作目录。影响后续RUN、CMD、ENTRYPOINT等指令的执行位置。
dockerfile复制WORKDIR /app
CMD vs ENTRYPOINT:
dockerfile复制ENTRYPOINT ["/usr/bin/python3"]
CMD ["app.py"]
多阶段构建是优化镜像大小的关键技术。它将构建过程分为多个阶段,最终只保留运行所需的文件:
dockerfile复制# 构建阶段
FROM golang:1.20 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .
# 运行阶段
FROM alpine:3.18
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]
这种构建方式可以将Go应用的镜像从几百MB减少到几十MB。
选择精简基础镜像:
合并RUN指令:
dockerfile复制RUN apt-get update && \
apt-get install -y build-essential && \
rm -rf /var/lib/apt/lists/*
清理构建缓存和临时文件:
dockerfile复制RUN make && make install && \
rm -rf /tmp/* /var/tmp/*
合理排序指令:将变化频率低的指令(如依赖安装)放在前面,变化频率高的指令(如源码复制)放在后面。
使用.dockerignore文件:排除不必要的文件和目录,避免它们被发送到Docker守护进程。
非root用户运行:
dockerfile复制RUN groupadd -r appuser && \
useradd -r -g appuser appuser
USER appuser
签名验证:
bash复制docker trust inspect --pretty myimage:latest
漏洞扫描:
bash复制docker scan myimage:latest
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 容器无法启动 | 端口冲突 | 检查主机端口使用情况 netstat -tuln |
| 容器网络不通 | iptables配置问题 | 检查/etc/sysctl.d/docker.conf设置 |
| 存储空间不足 | 镜像和容器积累 | 定期执行docker system prune |
| 性能下降 | 资源限制 | 使用docker stats监控资源使用 |
容器日志:
bash复制docker logs -f --tail 100 container_name
Docker守护进程日志:
bash复制journalctl -u docker -f
详细调试:
bash复制dockerd --debug
实时监控:
bash复制docker stats
资源限制:
bash复制docker run -it --cpus=1 --memory=512m nginx
事件监控:
bash复制docker events --filter 'event=die'
在实际生产环境中,Docker的稳定运行离不开这些基础但关键的配置和优化。每个项目可能有其特殊性,但掌握了这些核心原则,就能应对大多数容器化场景的需求。