以下是我对docker撰写的理解:
我的理解是否正确,如果是,如果有多个容器运行该服务,链接在哪里连接?
答案 0 :(得分:30)
首先,我要澄清一下,默认情况下,无论是否将容器与其他容器相关联,所有容器都可以看到在同一主机中运行的其他容器(使用容器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"
], (...)
现在我们要使用redis
扩展docker-compose scale redis=2
服务。运行它(并创建一个新容器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"
],(...)
/etc/hosts
容器的web_1
:
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
因此,要生成新链接,您需要停止,删除并再次运行容器。