Docker不是创build新的容器,而是重新创build一个新的容器

所以我有以下问题。 我使用docker-compose来构build并启动两个容器。 我多次使用不同的docker-compose.yml文件(图像和容器名称不同),它工作正常,三个容器并行运行。 唯一的区别是,一个容器暴露特定的端口,另一个容器运行连接到特定端点的应用程序。 所以总的来说容器并没有那么不同,但它们是。

但现在我创build了三个额外的组合configuration,并试图平行运行它们,就像我已经与其他三个组合一样。 现在的问题是,用docker-compose,一个容器正在构build和启动。 但是第二个将停止创build的容器并重新创build它。 我试图做docker-compose build --no-cache ,之后docker-compose up -d ,但是我仍然遇到了同样的问题。 图像虽然是不同的(ID)。 在此之前,我只是用docker-compose up -d --build生成第一个和第二个(新)容器,然后像上面提到的那样重新创build它。 但看着图像,他们会得到相同的ID(但不同的名称)。

所以我认为docker工人有一个caching的问题。 这就是为什么我最终删除了所有的容器和图像,并从头开始使用上面提到的选项--no-cache 。 虽然没有工作。

这里有两个docker-compose.yml工作:

 version: '2' services: ruby: security_opt: - seccomp:unconfined build: context: . dockerfile: Dockerfile_ruby args: - http_proxy=http://someIP:3128 - https_proxy=http://someIP:3128 image: ruby_foo_ge01 container_name: ruby_container_ge01 volumes: - /home/foo/log/GE01/:/usr/src/app/log/ ssl: security_opt: - seccomp:unconfined build: context: . dockerfile: Dockerfile_ssl args: - http_proxy=http://someIP:3128 - https_proxy=http://someIP:3128 image: ssl_ge01 container_name: ssl_container_ge01 volumes: - /home/foo/log/GE01/nginx/:/var/log/nginx/ ports: - "3003:443" links: - ruby 

另一个:

 version: '2' services: ruby: security_opt: - seccomp:unconfined build: context: . dockerfile: Dockerfile_ruby args: - http_proxy=http://someIP:3128 - https_proxy=http://someIP:3128 image: ruby_foo container_name: ruby_container volumes: - /home/foo/log/:/usr/src/app/log/ ssl: security_opt: - seccomp:unconfined build: context: . dockerfile: Dockerfile_ssl args: - http_proxy=http://someIP:3128 - https_proxy=http://someIP:3128 image: ssl_gt01 container_name: ssl_container volumes: - /home/foo/log/nginx/:/var/log/nginx/ ports: - "3001:443" links: - ruby 

运行这两个和docker-compose up -d --build非常相似的东西docker-compose up -d --build是没问题的。

这里有两个失败的容器的.yml文件:

 version: '2' services: ruby: security_opt: - seccomp:unconfined build: context: . dockerfile: Dockerfile_ruby args: - http_proxy=http://someIP:3128 - https_proxy=http://someIP:3128 image: ruby_foo_websock_gt01 container_name: ruby_containerWSgt01 volumes: - /home/foo/websockGT01/log/:/usr/src/app/log/ ssl: security_opt: - seccomp:unconfined build: context: . dockerfile: Dockerfile_ssl args: - http_proxy=http://someIP:3128 - https_proxy=http://someIP:3128 image: ssl_websock_gt01 container_name: ssl_containerWSgt01 volumes: - /home/foo/websockGT01/log/nginx/:/var/log/nginx/ ports: - "3010:443" links: - ruby 

第二个:

 version: '2' services: ruby: security_opt: - seccomp:unconfined build: context: . dockerfile: Dockerfile_ruby args: - http_proxy=http://someIP:3128 - https_proxy=http://someIP:3128 image: ruby_foo_websock_ge01 container_name: ruby_containerWSge01 volumes: - /home/foo/websockGE01/log/:/usr/src/app/log/ ssl: security_opt: - seccomp:unconfined build: context: . dockerfile: Dockerfile_ssl args: - http_proxy=http://someIP:3128 - https_proxy=http://someIP:3128 image: ssl_websock_ge01 container_name: ssl_containerWSge01 volumes: - /home/foo/websockGE01/log/nginx/:/var/log/nginx/ ports: - "3030:443" links: - ruby 

正如你所看到的,在工作的.yml文件和失败的文件中没有太大的区别。 (或者我错过了什么?)图像和容器名称会改变,就像暴露的端口和卷path一样。 所有的文件都有自己的工作目录,每个实例也保存应用程序代码。 所有使用的Dockerfiles在每个工作目录中都是相同的。

TL; DR :为什么我的docker组成员没有启动一个新的容器,而是停止正在运行的容器并重新创build一个容器? 有最大数量的正在运行的容器吗? 我有没有在我的.yml文件中做错了什么? 正如开头提到的--no-cache没有帮助。

亲切的问候和遗憾的墙壁的文字

短(ish)答案

看起来好像你在运行docker-compose up的时候使用相同的项目名称。 由于您在docker-compose.yml文件之间使用相同的服务名称(即, rubyssl ),因此Docker Compose会将不同的configuration视为同一服务的修改,而不是将它们视为完全独立的服务。

我的猜测是一些docker-compose.yml文件的父目录是相同的,所以如果你想同时运行这些容器,你有几个select:

  • 更改父目录的名称,使它们都不同
  • 在每次调用docker-compose up指定一个不同的项目名称,例如docker-compose -p project1 up -ddocker-compose -p project2 up -d
  • 更改服务名称,使它们在不同docker-compose.yml文件中不docker-compose.yml

较长的答案

从快速testing看来,Docker Compose使用项目名称和服务名称来标识特定的服务。 当运行Docker Compose命令时,可以使用-p标志设置项目名称,否则使用COMPOSE_PROJECT_NAME环境variables的值(如果已设置),并且如果没有指定它们,则默认为父目录的名称docker-compose.yml文件(请参阅https://docs.docker.com/compose/reference/overview )。

所以,给定一个目录结构如:

 . ├── a │  └── z │  └── docker-compose.yml ├── b │  └── z │  └── docker-compose.yml └── c  └── y  └── docker-compose.yml 

a/z目录运行docker-compose up -d (或使用docker-compose -fa/z/docker-compose.yml up -d )将在项目z启动rubyssl服务,使用在docker-compose.yml

如果你从b/z目录运行docker-compose up -d ,Docker Compose将会看到你尝试在项目z再次调出rubyssl服务,但是这次有一些不同,例如名字和端口。 它会把这个看作是你修改了原来docker-compose.yml ,然后用新的configuration重新启动容器。 如果现在要从c/y目录运行docker-compose up -d ,那么你将得到两个新的容器,与项目y运行的前两个rubyssl服务并行运行。

因此,您需要确保项目和服务名称的组合在要运行的不同容器集之间有所不同,或者通过更改服务名称或每次以不同的方式设置项目。