一、准备工作(在可联网的机器上操作)
1. 下载 Docker 二进制文件
# 创建下载目录
mkdir -p ~/docker-bin && cd ~/docker-bin
# 下载最新稳定版 Docker 二进制包 (x86_64架构)
DOCKER_VERSION="24.0.7"
wget https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz
# 下载 containerd 二进制
CONTAINERD_VERSION="1.7.11"
wget https://github.com/containerd/containerd/releases/download/v${CONTAINERD_VERSION}/containerd-${CONTAINERD_VERSION}-linux-amd64.tar.gz
# 下载 runc 二进制
RUNC_VERSION="1.1.10"
wget https://github.com/opencontainers/runc/releases/download/v${RUNC_VERSION}/runc.amd64
# 下载 docker-compose
DOCKER_COMPOSE_VERSION="2.23.0"
wget https://github.com/docker/compose/releases/download/v${DOCKER_COMPOSE_VERSION}/docker-compose-linux-x86_64
# 打包所有文件
tar czvf docker-binaries.tar.gz *
2. 准备 systemd 服务文件
创建 docker.service
文件:
cat > docker.service <<EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
Requires=docker.socket containerd.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP \$MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
# 创建 docker.socket 文件
cat > docker.socket <<EOF
[Unit]
Description=Docker Socket for the API
PartOf=docker.service
[Socket]
ListenStream=/var/run/docker.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
EOF
# 创建 containerd.service 文件
cat > containerd.service <<EOF
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target
[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/bin/containerd
KillMode=process
Delegate=yes
Restart=always
RestartSec=5
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
[Install]
WantedBy=multi-user.target
EOF
二、离线机器安装步骤
1. 上传并解压文件
# 创建安装目录
sudo mkdir -p /opt/docker-install
sudo mv docker-binaries.tar.gz /opt/docker-install
cd /opt/docker-install
# 解压文件
sudo tar xzvf docker-binaries.tar.gz
2. 安装二进制文件
# 创建目标目录
sudo mkdir -p /usr/bin/docker-bin
# 安装 Docker 二进制
sudo tar xzvf docker-${DOCKER_VERSION}.tgz -C /usr/bin/docker-bin
sudo cp /usr/bin/docker-bin/docker/* /usr/bin/
# 安装 containerd
sudo tar xzvf containerd-${CONTAINERD_VERSION}-linux-amd64.tar.gz -C /usr/bin
# 安装 runc
sudo install -m 755 runc.amd64 /usr/bin/runc
# 安装 docker-compose
sudo install -m 755 docker-compose-linux-x86_64 /usr/bin/docker-compose
# 创建符号链接
sudo ln -s /usr/bin/docker-compose /usr/bin/docker-compose
3. 配置系统服务
# 安装 systemd 服务文件
sudo cp docker.service /etc/systemd/system/
sudo cp docker.socket /etc/systemd/system/
sudo cp containerd.service /etc/systemd/system/
# 创建 docker 用户组
sudo groupadd docker
# 创建必要目录
sudo mkdir -p /etc/docker
sudo mkdir -p /var/lib/docker
sudo mkdir -p /var/run/docker
# 配置 cgroup 驱动
sudo tee /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
# 加载内核模块
sudo modprobe overlay
sudo modprobe br_netfilter
# 配置系统参数
sudo tee /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
sudo sysctl --system
4. 启动 Docker 服务
# 重新加载 systemd
sudo systemctl daemon-reload
# 启用并启动服务
sudo systemctl enable containerd
sudo systemctl start containerd
sudo systemctl enable docker.socket
sudo systemctl start docker.socket
sudo systemctl enable docker
sudo systemctl start docker
# 验证服务状态
sudo systemctl status docker
5. 配置用户权限
# 将当前用户加入 docker 组
sudo usermod -aG docker $USER
# 应用组变更(需要重新登录生效)
newgrp docker
6. 验证安装
# 检查 Docker 版本
docker version
# 运行测试容器
docker run --rm hello-world
# 检查 docker-compose
docker-compose version
三、常见问题解决
1. 内核模块问题
# 检查 overlay 文件系统支持
grep overlay /proc/filesystems
# 如果缺少 overlay 支持
echo "overlay" | sudo tee -a /etc/modules
sudo modprobe overlay
2. 存储驱动问题
# 检查支持的存储驱动
docker info | grep "Storage Driver"
# 如果使用 overlay2 需要内核支持
sudo grep overlay /proc/filesystems
# 修改存储驱动(编辑 /etc/docker/daemon.json)
"storage-driver": "vfs" # 兼容性最好但性能较差
3. 权限问题
# 修复 /var/run/docker.sock 权限
sudo chown root:docker /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock
4. 镜像导入(可选)
# 在有网机器上导出镜像
docker save -o ubuntu-image.tar ubuntu:20.04
# 在离线机器上导入
docker load -i ubuntu-image.tar
四、卸载 Docker
# 停止 Docker 服务
sudo systemctl stop docker
sudo systemctl stop containerd
sudo systemctl disable docker
sudo systemctl disable containerd
# 删除二进制文件
sudo rm -f /usr/bin/docker*
sudo rm -f /usr/bin/containerd*
sudo rm -f /usr/bin/ctr
sudo rm -f /usr/bin/runc
sudo rm -f /usr/bin/docker-compose
# 删除服务文件
sudo rm /etc/systemd/system/docker.service
sudo rm /etc/systemd/system/docker.socket
sudo rm /etc/systemd/system/containerd.service
# 删除配置和数据
sudo rm -rf /etc/docker
sudo rm -rf /var/lib/docker
sudo rm -rf /var/run/docker
# 删除用户组
sudo groupdel docker
# 重新加载 systemd
sudo systemctl daemon-reload
五、注意事项
- 内核要求:Docker 需要 Linux 内核 3.10 以上,推荐 4.x 版本
uname -r # 检查内核版本
- 架构兼容性:确保下载的二进制文件与系统架构匹配(x86_64/arm64)
- 版本兼容:保持 Docker、containerd 和 runc 版本兼容
- 生产环境:建议配置以下安全设置:
-
- 启用用户命名空间
- 配置 AppArmor/SELinux
- 启用内容信任
- 限制容器权限
- 离线镜像管理:建议搭建私有镜像仓库管理离线镜像
二进制安装方式适合无法使用包管理器的环境,但更新和维护相对复杂。对于生产环境,建议使用离线包管理器安装或容器化部署方案。