docker - 链接和缩放如何在 docker compose 中协同工作?

标签 docker docker-compose

以下是我对 docker compose 的理解:

  • 您可以“扩展”一项服务,使其同时在多个容器中运行。
  • 如果您将服务 A 链接到服务 B,则服务 A 可以访问运行服务 B 的容器。

我的理解是否正确,如果是,如果有多个容器运行服务,链接在哪里连接?

最佳答案

首先我要澄清的是,默认情况下,无论是否将容器与其他容器链接,所有容器都可以看到在同一主机上运行的其他容器(使用容器 IP)。您可以使用 docker daemon 中的 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 - 链接和缩放如何在 docker compose 中协同工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29725955/

相关文章:

permissions - Docker卷,更改文件权限/所有者

postgresql - 我无法从管理员连接到 postgresql

docker - 与 Rancher 的跨容器/主机通信

docker - 在Logstash中使用docker GELF驱动程序env/label

docker - 如何使用 Docker-Compose 从 Hashicorp Vault 存储和检索 secret ?

docker-compose - 命名通过运行 docker-compose 文件构建的镜像

git - Docker:如何从 Github 存储库上的非主分支构建镜像

docker - Spring Boot Docker com.netflix.discovery.shared.transport.TransportException:无法在任何已知服务器上执行请求

docker - 从浏览器查看 Selenium 网格时,当从 docker 使用集线器和节点时,看不到 Selenium 网格正在运行

docker - 在构建阶段将环境变量从 docker-compose 传递到容器