1. 为什么需要离线部署Docker在企业生产环境中我们经常会遇到一些特殊的网络限制场景。比如某些金融、军工类企业的内网完全与互联网隔离或者一些实验室环境出于安全考虑禁止连接外网。这时候如果还想用Docker来部署应用传统的在线安装方式就行不通了。我去年给一家制造企业做容器化改造时就遇到过这种情况。他们的生产线控制系统运行在一个完全封闭的网络环境中连最基本的yum源都没有。当时为了部署Docker我不得不先在外网环境准备好所有依赖包然后用U盘一个个拷进去。这个过程虽然麻烦但确实解决了实际问题。离线部署Docker主要有以下优势安全性高不需要连接外网杜绝了潜在的网络攻击风险稳定性强所有依赖包都是预先准备好的不会出现安装中途下载失败的情况版本可控可以精确控制每个组件的版本避免自动升级带来的兼容性问题批量部署一次准备可以重复使用特别适合大规模集群环境2. 准备工作获取离线安装包2.1 下载Docker二进制包首先需要在一个能联网的机器上下载Docker的离线安装包。推荐直接从官方仓库获取最新稳定版# 下载Docker二进制包 wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.9.tgz # 下载Docker Compose二进制文件 wget https://github.com/docker/compose/releases/download/v2.3.3/docker-compose-linux-x86_64这里有个小技巧我习惯把下载的文件按照版本号重命名比如docker-20.10.9.tgz和docker-compose-v2.3.3这样后期维护时一目了然。2.2 检查系统依赖在开始安装前建议先检查目标机器是否满足基本要求64位Linux系统内核3.10以上iptables版本1.4device-mapper工具如果使用devicemapper存储驱动systemd用于服务管理可以用以下命令快速检查# 检查内核版本 uname -r # 检查iptables版本 iptables --version # 检查device-mapper lsmod | grep dm_mod3. 详细安装步骤3.1 Docker安装与配置把下载好的Docker包复制到目标机器后按以下步骤操作# 解压安装包 tar xvf docker-20.10.9.tgz # 复制二进制文件到系统目录 sudo cp -r docker/* /usr/bin/ # 创建systemd服务文件 sudo tee /etc/systemd/system/docker.service EOF [Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.com Afternetwork-online.target firewalld.service Wantsnetwork-online.target [Service] Typenotify ExecStart/usr/bin/dockerd ExecReload/bin/kill -s HUP $MAINPID LimitNOFILEinfinity LimitNPROCinfinity TimeoutStartSec0 Delegateyes KillModeprocess Restarton-failure StartLimitBurst3 StartLimitInterval60s [Install] WantedBymulti-user.target EOF # 设置权限并启动服务 sudo chmod x /etc/systemd/system/docker.service sudo systemctl daemon-reload sudo systemctl enable docker sudo systemctl start docker # 验证安装 docker --version sudo docker run hello-world这里有个容易踩的坑如果系统使用了代理需要额外配置Docker的代理设置。可以在/etc/systemd/system/docker.service.d/http-proxy.conf文件中添加[Service] EnvironmentHTTP_PROXYhttp://proxy.example.com:8080 EnvironmentHTTPS_PROXYhttp://proxy.example.com:8080 EnvironmentNO_PROXYlocalhost,127.0.0.1,.example.com3.2 Docker Compose安装Docker Compose的安装相对简单# 复制二进制文件并设置权限 sudo cp docker-compose-linux-x86_64 /usr/local/bin/docker-compose sudo chmod x /usr/local/bin/docker-compose # 验证安装 docker-compose --version为了使用更方便我通常会创建一个符号链接sudo ln -s /usr/local/bin/docker-compose /usr/bin/dc这样以后就可以直接用dc命令代替docker-compose了。4. 高级配置与优化4.1 配置镜像加速器在内网环境中我们可以搭建自己的镜像仓库作为加速器。假设已经在内网部署了Harbor仓库可以这样配置sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json EOF { registry-mirrors: [https://harbor.yourcompany.com], insecure-registries: [harbor.yourcompany.com], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 } } EOF sudo systemctl restart docker4.2 存储驱动选择根据不同的使用场景可以选择合适的存储驱动。对于生产环境我推荐使用overlay2# 检查当前存储驱动 docker info | grep Storage Driver # 修改存储驱动 sudo tee /etc/docker/daemon.json EOF { storage-driver: overlay2 } EOF4.3 资源限制配置为了防止容器占用过多系统资源可以设置默认的资源限制sudo tee /etc/docker/daemon.json EOF { default-ulimits: { nofile: { Name: nofile, Hard: 65535, Soft: 65535 } }, default-runtime: runc } EOF5. 一键安装脚本为了简化部署过程我整理了一个完整的一键安装脚本#!/bin/bash set -e echo Docker离线安装脚本 # 定义版本变量 DOCKER_VERSION20.10.9 COMPOSE_VERSIONv2.3.3 # 检查root权限 if [ $(id -u) ! 0 ]; then echo 错误请使用root用户执行此脚本 12 exit 1 fi # 安装Docker echo 正在安装Docker... tar xvf docker-${DOCKER_VERSION}.tgz cp -r docker/* /usr/bin/ rm -rf docker # 配置服务 cat /etc/systemd/system/docker.service EOF [Unit] DescriptionDocker Application Container Engine Afternetwork-online.target firewalld.service Wantsnetwork-online.target [Service] Typenotify ExecStart/usr/bin/dockerd ExecReload/bin/kill -s HUP \$MAINPID LimitNOFILEinfinity LimitNPROCinfinity TimeoutStartSec0 Delegateyes KillModeprocess Restarton-failure StartLimitBurst3 StartLimitInterval60s [Install] WantedBymulti-user.target EOF chmod x /etc/systemd/system/docker.service systemctl daemon-reload systemctl enable docker systemctl start docker # 验证Docker if ! docker --version; then echo Docker安装失败 exit 1 fi echo Docker安装成功 # 安装Docker Compose echo 正在安装Docker Compose... cp docker-compose-linux-x86_64 /usr/local/bin/docker-compose chmod x /usr/local/bin/docker-compose ln -s /usr/local/bin/docker-compose /usr/bin/dc # 验证Compose if ! docker-compose --version; then echo Docker Compose安装失败 exit 1 fi echo Docker Compose安装成功 echo 安装完成 这个脚本包含了完整的安装流程和错误检查使用时只需要把安装包和脚本放在同一目录下执行即可。6. 常见问题排查6.1 服务启动失败如果遇到Docker服务启动失败可以按以下步骤排查# 查看详细日志 journalctl -u docker.service -n 50 --no-pager # 手动运行dockerd查看输出 /usr/bin/dockerd --debug常见问题包括端口冲突特别是2375/2376存储驱动配置错误内核模块缺失6.2 镜像导入导出在内网环境中镜像需要先在外网下载再导入# 在外网机器下载镜像 docker pull nginx:alpine docker save -o nginx-alpine.tar nginx:alpine # 在内网机器导入镜像 docker load -i nginx-alpine.tar6.3 网络配置如果容器需要访问内网特定服务可以自定义网络# 创建自定义网络 docker network create --subnet172.18.0.0/16 mynet # 运行容器时指定网络 docker run --net mynet --ip 172.18.0.100 -d nginx7. 维护与升级7.1 版本升级离线环境升级需要手动下载新版本包# 停止旧版本服务 systemctl stop docker # 备份配置 cp -r /etc/docker /etc/docker.bak # 安装新版本 tar xvf docker-new-version.tgz cp -r docker/* /usr/bin/ # 重启服务 systemctl start docker7.2 数据备份定期备份Docker数据很重要# 备份镜像 docker save -o all-images.tar $(docker images -q) # 备份卷数据 tar czvf docker-volumes.tar.gz /var/lib/docker/volumes/在实际项目中我建议把这些维护操作写成定时任务确保数据安全。
无网环境下的容器化基石:手把手完成Docker与Docker Compose离线部署
1. 为什么需要离线部署Docker在企业生产环境中我们经常会遇到一些特殊的网络限制场景。比如某些金融、军工类企业的内网完全与互联网隔离或者一些实验室环境出于安全考虑禁止连接外网。这时候如果还想用Docker来部署应用传统的在线安装方式就行不通了。我去年给一家制造企业做容器化改造时就遇到过这种情况。他们的生产线控制系统运行在一个完全封闭的网络环境中连最基本的yum源都没有。当时为了部署Docker我不得不先在外网环境准备好所有依赖包然后用U盘一个个拷进去。这个过程虽然麻烦但确实解决了实际问题。离线部署Docker主要有以下优势安全性高不需要连接外网杜绝了潜在的网络攻击风险稳定性强所有依赖包都是预先准备好的不会出现安装中途下载失败的情况版本可控可以精确控制每个组件的版本避免自动升级带来的兼容性问题批量部署一次准备可以重复使用特别适合大规模集群环境2. 准备工作获取离线安装包2.1 下载Docker二进制包首先需要在一个能联网的机器上下载Docker的离线安装包。推荐直接从官方仓库获取最新稳定版# 下载Docker二进制包 wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.9.tgz # 下载Docker Compose二进制文件 wget https://github.com/docker/compose/releases/download/v2.3.3/docker-compose-linux-x86_64这里有个小技巧我习惯把下载的文件按照版本号重命名比如docker-20.10.9.tgz和docker-compose-v2.3.3这样后期维护时一目了然。2.2 检查系统依赖在开始安装前建议先检查目标机器是否满足基本要求64位Linux系统内核3.10以上iptables版本1.4device-mapper工具如果使用devicemapper存储驱动systemd用于服务管理可以用以下命令快速检查# 检查内核版本 uname -r # 检查iptables版本 iptables --version # 检查device-mapper lsmod | grep dm_mod3. 详细安装步骤3.1 Docker安装与配置把下载好的Docker包复制到目标机器后按以下步骤操作# 解压安装包 tar xvf docker-20.10.9.tgz # 复制二进制文件到系统目录 sudo cp -r docker/* /usr/bin/ # 创建systemd服务文件 sudo tee /etc/systemd/system/docker.service EOF [Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.com Afternetwork-online.target firewalld.service Wantsnetwork-online.target [Service] Typenotify ExecStart/usr/bin/dockerd ExecReload/bin/kill -s HUP $MAINPID LimitNOFILEinfinity LimitNPROCinfinity TimeoutStartSec0 Delegateyes KillModeprocess Restarton-failure StartLimitBurst3 StartLimitInterval60s [Install] WantedBymulti-user.target EOF # 设置权限并启动服务 sudo chmod x /etc/systemd/system/docker.service sudo systemctl daemon-reload sudo systemctl enable docker sudo systemctl start docker # 验证安装 docker --version sudo docker run hello-world这里有个容易踩的坑如果系统使用了代理需要额外配置Docker的代理设置。可以在/etc/systemd/system/docker.service.d/http-proxy.conf文件中添加[Service] EnvironmentHTTP_PROXYhttp://proxy.example.com:8080 EnvironmentHTTPS_PROXYhttp://proxy.example.com:8080 EnvironmentNO_PROXYlocalhost,127.0.0.1,.example.com3.2 Docker Compose安装Docker Compose的安装相对简单# 复制二进制文件并设置权限 sudo cp docker-compose-linux-x86_64 /usr/local/bin/docker-compose sudo chmod x /usr/local/bin/docker-compose # 验证安装 docker-compose --version为了使用更方便我通常会创建一个符号链接sudo ln -s /usr/local/bin/docker-compose /usr/bin/dc这样以后就可以直接用dc命令代替docker-compose了。4. 高级配置与优化4.1 配置镜像加速器在内网环境中我们可以搭建自己的镜像仓库作为加速器。假设已经在内网部署了Harbor仓库可以这样配置sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json EOF { registry-mirrors: [https://harbor.yourcompany.com], insecure-registries: [harbor.yourcompany.com], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 } } EOF sudo systemctl restart docker4.2 存储驱动选择根据不同的使用场景可以选择合适的存储驱动。对于生产环境我推荐使用overlay2# 检查当前存储驱动 docker info | grep Storage Driver # 修改存储驱动 sudo tee /etc/docker/daemon.json EOF { storage-driver: overlay2 } EOF4.3 资源限制配置为了防止容器占用过多系统资源可以设置默认的资源限制sudo tee /etc/docker/daemon.json EOF { default-ulimits: { nofile: { Name: nofile, Hard: 65535, Soft: 65535 } }, default-runtime: runc } EOF5. 一键安装脚本为了简化部署过程我整理了一个完整的一键安装脚本#!/bin/bash set -e echo Docker离线安装脚本 # 定义版本变量 DOCKER_VERSION20.10.9 COMPOSE_VERSIONv2.3.3 # 检查root权限 if [ $(id -u) ! 0 ]; then echo 错误请使用root用户执行此脚本 12 exit 1 fi # 安装Docker echo 正在安装Docker... tar xvf docker-${DOCKER_VERSION}.tgz cp -r docker/* /usr/bin/ rm -rf docker # 配置服务 cat /etc/systemd/system/docker.service EOF [Unit] DescriptionDocker Application Container Engine Afternetwork-online.target firewalld.service Wantsnetwork-online.target [Service] Typenotify ExecStart/usr/bin/dockerd ExecReload/bin/kill -s HUP \$MAINPID LimitNOFILEinfinity LimitNPROCinfinity TimeoutStartSec0 Delegateyes KillModeprocess Restarton-failure StartLimitBurst3 StartLimitInterval60s [Install] WantedBymulti-user.target EOF chmod x /etc/systemd/system/docker.service systemctl daemon-reload systemctl enable docker systemctl start docker # 验证Docker if ! docker --version; then echo Docker安装失败 exit 1 fi echo Docker安装成功 # 安装Docker Compose echo 正在安装Docker Compose... cp docker-compose-linux-x86_64 /usr/local/bin/docker-compose chmod x /usr/local/bin/docker-compose ln -s /usr/local/bin/docker-compose /usr/bin/dc # 验证Compose if ! docker-compose --version; then echo Docker Compose安装失败 exit 1 fi echo Docker Compose安装成功 echo 安装完成 这个脚本包含了完整的安装流程和错误检查使用时只需要把安装包和脚本放在同一目录下执行即可。6. 常见问题排查6.1 服务启动失败如果遇到Docker服务启动失败可以按以下步骤排查# 查看详细日志 journalctl -u docker.service -n 50 --no-pager # 手动运行dockerd查看输出 /usr/bin/dockerd --debug常见问题包括端口冲突特别是2375/2376存储驱动配置错误内核模块缺失6.2 镜像导入导出在内网环境中镜像需要先在外网下载再导入# 在外网机器下载镜像 docker pull nginx:alpine docker save -o nginx-alpine.tar nginx:alpine # 在内网机器导入镜像 docker load -i nginx-alpine.tar6.3 网络配置如果容器需要访问内网特定服务可以自定义网络# 创建自定义网络 docker network create --subnet172.18.0.0/16 mynet # 运行容器时指定网络 docker run --net mynet --ip 172.18.0.100 -d nginx7. 维护与升级7.1 版本升级离线环境升级需要手动下载新版本包# 停止旧版本服务 systemctl stop docker # 备份配置 cp -r /etc/docker /etc/docker.bak # 安装新版本 tar xvf docker-new-version.tgz cp -r docker/* /usr/bin/ # 重启服务 systemctl start docker7.2 数据备份定期备份Docker数据很重要# 备份镜像 docker save -o all-images.tar $(docker images -q) # 备份卷数据 tar czvf docker-volumes.tar.gz /var/lib/docker/volumes/在实际项目中我建议把这些维护操作写成定时任务确保数据安全。