在openEuler 22.03 LTS上实战部署Docker:从源配置到避坑指南
1. 环境准备与系统确认
在开始部署Docker之前,首先要确保你的openEuler系统已经准备就绪。我最近在一台全新的openEuler 22.03 LTS服务器上部署Docker时,发现系统版本确认这一步很容易被忽视,但实际上非常重要。因为不同版本的openEuler可能会有不同的软件源配置和依赖关系。
要确认你的系统版本,可以执行以下命令:
cat /etc/openEuler-release这个命令会返回类似"openEuler release 22.03 LTS"的信息。我建议在执行任何安装操作前都先确认这一点,因为后续的很多配置步骤都与系统版本直接相关。
另一个需要检查的是系统架构。虽然大多数服务器使用的是x86_64架构,但在一些特殊场景下可能会遇到ARM架构的设备。你可以用这个命令确认:
uname -m在准备阶段,还需要确保系统已经更新到最新状态。我遇到过因为系统未更新导致依赖关系解析失败的情况。执行以下命令来更新系统:
sudo dnf update -y2. 配置Docker软件源
openEuler默认的软件源中不包含Docker,所以我们需要手动添加Docker的官方源或者镜像源。这里我强烈推荐使用国内镜像源,因为官方源的下载速度可能会很慢。
首先安装必要的工具:
sudo dnf install -y yum-utils device-mapper-persistent-data lvm2然后添加阿里云的Docker CE镜像源:
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo这里有个关键点需要注意:openEuler的$releasever环境变量可能会返回"22.03 (LTS-SP1)"这样的值,这会导致软件源配置出现问题。我建议直接编辑repo文件进行修正:
sudo vim /etc/yum.repos.d/docker-ce.repo在文件中将所有$releasever替换为"7"(针对CentOS 7兼容版本)。
3. 安装Docker引擎
配置好软件源后,就可以开始安装Docker了。但这里往往会出现各种依赖问题,我总结了一套比较稳妥的安装方法。
首先尝试完整安装:
sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin如果遇到containerd.io版本问题(这是最常见的报错之一),可以尝试单独安装指定版本:
sudo dnf install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.6.4-3.1.el7.x86_64.rpm对于docker-compose-plugin的安装问题,可以手动下载并安装:
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-compose-plugin-2.27.1-1.el7.x86_64.rpm sudo rpm -ivh docker-compose-plugin-2.27.1-1.el7.x86_64.rpm安装完成后,验证Docker版本:
docker --version4. 配置与优化
安装完成后,还需要进行一些必要的配置才能让Docker发挥最佳性能。
首先启动Docker服务并设置开机自启:
sudo systemctl start docker sudo systemctl enable docker配置国内镜像加速器(以阿里云为例):
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://<你的ID>.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker我还建议调整Docker的日志配置,防止日志文件占用过多磁盘空间:
sudo tee -a /etc/docker/daemon.json <<-'EOF' { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } } EOF5. 常见问题排查
在实际部署过程中,我遇到过不少问题,这里分享几个典型问题的解决方法。
问题1:软件源更新失败症状:执行dnf makecache时出现"Metadata file does not match checksum"错误。 解决方法:清除缓存并重试:
sudo dnf clean all sudo rm -rf /var/cache/dnf sudo dnf makecache问题2:容器网络不通症状:容器无法访问外部网络。 解决方法:检查防火墙设置并确保iptables规则正确:
sudo systemctl stop firewalld sudo systemctl disable firewalld sudo iptables -P FORWARD ACCEPT问题3:存储驱动问题症状:Docker启动失败,日志显示存储驱动相关错误。 解决方法:修改存储驱动为overlay2:
sudo tee -a /etc/docker/daemon.json <<-'EOF' { "storage-driver": "overlay2" } EOF6. 生产环境建议
对于生产环境,我建议采取以下额外措施来增强安全性和稳定性:
- 配置Docker守护进程的TLS认证,确保远程管理安全
- 设置容器资源限制,防止单个容器占用过多系统资源
- 定期清理无用镜像和容器,释放磁盘空间:
docker system prune -f- 监控Docker的运行状态和资源使用情况
- 考虑使用docker-compose来管理多容器应用
我在实际项目中发现,合理配置cgroup参数可以显著提高容器性能。可以在启动容器时添加以下参数:
--cpus=2 --memory=4g --memory-swap=4g7. 进阶配置技巧
对于有更高要求的用户,可以考虑以下进阶配置:
配置日志轮转编辑/etc/logrotate.d/docker文件:
/var/lib/docker/containers/*/*.log { rotate 7 daily compress size=10M missingok delaycompress copytruncate }优化内核参数在/etc/sysctl.conf中添加:
net.ipv4.ip_forward=1 net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1然后执行:
sudo sysctl -p配置容器时区很多基础镜像的时区设置不正确,可以在运行容器时指定:
docker run -e TZ=Asia/Shanghai ...8. 性能调优经验
经过多次实践,我总结出一些性能调优的经验:
- 对于I/O密集型应用,考虑使用本地SSD存储并配置适当的挂载选项
- 调整Docker的默认ulimit设置,特别是对于需要大量文件描述符的应用
- 使用--oom-kill-disable参数时要谨慎,防止内存泄漏导致系统崩溃
- 对于Java应用,合理配置JVM内存参数,避免双重内存限制
- 考虑使用docker stats命令定期监控容器资源使用情况
一个实用的性能监控命令:
docker stats --all --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}"9. 安全加固措施
Docker的安全性不容忽视,以下是我推荐的安全措施:
- 定期更新Docker引擎和容器镜像
- 避免使用root用户运行容器
- 配置适当的容器能力(Capabilities)
- 使用只读文件系统运行容器
- 扫描镜像中的安全漏洞
一个简单的安全扫描示例:
docker scan <镜像名称>10. 实际应用案例
最后分享一个我在实际项目中的Docker应用案例。我们需要部署一个Python Web应用,使用Nginx作为反向代理,MySQL作为数据库。
docker-compose.yml配置示例:
version: '3' services: web: build: . ports: - "5000:5000" environment: - FLASK_ENV=production depends_on: - db nginx: image: nginx:alpine ports: - "80:80" volumes: - ./nginx.conf:/etc/nginx/conf.d/default.conf depends_on: - web db: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD=secret - MYSQL_DATABASE=appdb volumes: - db_data:/var/lib/mysql volumes: db_data:这个配置展示了如何将多个服务组合在一起,并处理它们之间的依赖关系。在实际部署时,还需要考虑数据持久化、网络配置等更多细节。