如何通过Docker Compose配置隔离网络,实现air-gapped环境测试?
构建离线(Air-Gapped)Docker环境的跨平台方案
不需要额外Docker驱动,直接用Docker Compose自带的网络配置就能实现「容器仅能访问compose定义的服务、无法连接互联网」的需求,且方案完全跨平台(Linux、Windows Docker Desktop、macOS Docker Desktop通用)。
核心实现思路
通过定义内部专属网络,让所有服务仅加入该网络。Docker的internal: true网络属性会限制该网络内的容器只能互相通信,无法主动访问外部网络(包括互联网),同时外部网络也无法访问容器(无需额外防火墙规则)。
Docker Compose 配置示例
version: '3.8' # 定义离线专用内部网络 networks: offline-backup-test: internal: true # 核心配置:禁用外网访问,仅允许网络内服务互通 services: # PostgreSQL 服务:自动恢复备份 postgres: image: postgres:15 environment: POSTGRES_USER: prod_user POSTGRES_PASSWORD: prod_pass POSTGRES_DB: prod_db volumes: # 挂载本地恢复用的备份文件(提前放到离线环境) - ./prod_backup.sql:/docker-entrypoint-initdb.d/restore.sql # 可选:持久化数据库数据到本地 - ./postgres_data:/var/lib/postgresql/data networks: - offline-backup-test # 应用服务:连接恢复后的数据库 app: # 提前在有网环境构建/拉取镜像,离线环境导入 image: your-prod-app:latest environment: DB_HOST: postgres DB_PORT: 5432 DB_USER: prod_user DB_PASSWORD: prod_pass DB_NAME: prod_db # 按需添加应用的离线配置,比如禁用外部通知功能 DISABLE_EXTERNAL_NOTIFICATIONS: "true" depends_on: - postgres networks: - offline-backup-test
离线环境准备步骤
- 镜像离线导入:在有网络环境拉取所需镜像,导出后拷贝到离线机器:
# 拉取镜像 docker pull postgres:15 docker pull your-prod-app:latest # 导出为tar包 docker save postgres:15 -o postgres.tar docker save your-prod-app:latest -o app.tar # 离线机器导入 docker load -i postgres.tar docker load -i app.tar - 备份文件与应用配置:将生产数据库备份文件、应用离线配置文件提前拷贝到离线机器的compose目录下。
网络连通性验证
启动服务后,进入容器验证网络限制:
# 进入应用容器 docker exec -it <app-container-name> /bin/bash # 测试访问互联网(应失败) ping google.com # 测试访问PostgreSQL服务(应成功) ping postgres
跨平台兼容性说明
此方案依赖Docker Compose的标准网络配置,internal: true属性在Linux、Windows Docker Desktop、macOS Docker Desktop上均得到原生支持,无需针对不同系统做额外调整。
额外注意事项
- 如果应用存在依赖外部资源的逻辑(如第三方API、邮件通知),需在配置中明确禁用该功能,避免应用因无法访问外网而报错。
- 无需配置端口映射(
ports字段),防止外部网络意外访问容器,保持环境的离线隔离性。
内容的提问来源于stack exchange,提问作者tftd
相关产品推荐
相关产品推荐

