1. 为什么选择二进制方式部署Docker
在容器化技术普及的今天,大多数用户习惯通过包管理器直接安装Docker,但二进制部署方式依然有其独特的应用场景。我最近在生产环境中就遇到了这样一个案例:客户服务器处于严格的内网隔离环境,无法连接外部仓库,且系统版本较旧(CentOS 7.9),常规的yum安装方式存在依赖冲突。这种情况下,二进制部署就成了最可靠的解决方案。
二进制包部署的核心优势在于:
- 环境隔离性强:不依赖系统自带的库文件,避免因系统版本老旧导致的依赖问题
- 离线部署能力:适合无外网连接的安全敏感环境
- 版本控制灵活:可以精确控制安装的Docker版本
- 干净卸载:直接删除目录即可完成卸载,不会残留配置文件
重要提示:二进制部署的Docker不会自动创建docker用户组,需要手动配置,否则普通用户将无法执行docker命令。这是与包管理器安装方式的主要差异点之一。
2. 部署前的环境准备
2.1 系统环境检查
在开始部署前,我们需要对目标服务器进行基础检查。以下是我在实际操作中总结的检查清单:
bash复制# 检查内核版本(需3.10以上)
uname -r
# 检查系统架构(确认与下载的二进制包匹配)
arch
# 检查SElinux状态(建议禁用)
getenforce
# 检查防火墙规则(需开放相关端口)
iptables -L -n
# 检查已有Docker进程(避免冲突)
ps aux | grep docker
对于CentOS 7.x系统,还需要特别注意:
- 确保已安装基础依赖:
yum install -y libtool-ltdl iptables - 关闭firewalld(如使用iptables):
systemctl stop firewalld - 创建必要的目录结构:
mkdir -p /etc/docker
2.2 二进制包选择策略
Docker官方提供了多个版本的二进制包,选择时需要考虑:
-
版本分支:
- 稳定版(Stable):版本号第二位为偶数,如20.10.x
- 开发版(Edge):版本号第二位为奇数,如23.0.x
-
架构匹配:
- x86_64:标准Intel/AMD架构
- aarch64:ARM架构(如树莓派、国产化设备)
-
功能需求:
- 是否需要containerd集成
- 是否需要内置Kubernetes支持
我建议生产环境选择最新的稳定版,目前(2023年)推荐使用20.10.x系列。下载地址为:
code复制https://download.docker.com/linux/static/stable/x86_64/
3. 详细部署步骤
3.1 安装包处理
将下载的docker-
bash复制# 解压到/usr/local目录
tar -zxvf docker-26.1.4.tgz -C /usr/local
# 创建符号链接(方便版本管理)
ln -s /usr/local/docker /usr/local/docker-26.1.4
# 将二进制文件加入PATH
echo 'export PATH=/usr/local/docker:$PATH' >> /etc/profile
source /etc/profile
3.2 系统服务配置
二进制安装不会自动创建systemd服务,需要手动配置:
- 创建服务文件
/etc/systemd/system/docker.service:
ini复制[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/local/docker/dockerd \
--exec-opt native.cgroupdriver=systemd \
--data-root=/var/lib/docker \
--log-level=warn
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
- 重载并启动服务:
bash复制systemctl daemon-reload
systemctl enable docker
systemctl start docker
3.3 用户权限配置
默认情况下,只有root能执行docker命令。为普通用户授权:
bash复制# 创建docker用户组
groupadd docker
# 将用户加入组
usermod -aG docker $USER
# 验证权限
newgrp docker
docker ps
4. 关键配置优化
4.1 存储驱动选择
Docker支持多种存储驱动,生产环境推荐:
- overlay2(默认):性能好,兼容性强
- devicemapper:适合直接使用块设备的场景
配置方法(在服务文件中添加):
code复制--storage-driver=overlay2
4.2 日志管理
防止日志文件无限增长:
json复制// /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
4.3 网络配置
优化容器网络性能:
bash复制# 启用IP转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
# 配置DNS(避免容器内解析失败)
echo '{"dns": ["8.8.8.8", "114.114.114.114"]}' > /etc/docker/daemon.json
5. 常见问题排查
5.1 服务启动失败
现象:systemctl start docker报错
排查步骤:
- 查看详细日志:
journalctl -xe -u docker - 检查端口冲突:
netstat -tulnp | grep 2375 - 手动启动调试:
/usr/local/docker/dockerd --debug
5.2 容器网络不通
现象:容器无法访问外网
解决方案:
bash复制# 检查iptables规则
iptables -L -n
# 允许NAT转发
iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -j MASQUERADE
5.3 存储空间不足
现象:No space left on device
处理方法:
bash复制# 查看存储使用
docker system df
# 清理无用数据
docker system prune -a -f
# 修改数据目录(需在服务文件中修改--data-root参数)
6. 生产环境建议
经过多次部署实践,我总结出以下经验:
- 版本控制:在/usr/local下保留多个版本目录,通过符号链接切换版本
- 备份策略:定期备份/var/lib/docker和/etc/docker目录
- 监控配置:为dockerd进程设置监控,检测异常重启
- 安全加固:
- 配置TLS证书保护API端口
- 限制容器能力:
--cap-drop=ALL --cap-add=NET_ADMIN
- 性能调优:
- 调整ulimit:
ulimit -n 65535 - 使用高性能日志驱动(如journald)
- 调整ulimit:
这种部署方式虽然步骤稍多,但在特定环境下能提供更高的可控性。我在金融行业的生产环境中采用此方案,成功实现了在老旧系统上的稳定容器化部署。