1. Docker离线安装基础准备
在x86架构服务器上离线部署Docker需要提前做好以下准备工作。首先需要确认服务器操作系统版本和内核版本,建议使用CentOS 7.6+或Ubuntu 18.04+等主流Linux发行版,内核版本不低于3.10。
重要提示:离线环境意味着所有依赖包都需要预先下载,建议在相同版本的有网络环境中准备安装包,避免因系统版本差异导致兼容性问题。
1.1 安装包获取与传输
从Docker官方下载地址获取最新稳定版的静态二进制包:
code复制https://download.docker.com/linux/static/stable/x86_64/
选择适合的版本(如docker-23.0.6.tgz)下载后,通过以下方式传输到目标服务器:
- 使用U盘等物理介质拷贝
- 通过内网文件共享服务传输
- 使用scp命令在可信网络内传输
传输完成后,建议将安装包放在/opt目录下:
bash复制mkdir -p /opt/docker_offline
mv docker-23.0.6.tgz /opt/docker_offline/
1.2 系统依赖检查
即使使用静态二进制包,仍需要确认系统基础依赖:
bash复制# 检查基础工具
which tar gzip
# 检查内核模块
lsmod | grep overlay
如果缺少必要工具,需要从系统安装镜像中获取对应的rpm/deb包离线安装。特别是以下关键组件:
- tar
- gzip
- iptables
- libseccomp
- device-mapper
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Docker离线安装步骤详解
2.1 解压安装包
进入安装目录并解压:
bash复制cd /opt/docker_offline
tar xzvf docker-23.0.6.tgz
解压后会得到包含docker二进制文件的目录,需要将这些文件移动到系统PATH路径:
bash复制sudo cp docker/* /usr/bin/
2.2 创建系统服务
为了让Docker以服务形式运行,需要创建systemd配置文件:
- 创建服务文件:
bash复制sudo tee /etc/systemd/system/docker.service <<-'EOF'
[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/bin/dockerd
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
EOF
- 设置权限并重载服务:
bash复制sudo chmod 644 /etc/systemd/system/docker.service
sudo systemctl daemon-reload
2.3 启动与验证
启动Docker服务并设置开机自启:
bash复制sudo systemctl enable docker
sudo systemctl start docker
验证安装是否成功:
bash复制sudo docker version
sudo docker run hello-world
常见问题:如果出现"permission denied"错误,需要将当前用户加入docker组:
bash复制sudo groupadd docker sudo usermod -aG docker $USER newgrp docker
3. 中间件容器化部署实战
3.1 MySQL 8.0离线部署
3.1.1 镜像准备
在有网络环境中导出镜像:
bash复制docker pull mysql:8.0
docker save -o mysql8.tar mysql:8.0
将mysql8.tar传输到目标服务器后加载:
bash复制docker load -i mysql8.tar
3.1.2 配置文件准备
创建数据目录和配置文件:
bash复制mkdir -p /data/mysql/{conf,data,logs}
编辑配置文件/data/mysql/conf/my.cnf:
ini复制[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
log-error = /var/log/mysql/error.log
symbolic-links = 0
max_connections = 2000
max_user_connections = 1900
max_connect_errors = 100000
max_allowed_packet = 50M
lower_case_table_names=1
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default_authentication_plugin=mysql_native_password
3.1.3 容器启动
执行启动命令:
bash复制docker run -d \
--name mysql8 \
-p 3306:3306 \
--restart always \
-v /data/mysql/conf:/etc/mysql/conf.d \
-v /data/mysql/data:/var/lib/mysql \
-v /data/mysql/logs:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=yourpassword \
mysql:8.0
3.1.4 主从复制配置
主库配置增加:
ini复制log-bin=mysql-bin
server-id=1
binlog_expire_logs_seconds=604800
从库配置:
ini复制server-id=2
log-bin=mysql-bin
binlog_expire_logs_seconds=604800
主库创建复制用户:
sql复制CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
从库配置复制:
sql复制CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;
3.2 Redis离线部署
3.2.1 镜像准备
导出Redis镜像:
bash复制docker pull redis:6.2
docker save -o redis6.tar redis:6.2
加载镜像:
bash复制docker load -i redis6.tar
3.2.2 配置文件定制
创建配置文件/data/redis/redis.conf:
ini复制port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
3.2.3 容器启动
启动Redis容器:
bash复制docker run -d \
--name redis \
-p 6379:6379 \
-v /data/redis/redis.conf:/usr/local/etc/redis/redis.conf \
-v /data/redis/data:/data \
--restart always \
redis:6.2 redis-server /usr/local/etc/redis/redis.conf
3.3 Nginx离线部署
3.3.1 使用NginxWebUI
导出镜像:
bash复制docker pull cym1102/nginxwebui:latest
docker save -o nginxwebui.tar cym1102/nginxwebui:latest
加载并运行:
bash复制docker load -i nginxwebui.tar
docker run -d \
--name=nginxWebUI \
--restart=always \
-v /data/nginxWebUI:/home/nginxWebUI \
-e BOOT_OPTIONS="--server.port=8080" \
--net=host \
cym1102/nginxwebui:latest
访问管理界面:
code复制http://服务器IP:8080
4. 常见问题与解决方案
4.1 容器网络问题
问题现象:容器无法访问外部网络
解决方案:
- 检查防火墙设置:
bash复制sudo systemctl stop firewalld
sudo iptables -F
- 检查网络插件:
bash复制docker network ls
docker network inspect bridge
- 重启Docker服务:
bash复制sudo systemctl restart docker
4.2 存储驱动问题
问题现象:容器启动报存储驱动错误
解决方案:
- 检查当前存储驱动:
bash复制docker info | grep Storage
- 修改为overlay2驱动:
bash复制sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"storage-driver": "overlay2"
}
EOF
sudo systemctl restart docker
4.3 镜像导入失败
问题现象:docker load报错"no space left on device"
解决方案:
- 检查Docker存储空间:
bash复制docker system df
- 清理无用资源:
bash复制docker system prune -a
- 修改Docker数据目录(如有更大空间分区):
bash复制sudo systemctl stop docker
sudo rsync -aP /var/lib/docker /new/path/
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"data-root": "/new/path/docker"
}
EOF
sudo systemctl start docker
5. 性能优化建议
5.1 容器资源限制
为关键中间件容器设置资源限制:
bash复制docker update \
--cpus 2 \
--memory 4g \
--memory-swap 4g \
mysql8
5.2 日志轮转配置
防止容器日志占用过多磁盘空间:
bash复制sudo tee /etc/docker/daemon.json <<-'EOF'
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
EOF
sudo systemctl restart docker
5.3 内核参数调优
优化系统参数以支持更多容器:
bash复制echo "vm.max_map_count=262144" >> /etc/sysctl.conf
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
6. 安全加固措施
6.1 容器用户隔离
避免以root用户运行容器:
bash复制docker run -d \
--name mysql_secure \
--user 1000:1000 \
-v /data/mysql:/var/lib/mysql \
mysql:8.0 \
--default-authentication-plugin=mysql_native_password
6.2 网络隔离
为敏感服务创建独立网络:
bash复制docker network create internal
docker run -d --net=internal --name db mysql:8.0
docker run -d --net=internal --name app your_app_image
6.3 镜像扫描
虽然离线环境无法使用在线扫描工具,但仍可:
- 在有网络环境扫描后再部署
- 使用Trivy等工具的离线数据库
- 定期检查容器漏洞:
bash复制docker exec -it container_id sh -c "apk update && apk upgrade"
