手把手教你用U盘完成Ubuntu 20.04的Docker离线安装(含常见报错解决方案)
零网络环境下Ubuntu 20.04的Docker实战部署指南在开发测试环境中我们常常会遇到服务器无法连接外网的情况。这时候如何快速部署Docker环境就成了一个棘手的问题。本文将详细介绍如何通过U盘这一常见介质在完全离线的Ubuntu 20.04系统上完成Docker和Docker Compose的安装部署并针对可能出现的各种问题提供解决方案。1. 准备工作与环境搭建1.1 获取离线安装包在有网络连接的环境中我们需要先下载所有必要的安装包。建议使用一台与目标服务器架构相同的Ubuntu 20.04系统进行下载以避免兼容性问题。# 创建下载目录 mkdir -p ~/docker-offline-install cd ~/docker-offline-install # 下载Docker核心组件 wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/docker-ce-cli_20.10.7~3-0~ubuntu-focal_amd64.deb wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/containerd.io_1.4.9-1_amd64.deb wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/docker-ce_20.10.7~3-0~ubuntu-focal_amd64.deb # 下载Docker Compose wget https://github.com/docker/compose/releases/download/v2.2.1/docker-compose-linux-x86_641.2 传输文件到离线环境将下载好的文件复制到U盘中然后插入目标服务器。建议在U盘根目录创建专门的文件夹存放这些文件便于管理。# 在目标服务器上创建接收目录 sudo mkdir -p /opt/docker-install sudo chown $USER:$USER /opt/docker-install # 挂载U盘并复制文件假设U盘设备为/dev/sdb1 sudo mount /dev/sdb1 /mnt cp -r /mnt/docker-offline-install/* /opt/docker-install/ sudo umount /mnt2. Docker核心组件安装2.1 安装依赖包在安装Docker之前需要确保系统已安装必要的依赖库。即使在没有网络的环境中Ubuntu系统通常也自带这些基础库。# 检查并安装依赖 sudo apt-get update sudo apt-get install -y libltdl7 libseccomp22.2 分步安装Docker组件Docker由多个组件构成需要按照特定顺序安装才能确保依赖关系正确。cd /opt/docker-install # 安装containerd容器运行时 sudo dpkg -i containerd.io_1.4.9-1_amd64.deb # 安装Docker CLI sudo dpkg -i docker-ce-cli_20.10.7~3-0~ubuntu-focal_amd64.deb # 安装Docker引擎 sudo dpkg -i docker-ce_20.10.7~3-0~ubuntu-focal_amd64.deb2.3 验证安装结果安装完成后可以通过以下命令验证Docker是否安装成功# 启动Docker服务 sudo systemctl start docker # 设置开机自启 sudo systemctl enable docker # 检查版本信息 docker --version如果看到类似Docker version 20.10.7, build f0df350的输出说明Docker安装成功。3. Docker Compose安装与配置3.1 安装Docker ComposeDocker Compose是一个单独的可执行文件安装过程相对简单。# 赋予执行权限 sudo chmod x docker-compose-linux-x86_64 # 移动到系统PATH目录 sudo mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose # 验证安装 docker-compose --version3.2 配置镜像加速器可选在离线环境中虽然无法直接使用公共镜像仓库但可以配置内部私有仓库地址。# 创建配置目录 sudo mkdir -p /etc/docker # 编辑配置文件 sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [http://your-private-registry:5000], insecure-registries: [your-private-registry:5000] } EOF # 重启Docker使配置生效 sudo systemctl restart docker4. 常见问题与解决方案4.1 依赖缺失问题问题现象安装过程中出现dpkg: dependency problems prevent configuration错误。解决方案首先检查缺少的具体依赖包sudo dpkg --ignore-dependsmissing-package -i package.deb如果系统中有旧版本的依赖库可以尝试强制安装sudo dpkg --force-depends -i package.deb对于必须的依赖需要提前在有网络的环境中下载好对应的.deb包。4.2 权限不足问题问题现象执行docker命令时提示Got permission denied while trying to connect to the Docker daemon socket。解决方案# 将当前用户加入docker组 sudo usermod -aG docker $USER # 更新组权限需要重新登录生效 newgrp docker4.3 服务启动失败问题现象执行systemctl start docker后服务无法启动。排查步骤查看详细日志journalctl -xe -u docker常见原因及解决方法错误类型解决方案端口冲突修改/etc/docker/daemon.json中的hosts配置存储驱动问题添加storage-driver: vfs到配置文件中内核模块缺失加载所需模块sudo modprobe overlay4.4 镜像导入导出在离线环境中需要提前在有网络的环境中导出所需镜像。导出镜像docker save -o image.tar image:tag导入镜像docker load -i image.tar5. 实际应用部署案例5.1 创建项目目录结构合理的目录结构有助于后期维护和管理。# 创建项目目录 mkdir -p ~/docker-projects/myapp/{config,data,logs} # 典型目录结构 tree ~/docker-projects/myapp5.2 编写docker-compose.yml以下是一个简单的Nginx服务示例version: 3.8 services: web: image: nginx:alpine ports: - 8080:80 volumes: - ./config/nginx.conf:/etc/nginx/nginx.conf - ./data:/usr/share/nginx/html restart: unless-stopped5.3 启动和管理服务# 启动服务 docker-compose up -d # 查看运行状态 docker-compose ps # 停止服务 docker-compose down6. 系统优化与维护6.1 资源限制配置为防止容器占用过多系统资源可以设置限制# 修改docker.service配置 sudo mkdir -p /etc/systemd/system/docker.service.d sudo tee /etc/systemd/system/docker.service.d/limits.conf -EOF [Service] LimitNOFILE1048576 LimitNPROC1048576 LimitCOREinfinity EOF # 重载配置 sudo systemctl daemon-reload sudo systemctl restart docker6.2 日志管理Docker默认的日志驱动可能会占用大量磁盘空间。// 在/etc/docker/daemon.json中添加 { log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 } }6.3 定期维护命令# 清理停止的容器 docker container prune # 清理未使用的镜像 docker image prune -a # 清理构建缓存 docker builder prune在完全离线的环境中部署Docker确实会遇到各种挑战但只要按照上述步骤操作并针对具体问题采用对应的解决方案就能建立起稳定可靠的容器化开发环境。实际部署中建议先在测试环境验证所有步骤确认无误后再在生产环境实施。