docker compose 中的链接和缩放如何协同工作?
How do links and scaling work together in docker compose?
这是我对 docker compose 的理解:
- 您可以 "scale" 一个服务同时在多个容器中 运行 它。
- 如果你link服务A到服务B,服务A可以访问容器运行宁服务B。
我的理解是否正确?如果是这样,如果有多个容器 运行 连接服务,link 连接到哪里?
首先我要澄清的是,默认情况下,无论是否将容器与其他容器链接,所有容器都对同一主机中的其他容器可见 运行(使用容器 IP)。您可以使用 docker 守护程序中的 icc=true
标志更改此行为。
关于docker-compose 的链接,这些是在创建带有链接的容器时生成的。让我们看一个例子。使用这个 docker-compose.yml
web:
build: .
command: python app.py
ports:
- "5000:5000"
volumes:
- .:/code
links:
- redis
redis:
image: redis
在 运行 宁 docker-compose up -d
之后,web_1
容器与具有 redis_1
的容器链接:
(...)
"Links": [
"/compose_redis_1:/compose_web_1/compose_redis_1",
"/compose_redis_1:/compose_web_1/redis",
"/compose_redis_1:/compose_web_1/redis_1"
], (...)
现在我们要使用 docker-compose scale redis=2
扩展 redis
服务。在 运行 绑定它(并创建一个新容器 redis_2
)之后,web_1
中的链接保持不变。
(...)
"Links": [
"/compose_redis_1:/compose_web_1/compose_redis_1",
"/compose_redis_1:/compose_web_1/redis",
"/compose_redis_1:/compose_web_1/redis_1"
], (...)
需要停止、删除和 运行 web_1
才能看到创建的这些链接:
docker-compose stop web
docker-compose rm web
docker-compose run -d web
docker inspect compose_web_run_2
(...) "Links": [
"/compose_redis_1:/compose_web_run_2/compose_redis_1",
"/compose_redis_2:/compose_web_run_2/compose_redis_2",
"/compose_redis_1:/compose_web_run_2/redis",
"/compose_redis_1:/compose_web_run_2/redis_1",
"/compose_redis_2:/compose_web_run_2/redis_2"
],(...)
以及web_1
容器的/etc/hosts
:
172.17.0.24 7be2dabea910
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.21 compose_redis_1 8a1297a5b3e4
172.17.0.23 compose_redis_2 069dd46836aa
172.17.0.21 redis 8a1297a5b3e4 compose_redis_1
172.17.0.21 redis_1 8a1297a5b3e4 compose_redis_1
172.17.0.23 redis_2 069dd46836aa compose_redis_2
因此,要生成新链接,您需要停止、删除并再次 运行 容器。
这是我对 docker compose 的理解:
- 您可以 "scale" 一个服务同时在多个容器中 运行 它。
- 如果你link服务A到服务B,服务A可以访问容器运行宁服务B。
我的理解是否正确?如果是这样,如果有多个容器 运行 连接服务,link 连接到哪里?
首先我要澄清的是,默认情况下,无论是否将容器与其他容器链接,所有容器都对同一主机中的其他容器可见 运行(使用容器 IP)。您可以使用 docker 守护程序中的 icc=true
标志更改此行为。
关于docker-compose 的链接,这些是在创建带有链接的容器时生成的。让我们看一个例子。使用这个 docker-compose.yml
web:
build: .
command: python app.py
ports:
- "5000:5000"
volumes:
- .:/code
links:
- redis
redis:
image: redis
在 运行 宁 docker-compose up -d
之后,web_1
容器与具有 redis_1
的容器链接:
(...)
"Links": [
"/compose_redis_1:/compose_web_1/compose_redis_1",
"/compose_redis_1:/compose_web_1/redis",
"/compose_redis_1:/compose_web_1/redis_1"
], (...)
现在我们要使用 docker-compose scale redis=2
扩展 redis
服务。在 运行 绑定它(并创建一个新容器 redis_2
)之后,web_1
中的链接保持不变。
(...)
"Links": [
"/compose_redis_1:/compose_web_1/compose_redis_1",
"/compose_redis_1:/compose_web_1/redis",
"/compose_redis_1:/compose_web_1/redis_1"
], (...)
需要停止、删除和 运行 web_1
才能看到创建的这些链接:
docker-compose stop web
docker-compose rm web
docker-compose run -d web
docker inspect compose_web_run_2
(...) "Links": [
"/compose_redis_1:/compose_web_run_2/compose_redis_1",
"/compose_redis_2:/compose_web_run_2/compose_redis_2",
"/compose_redis_1:/compose_web_run_2/redis",
"/compose_redis_1:/compose_web_run_2/redis_1",
"/compose_redis_2:/compose_web_run_2/redis_2"
],(...)
以及web_1
容器的/etc/hosts
:
172.17.0.24 7be2dabea910
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.21 compose_redis_1 8a1297a5b3e4
172.17.0.23 compose_redis_2 069dd46836aa
172.17.0.21 redis 8a1297a5b3e4 compose_redis_1
172.17.0.21 redis_1 8a1297a5b3e4 compose_redis_1
172.17.0.23 redis_2 069dd46836aa compose_redis_2
因此,要生成新链接,您需要停止、删除并再次 运行 容器。