openEuler 22.03 离线部署Docker全攻略:从二进制包到服务自启

openEuler 22.03 离线部署Docker全攻略:从二进制包到服务自启 1. 离线环境下的准备工作在开始之前我们需要明确一点离线安装Docker和在联网环境下安装完全是两码事。我曾经在一个金融客户的内网环境中部署Docker因为没有提前做好充分准备结果浪费了大半天时间。下面这些准备工作都是我用实际教训换来的经验。首先我们需要准备一台能够访问外网的机器可以是个人笔记本用来下载所有必要的文件。这里有个小技巧最好准备一个U盘或者移动硬盘因为有些内网环境不允许直接通过网络传输文件。我遇到过有的客户现场连USB口都是封装的这时候就得提前跟客户确认好文件传输方式。需要下载的文件主要包括Docker二进制包包含dockerd、docker、containerd等核心组件Docker Compose二进制文件如果需要的话可能的依赖库如libcgroup、device-mapper等注意下载的Docker版本一定要和openEuler 22.03系统兼容。我曾经因为下载了太新的版本导致各种奇怪的兼容性问题最后不得不重头再来。2. 获取和验证Docker二进制包现在我们来解决最核心的问题如何获取Docker的离线安装包。官方推荐的方式是从Docker的GitHub仓库下载静态二进制包地址是https://download.docker.com/linux/static/stable/x86_64/。但是实际操作中我发现这个官方源在国内访问经常不稳定。这时候可以考虑使用国内镜像源比如阿里云的镜像站https://mirrors.aliyun.com/docker-ce/linux/static/stable/x86_64/。我实测下来阿里云的下载速度要快很多特别是在网络状况不太好的情况下。下载时要注意选择正确的版本。对于openEuler 22.03我推荐使用较新的稳定版比如20.10.x系列。下载命令是这样的wget https://mirrors.aliyun.com/docker-ce/linux/static/stable/x86_64/docker-20.10.9.tgz下载完成后强烈建议先验证一下文件的完整性。我吃过亏有一次下载的文件损坏了导致安装到一半报错排查了好久才发现是文件下载不完整。验证方法很简单sha256sum docker-20.10.9.tgz然后去官方发布的checksum文件里核对一下这个哈希值是否匹配。虽然多花几分钟但能避免后续很多麻烦。3. 安装Docker二进制文件现在我们把准备好的Docker二进制包复制到目标机器上。假设我们已经通过U盘或者其他方式把docker-20.10.9.tgz文件放到了/opt目录下。首先创建一个专门的目录来存放Docker文件是个好习惯sudo mkdir -p /opt/docker cd /opt/docker然后解压我们下载的安装包sudo tar -xzvf /opt/docker-20.10.9.tgz解压完成后你会看到docker目录下有一系列可执行文件。接下来我们需要把这些二进制文件复制到系统的可执行路径下sudo cp docker/* /usr/bin/复制完成后别忘了给这些文件添加可执行权限sudo chmod x /usr/bin/docker* sudo chmod x /usr/bin/containerd* sudo chmod x /usr/bin/runc这里有个小技巧你可以先用ls -l /usr/bin/docker*命令检查一下文件权限是否正确。我曾经遇到过因为权限问题导致Docker无法启动的情况后来发现是chmod命令没有执行成功。4. 配置systemd服务现在Docker的二进制文件已经安装好了但是要让Docker作为系统服务运行我们还需要配置systemd。这是整个安装过程中最容易出错的部分我见过不少人在这一步卡住。首先我们来创建Docker的service文件sudo tee /etc/systemd/system/docker.service EOF [Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.com Afternetwork-online.target firewalld.service containerd.service Wantsnetwork-online.target Requirescontainerd.service [Service] Typenotify ExecStart/usr/bin/dockerd --containerd/run/containerd/containerd.sock ExecReload/bin/kill -s HUP $MAINPID TimeoutSec0 RestartSec2 Restartalways LimitNOFILEinfinity LimitNPROCinfinity LimitCOREinfinity TasksMaxinfinity Delegateyes KillModeprocess [Install] WantedBymulti-user.target EOF同样我们还需要配置containerd的服务文件sudo tee /etc/systemd/system/containerd.service EOF [Unit] Descriptioncontainerd container runtime Documentationhttps://containerd.io Afternetwork.target [Service] ExecStartPre-/sbin/modprobe overlay ExecStart/usr/bin/containerd Restartalways RestartSec5 Delegateyes KillModeprocess OOMScoreAdjust-999 LimitNOFILEinfinity LimitNPROCinfinity LimitCOREinfinity [Install] WantedBymulti-user.target EOF这两个配置文件有几个关键点需要注意After和Requires参数确保了服务启动的顺序依赖Typenotify让Docker能够通知systemd它的状态变化各种Limit设置解除了资源限制这对容器运行很重要5. 启动和验证Docker服务配置文件准备好后我们需要重新加载systemd的配置sudo systemctl daemon-reload然后先启动containerd服务因为Docker依赖它sudo systemctl enable --now containerd检查containerd的状态确保它正常运行sudo systemctl status containerd如果一切正常你现在应该能看到active (running)的状态。如果出现错误可以用journalctl -u containerd查看详细日志。接下来启动Docker服务sudo systemctl enable --now docker同样检查Docker的状态sudo systemctl status docker为了确认Docker确实安装成功了我们可以运行几个测试命令sudo docker version sudo docker info最后运行一个测试容器sudo docker run hello-world如果看到Hello from Docker!的输出恭喜你Docker已经成功安装并运行了6. 配置Docker开机自启虽然我们已经用systemctl enable命令设置了开机自启但为了确保万无一失我建议再做几个检查首先确认Docker服务的enable状态systemctl is-enabled docker应该返回enabled。如果不是可以再次运行sudo systemctl enable docker有时候系统重启后服务没有自动启动可能是因为依赖的服务没有正确排序。我们可以检查服务的启动顺序systemd-analyze plot boot.svg这个命令会生成一个启动时序图需要图形界面查看可以清楚地看到各个服务的启动顺序和耗时。7. 常见问题排查在实际操作中你可能会遇到各种问题。下面是我总结的几个最常见的问题和解决方法问题1Docker启动失败报错Unit containerd.service not found这通常是因为containerd没有正确安装或配置。解决方法确认/usr/bin/containerd文件存在且可执行检查/etc/systemd/system/containerd.service文件是否正确重新加载systemd配置sudo systemctl daemon-reload问题2运行docker命令时报权限错误解决方法将当前用户加入docker组sudo usermod -aG docker $USER newgrp docker或者每次使用sudo运行docker命令问题3容器网络不可用这可能是防火墙规则阻止了。可以尝试sudo systemctl stop firewalld sudo systemctl disable firewalld或者配置适当的防火墙规则。问题4存储驱动不兼容openEuler默认可能使用devicemapper驱动这可能会导致问题。建议修改为overlay2sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json EOF { storage-driver: overlay2 } EOF sudo systemctl restart docker8. 安装Docker Compose可选如果你还需要使用Docker Compose也可以离线安装。首先在有网络的机器上下载二进制文件wget https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-linux-x86_64然后复制到目标机器上sudo cp docker-compose-linux-x86_64 /usr/local/bin/docker-compose sudo chmod x /usr/local/bin/docker-compose验证安装docker-compose version9. 后续优化建议安装完成后我建议做以下几个优化配置Docker镜像加速器如果有可用的内网镜像仓库sudo tee /etc/docker/daemon.json EOF { registry-mirrors: [http://your-mirror-address] } EOF sudo systemctl restart docker配置日志轮转防止日志文件过大sudo tee /etc/logrotate.d/docker EOF /var/lib/docker/containers/*/*.log { rotate 7 daily compress missingok delaycompress copytruncate } EOF调整默认的cgroup驱动为systemdsudo tee /etc/docker/daemon.json EOF { exec-opts: [native.cgroupdriversystemd] } EOF sudo systemctl restart docker这些优化措施都是我在实际生产环境中总结出来的能显著提高Docker的稳定性和性能。特别是在资源受限的环境中合理的配置可以避免很多莫名其妙的问题。