离线环境下的Docker全家桶RedisNginxMySQLMinio一键部署避坑指南在企业内网或隔离环境中部署完整的开发环境往往面临无外网连接、镜像传输受限、配置冲突等挑战。本文将分享一套经过实战验证的离线Docker部署方案涵盖Redis、Nginx、MySQL和Minio四大核心服务重点解决镜像验证、端口规划、统一管理和离线仓库搭建等关键问题。1. 离线环境准备与镜像安全验证1.1 离线资源获取与完整性校验在隔离环境中所有Docker镜像和安装包都需要预先下载并传输到目标服务器。为确保文件传输过程中不被篡改或损坏建议采用以下校验流程# 计算文件的SHA256哈希值 sha256sum docker-redis.tar sha256sum docker-mysql.tar sha256sum nginx-1.26.1.tar sha256sum minio.tar.gz # 对比预存的哈希值清单 cat EOF expected_hashes.txt a1b2c3d4... docker-redis.tar e5f6g7h8... docker-mysql.tar i9j0k1l2... nginx-1.26.1.tar m3n4o5p6... minio.tar.gz EOF sha256sum -c expected_hashes.txt注意实际使用时需替换为真实的哈希值校验失败的文件必须重新传输1.2 Docker离线安装与配置优化对于无外网连接的服务器Docker的安装需要特别注意以下配置项存储驱动选择推荐使用overlay2而非默认的devicemapper日志轮转防止日志文件无限增长资源限制合理配置CPU和内存使用上限创建/etc/docker/daemon.json配置文件{ storage-driver: overlay2, log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 }, default-ulimits: { nofile: { Name: nofile, Hard: 65535, Soft: 65535 } } }2. 多容器端口规划与网络隔离2.1 端口分配模板为避免服务端口冲突建议采用以下端口分配策略服务容器端口宿主机端口协议用途说明Redis637916379TCP数据库访问MySQL330613306TCP数据库管理Nginx8018080TCPWeb服务Minio900019000TCPAPI接口Minio909019090TCP控制台访问2.2 自定义网络创建默认的bridge网络可能导致IP冲突建议为应用创建独立的网络docker network create --subnet172.22.0.0/24 app_network在docker-compose.yml中指定网络networks: app_net: driver: bridge ipam: config: - subnet: 172.22.0.0/243. Docker Compose统一管理方案3.1 编排文件结构设计完整的docker-compose.yml应包含以下核心部分version: 3.8 services: redis: image: redis:latest ports: [16379:6379] volumes: [./config/redis:/usr/local/etc/redis] networks: [app_net] restart: unless-stopped mysql: image: mysql:8.0 ports: [13306:3306] volumes: [./data/mysql:/var/lib/mysql, ./config/mysql:/etc/mysql/conf.d] environment: MYSQL_ROOT_PASSWORD: secure_password networks: [app_net] nginx: image: nginx:1.25 ports: [18080:80, 18443:443] volumes: [./config/nginx:/etc/nginx, ./html:/usr/share/nginx/html] depends_on: [redis, mysql] networks: [app_net] minio: image: minio/minio ports: [19000:9000, 19090:9090] volumes: [./data/minio:/data] environment: MINIO_ROOT_USER: admin MINIO_ROOT_PASSWORD: change_this_password command: server /data --console-address :9090 networks: [app_net] networks: app_net: driver: bridge3.2 配置分离最佳实践将各服务的配置文件与数据分离存储. ├── docker-compose.yml ├── config │ ├── redis │ │ └── redis.conf │ ├── mysql │ │ └── my.cnf │ └── nginx │ ├── nginx.conf │ └── conf.d │ └── default.conf ├── data │ ├── mysql │ └── minio └── html └── index.html4. 离线镜像仓库搭建与维护4.1 私有Registry部署在隔离环境中搭建本地镜像仓库docker run -d -p 5000:5000 --restartalways --name registry \ -v /opt/registry:/var/lib/registry \ registry:2将镜像推送到私有仓库docker tag redis:latest localhost:5000/redis docker push localhost:5000/redis4.2 批量导入导出技巧导出所有需要的镜像docker save -o offline-images.tar \ redis:latest \ mysql:8.0 \ nginx:1.25 \ minio/minio \ registry:2在目标服务器加载镜像docker load -i offline-images.tar5. 常见问题排查与性能优化5.1 容器网络连通性测试使用docker exec进入容器测试服务连通性# 测试Redis连接 docker exec -it redis_container redis-cli -h redis -p 6379 PING # 测试MySQL连接 docker exec -it mysql_container mysql -h mysql -P 3306 -u root -p5.2 资源监控与限制通过docker stats实时监控资源使用情况CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS a1b2c3d4e5f6 redis 0.50% 45.23MiB / 1GiB 4.42% 1.2MB / 856kB 0B / 0B 5 g7h8i9j0k1l2 mysql 3.20% 320.54MiB / 2GiB 15.65% 5.6MB / 2.1MB 0B / 0B 27在docker-compose.yml中设置资源限制services: mysql: deploy: resources: limits: cpus: 2 memory: 2G reservations: cpus: 0.5 memory: 512M实际部署中遇到的最棘手问题是Nginx容器频繁重启最终发现是配置文件中的worker_processes设置过高导致内存不足。将配置调整为worker_processes auto;后问题解决这个经验告诉我们离线环境下更需要关注资源分配的合理性