如何在同一服务器上便捷克隆Docker stack 无需手动重复编写配置?
解决方案
不需要使用Kubernetes
单服务器部署10套轻量隔离环境用原生Docker Compose就能实现,完全没必要引入Kubernetes这类复杂度高的组件,足够满足赛事的临时部署需求。
具体实现步骤
1. 改造通用服务配置模板
把你现有的带编号的docker-compose配置改成无编号的通用模板,只保留单套环境的定义,命名为docker-compose.yml:
version: '3' services: api: image: dockerjohn/tournament:latest environment: - DB=db expose: - 3000 networks: - app-net - traefik-net labels: - "traefik.enable=true" - "traefik.http.routers.${COMPOSE_PROJECT_NAME}.entrypoints=web" - "traefik.http.routers.${COMPOSE_PROJECT_NAME}.rule=Host(`${COMPOSE_PROJECT_NAME}.example.com`)" - "traefik.http.services.${COMPOSE_PROJECT_NAME}.loadbalancer.server.port=3000" - "traefik.docker.network=traefik-net" db: image: mongo:4.0.3 networks: - app-net networks: app-net: traefik-net: external: true
2. 部署自动反向代理组件
放弃手动配置Apache虚拟主机,用Traefik实现容器自动发现和路由配置,单独编写Traefik的部署配置traefik.yml:
version: '3' services: traefik: image: traefik:v2.10 command: - "--providers.docker=true" - "--providers.docker.exposedbydefault=false" - "--entrypoints.web.address=:80" ports: - "80:80" volumes: - "/var/run/docker.sock:/var/run/docker.sock:ro" networks: - traefik-net
先创建公共代理网络,再启动Traefik:
docker network create traefik-net docker-compose -f traefik.yml up -d
3. 一键批量部署所有队伍环境
Docker Compose支持通过COMPOSE_PROJECT_NAME环境变量区分不同的部署栈,每个栈的容器、网络都会自动添加项目名前缀,完全隔离不会冲突。执行一行循环命令就能部署1到10号所有队伍的环境:
for i in {1..10}; do COMPOSE_PROJECT_NAME=team$i docker-compose up -d; done
方案优势
- 所有环境完全隔离,每队的数据库和应用互不干扰
- 不需要手动配置反向代理,Traefik会自动根据
team<编号>.example.com的域名转发请求到对应队伍的应用 - 后续新增队伍只需修改循环范围重新执行命令即可,不需要修改任何配置文件
- 如果需要防止参赛队伍修改容器内代码,可以在api服务配置中添加
read_only: true参数,容器文件系统会被设为只读,重启后所有修改都会重置。
内容的提问来源于stack exchange,提问作者learningtech
相关产品推荐
相关产品推荐

