使用Docker Compose运行相同多容器应用程序的副本

时间:2015-12-05 19:25:07

标签: docker

问题

我希望通过将2个容器作为一个整体运行来通过Docker运行webapp。

1个容器运行我的Web服务器(Tomcat 7)。

另一个容器运行我的数据库(Postgres 9.4)。

我可以运行docker-compose up,Docker可以按我docker-compose.yml中指定的方式启动我的两个容器:

web:                                                                                     
  build: .                                                                         
  ports:                                                                           
   - "5000"                                                                        
  links:                                                                           
   - db                                                                         
db:                                                                             
  image: postgres

我希望能够通过再次运行docker-compose up来启动我的webapp的另一个副本,但这会导致Docker告诉我已经有容器正在运行:

$ docker-compose up -d
Creating composetest_db_1
Creating composetest_web_1
$ docker-compose up -d
composetest_db_1 is up-to-date
composetest_web_1 is up-to-date

我的工作

通过使用-p选项为新副本提供不同的项目名称,我解决了这个问题:

$ docker-compose -p project1 up -d
...
Successfully built d3268e345f3d
Creating project1_web_1
$ docker-compose -p project2 up -d
...
Successfully built d3268e345f3d
Creating project2_web_1

不幸的是,这会为每个副本创建新图像:

$ docker images
project1_web          latest              d3268e345f3d        2 hours ago         682 MB
project2_web          latest              d3268e345f3d        2 hours ago         682 MB

问题

有没有办法使用docker-compose通过使用单个图片来启动多容器应用的多个实例?

2 个答案:

答案 0 :(得分:4)

您可以通过指定项目名称(默认为目录名称)来重新使用docker compose模板:

$ docker-compose --project-name inst1 up -d
Creating inst1_web_1

$ docker-compose --project-name inst2 up -d
Creating inst2_web_1

您还可以扩展项目中的容器实例:

$ docker-compose --project-name inst2 scale web=5
Creating and starting 2 ... done
Creating and starting 3 ... done
Creating and starting 4 ... done
Creating and starting 5 ... done

现在应该有6个容器在运行:

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
5e4ab4cebacf        tomcat:8.0          "catalina.sh run"   43 seconds ago      Up 42 seconds       0.0.0.0:32772->8080/tcp   inst2_web_2
ced61f9ac2db        tomcat:8.0          "catalina.sh run"   43 seconds ago      Up 42 seconds       0.0.0.0:32773->8080/tcp   inst2_web_5
efb1ef13147c        tomcat:8.0          "catalina.sh run"   43 seconds ago      Up 42 seconds       0.0.0.0:32771->8080/tcp   inst2_web_4
58e524da3473        tomcat:8.0          "catalina.sh run"   43 seconds ago      Up 42 seconds       0.0.0.0:32770->8080/tcp   inst2_web_3
0f58c3c3b0ed        tomcat:8.0          "catalina.sh run"   2 minutes ago       Up 2 minutes        0.0.0.0:32769->8080/tcp   inst2_web_1
377e3e5b03e4        tomcat:8.0          "catalina.sh run"   2 minutes ago       Up 2 minutes        0.0.0.0:32768->8080/tcp   inst1_web_1

答案 1 :(得分:1)

如果要重用图像,则应独立于撰写脚本构建图像。

run docker build -t somewebapp/web:latest ,

然后更改docker-compose.yml的构建部分以引用图像。