企业级Docker离线部署与中间件容器化实战指南
1. 项目背景与核心价值
在传统企业IT环境和部分特殊场景中,服务器往往无法直接连接互联网进行软件安装。这种环境下,如何快速部署Docker环境并搭建各类中间件服务,成为很多运维工程师的痛点。特别是在金融、政务等行业的安全合规要求下,离线部署能力更是刚需。
我最近为一个制造业客户完成了生产环境中间件集群的离线部署,整套方案基于x86架构服务器,涉及Docker离线安装、镜像导出导入、中间件容器化部署等完整流程。这个过程中积累了不少实战经验,特别是针对不同中间件的配置优化技巧,今天就来系统分享一下。
2. 离线环境准备工作
2.1 基础环境配置
在开始之前,需要确保所有目标服务器满足以下条件:
- 操作系统:CentOS 7.6+ 或 Ubuntu 18.04+(本文以CentOS 7.9为例)
- 架构:x86_64
- 磁盘空间:至少50GB可用空间
- 内存:建议8GB以上
- 已配置本地yum/apt源(可选但推荐)
重要提示:所有服务器的时间必须同步,否则可能导致证书验证失败。建议在离线环境部署NTP服务。
2.2 离线安装包准备
在有网络的环境中准备以下安装包:
- Docker CE 20.10.12版本(较稳定版本)
- docker-compose 1.29.2版本
- 所需中间件的官方镜像(如MySQL、Redis等)
下载Docker离线包:
# 在有网络的机器上执行
mkdir -p ~/docker-offline
cd ~/docker-offline
# 下载Docker安装包及依赖
yum install --downloadonly --downloaddir=./ docker-ce-20.10.12 docker-ce-cli-20.10.12 containerd.io
# 下载docker-compose
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o docker-compose
chmod +x docker-compose
3. Docker离线安装详解
3.1 安装Docker引擎
将准备好的安装包拷贝到目标服务器后,执行以下步骤:
# 安装依赖包
rpm -ivh libseccomp-*.rpm
rpm -ivh containerd.io-*.rpm
rpm -ivh docker-ce-cli-*.rpm
rpm -ivh docker-ce-*.rpm
# 启动Docker服务
systemctl enable docker
systemctl start docker
# 验证安装
docker --version
3.2 配置Docker守护进程
编辑/etc/docker/daemon.json文件(不存在则创建):
{
"data-root": "/data/docker",
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"storage-driver": "overlay2"
}
关键参数说明:
- data-root:指定Docker数据存储路径,避免默认/var分区空间不足
- max-size:限制日志文件大小,防止日志膨胀
- storage-driver:生产环境推荐overlay2
4. 中间件容器化部署实战
4.1 MySQL 8.0部署
先在有网络环境拉取镜像并导出:
docker pull mysql:8.0.27
docker save mysql:8.0.27 > mysql-8.0.27.tar
在离线环境导入镜像:
docker load < mysql-8.0.27.tar
启动容器:
docker run -d \
--name mysql8 \
-p 3306:3306 \
-v /data/mysql/data:/var/lib/mysql \
-v /data/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=your_strong_password \
-e TZ=Asia/Shanghai \
mysql:8.0.27 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
关键优化点:
- 挂载数据卷实现数据持久化
- 通过conf.d目录挂载自定义配置
- 显式设置字符集和时区
4.2 Redis 6.2部署
镜像准备:
docker pull redis:6.2.6
docker save redis:6.2.6 > redis-6.2.6.tar
离线环境启动:
docker run -d \
--name redis6 \
-p 6379:6379 \
-v /data/redis/data:/data \
-v /data/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
redis:6.2.6 \
redis-server /usr/local/etc/redis/redis.conf
配置文件示例(redis.conf):
bind 0.0.0.0
protected-mode no
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
always-show-logo no
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
5. 高级部署方案
5.1 使用docker-compose编排
在有网络环境准备docker-compose二进制文件:
chmod +x docker-compose
mv docker-compose /usr/local/bin/
编写docker-compose.yml示例:
version: '3.8'
services:
mysql:
image: mysql:8.0.27
container_name: mysql8
ports:
- "3306:3306"
volumes:
- /data/mysql/data:/var/lib/mysql
- /data/mysql/conf:/etc/mysql/conf.d
environment:
- MYSQL_ROOT_PASSWORD=your_strong_password
- TZ=Asia/Shanghai
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
restart: always
redis:
image: redis:6.2.6
container_name: redis6
ports:
- "6379:6379"
volumes:
- /data/redis/data:/data
- /data/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf
command: redis-server /usr/local/etc/redis/redis.conf
restart: always
启动服务:
docker-compose up -d
5.2 私有镜像仓库部署
对于大规模部署,建议搭建私有镜像仓库:
- 准备registry镜像:
docker pull registry:2
docker save registry:2 > registry-2.tar
- 离线环境启动registry:
docker run -d \
-p 5000:5000 \
-v /data/registry:/var/lib/registry \
--restart=always \
--name registry \
registry:2
- 推送镜像到私有仓库:
docker tag mysql:8.0.27 localhost:5000/mysql:8.0.27
docker push localhost:5000/mysql:8.0.27
6. 常见问题排查
6.1 容器启动失败排查步骤
- 查看容器日志:
docker logs [容器名/ID]
- 检查端口冲突:
netstat -tunlp | grep [端口号]
- 检查存储卷权限:
ls -ld /data/mysql/data
6.2 典型错误解决方案
问题1:Docker启动时报错"Failed to start Docker Application Container Engine"
解决方案:
# 检查存储驱动是否支持
grep overlay /proc/filesystems
# 如果缺少overlay支持,需要升级内核
问题2:MySQL容器启动后立即退出
可能原因:
- 数据目录权限问题
- 配置文件语法错误
- 内存不足
排查方法:
# 查看详细日志
docker logs mysql8
# 以交互模式启动排查
docker run -it --rm mysql:8.0.27 bash
7. 性能优化建议
- MySQL容器优化:
- 调整innodb_buffer_pool_size(建议物理内存的50-70%)
- 禁用DNS反向解析(添加skip-name-resolve配置)
- 优化表结构和使用索引
- Redis容器优化:
- 根据内存情况设置maxmemory
- 选择合适的淘汰策略(如volatile-lru)
- 启用持久化(RDB+AOF)
- 系统层面优化:
- 调整内核参数(如vm.swappiness=10)
- 使用高性能存储(如SSD)
- 确保足够的swap空间
8. 安全加固措施
- 容器安全:
- 使用非root用户运行容器(--user参数)
- 限制容器资源(--memory, --cpus等)
- 定期更新基础镜像
- 中间件安全:
- 修改默认密码
- 限制访问IP(bind-address)
- 启用TLS加密通信
- 主机安全:
- 定期审计Docker守护进程配置
- 监控容器异常行为
- 备份重要数据卷
9. 备份与恢复方案
9.1 数据卷备份
MySQL备份示例:
# 单次备份
docker exec mysql8 sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > all-databases.sql
# 定时备份(添加到crontab)
0 2 * * * docker exec mysql8 sh -c 'exec mysqldump --all-databases -uroot -p"your_password"' > /backup/mysql-$(date +\%Y\%m\%d).sql
9.2 完整环境迁移
- 导出所有镜像:
docker save $(docker images -q) -o all-images.tar
- 备份数据卷:
tar czvf /backup/data-volumes.tar.gz /data/mysql /data/redis
- 在新环境恢复:
docker load -i all-images.tar
tar xzvf data-volumes.tar.gz -C /
docker-compose up -d
10. 监控与维护
10.1 基础监控方案
使用cAdvisor+Prometheus+Grafana组合:
- 启动cAdvisor容器:
docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest
- 配置Prometheus采集:
scrape_configs:
- job_name: 'docker'
static_configs:
- targets: ['cadvisor:8080']
10.2 日常维护命令
常用维护命令清单:
# 查看容器资源使用情况
docker stats
# 查看磁盘空间使用
docker system df
# 清理无用数据
docker system prune
# 查看容器内进程
docker top [容器名]
# 进入容器终端
docker exec -it [容器名] bash
11. 经验总结与技巧
-
镜像版本固定:始终使用具体版本号(如mysql:8.0.27),避免使用latest标签
-
配置分离:所有中间件配置通过volume挂载,方便修改和版本控制
-
资源限制:为生产容器设置合理的CPU和内存限制,防止单个容器耗尽资源
-
日志管理:使用logrotate管理容器日志,避免日志文件过大
-
健康检查:为关键服务添加健康检查,确保服务可用性
-
文档记录:详细记录每个容器的部署参数和特殊配置,方便后续维护
在实际部署过程中,我发现提前规划好存储目录结构非常重要。建议按以下方式组织:
/data
/docker # Docker根目录
/mysql
/data # 数据库文件
/conf # 配置文件
/backup # 备份文件
/redis
/data # RDB/AOF文件
/conf # 配置文件
/logs # 集中存放日志
这种结构清晰明了,便于备份和迁移。另外,所有挂载卷的权限问题需要特别注意,特别是在SELinux开启的环境下,可能需要额外的安全上下文配置。
更多推荐
所有评论(0)