所以我有以下问题。我正在使用docker-compose来构建和启动两个容器。我使用不同的docker-compose.yml文件(图像和容器名称不同)多次这样做,它工作正常,三个容器并行运行。唯一的区别是,一个容器公开特定端口,另一个容器运行连接到特定端点的应用程序。 总的来说,容器并没有那么不同,但它们是。
但是现在我创建了三个额外的compose配置,并尝试将它们并行运行,就像我已经和其他三个配置一样。现在的问题是,使用docker-compose,正在构建并启动一个容器。但第二个将停止创建的容器并重新创建它。
我尝试docker-compose build --no-cache
之后docker-compose up -d
,但我仍然遇到了同样的问题。虽然图像不同(ID)。在此之前,我尝试使用docker-compose up -d --build
作为第一个和第二个(新)容器,它将像上面提到的那样重新创建。但是看一下图片,他们会得到相同的ID(但名字不同)。
所以我认为docker有缓存问题。这就是为什么我最终删除了所有容器和图像,并从头开始使用上面提到的选项--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
完全相似的问题是没有问题的。
以下是容器失败的两个.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文件和失败的文件没有太大区别。 (或者我错过了什么?)图像和容器名称的更改与暴露的端口和卷路径一样。 所有文件都有自己的工作目录,每个实例也保存应用程序代码。所有使用过的Dockerfiles在每个工作目录中都是相同的。
TL; DR :为什么我的docker-compose没有启动新容器,但停止正在运行的容器并重新创建一个?是否有最大量的运行容器?我的.yml文件中有错误吗?正如开头所提到的--no-cache
没有帮助。
亲切的问候并抱歉那段文字
答案 0 :(得分:8)
简短(ish)回答
在您运行docker-compose up
时,您似乎在某些时候使用相同的项目名称;由于您在ruby
文件之间使用相同的服务名称(即ssl
和docker-compose.yml
),因此Docker Compose将不同的配置视为同一服务的修改,而不是将它们视为单独的服务完全。
我的猜测是某些docker-compose.yml
文件的父目录是相同的,所以如果你想同时运行这些容器,你有几个选择:
docker-compose up
的每次调用中指定不同的项目名称,例如docker-compose -p project1 up -d
,docker-compose -p project2 up -d
docker-compose.yml
文件更长的答案
从快速测试看,Docker Compose似乎使用项目名称和服务名称来标识特定服务。在运行Docker Compose命令时,可以使用-p
标志设置项目名称,否则它将使用COMPOSE_PROJECT_NAME
环境变量的值(如果已设置),如果这两者都未指定,则默认为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
从docker-compose up -d
目录(或使用a/z
)运行docker-compose -f a/z/docker-compose.yml up -d
将在项目ruby
中启动ssl
和z
个服务,使用docker-compose.yml
中指定的容器名称。
如果您从docker-compose up -d
目录运行b/z
,Docker Compose会看到您尝试再次启动项目{{1}中的ruby
和ssl
服务},但这次有一些差异,例如到名称和端口。它会将此视为已修改原始z
,并使用新配置重新启动容器。如果您现在从docker-compose.yml
目录运行docker-compose up -d
,那么您将获得两个与项目{中运行的前两个c/y
和ruby
服务并行运行的新容器{1}}。
因此,您需要确保项目和服务名称的组合在您要运行的不同容器集中有所不同,方法是更改服务名称或每次都以不同方式设置项目。