【问题标题】:How to link one docker service with other docker service?如何将一个 docker 服务与其他 docker 服务链接?
【发布时间】:2018-08-27 01:23:43
【问题描述】:

我有 12 个码头集装箱。当我单独运行时,我可以使用 --link 来连接其中的一些,例如带有 mysql db 的 web 应用程序链接。但是当我在 docker swarm 中将它们作为服务运行(如 docker create service)时,我无法链接它们,因为 --link 不适用于 docker service create 命令。 如果我使用 docker-compose.yml 文件来运行所有容器,我可以链接起来。但这是另一个问题。 假设我在 docker-compose 文件或 docker stack 中有 12 个不同的容器(组件),我该如何更新单个容器或组件?我是否必须重新部署整个 docker 堆栈?

【问题讨论】:

  • 我使用单独的 yml 文件,然后使用 docker-compose -f file1.yml -f file2.yml 等。您可以在 Docker 中创建一个命名网络,然后让您的服务都使用该网络,因此见一面。
  • 是的,链接已折旧。 docs.docker.com/network/links
  • 当你想更新一个swarm stack时,你使用同样的docker stack deploy命令,它只会更新改变的网络和服务。

标签: docker docker-compose docker-swarm


【解决方案1】:

你只需要在每个 docker-compose.yml 文件中将你的容器放在同一个网络中。

首先你需要用 docker 创建一个网络:

docker network create -d bridge custom 

在您需要将 docker-compose 文件中的网络更改为新网络之后,如果您愿意,可以使用 external_links,例如:

示例文件 1:

version: '3'
services:
  php-server:
    container_name: myphp
    image: devilxatoms/taproject:latest
    ports:
     - "9000:9000"
    external_links:
      - mysql:mysql
    networks:
      - custom

networks:
  custom:
    external: true

示例文件 2:

version: '3'
    services:
      mysql:
        container_name: mydb
        image: mysql:latest
        restart: always
        environment:
          - MYSQL_ROOT_PASSWORD=root
        ports:
         - "3306:3306"
        networks:
          - custom

    networks:
      custom:
        external: true

为了测试它,我只访问了我的 mysql 容器的 bash 并向另一个容器发送 ping:

MySQL 容器:

# ping php-server
PING php-server (172.26.0.3) 56(84) bytes of data.
64 bytes from myphp.custom (172.26.0.3): icmp_seq=1 ttl=64 time=0.124 ms
64 bytes from myphp.custom (172.26.0.3): icmp_seq=2 ttl=64 time=0.368 ms
64 bytes from myphp.custom (172.26.0.3): icmp_seq=3 ttl=64 time=0.071 ms
64 bytes from myphp.custom (172.26.0.3): icmp_seq=4 ttl=64 time=0.136 ms
^C
--- php-server ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3094ms
rtt min/avg/max/mdev = 0.071/0.174/0.368/0.115 ms

PHP 容器:

# ping mysql
PING mysql (172.26.0.2) 56(84) bytes of data.
64 bytes from mydb.custom (172.26.0.2): icmp_seq=1 ttl=64 time=0.075 ms
64 bytes from mydb.custom (172.26.0.2): icmp_seq=2 ttl=64 time=0.107 ms
64 bytes from mydb.custom (172.26.0.2): icmp_seq=3 ttl=64 time=0.109 ms
^C
--- mysql ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2094ms
rtt min/avg/max/mdev = 0.075/0.097/0.109/0.015 ms

要更新特定服务,您可以使用您的更改更新您的 docker-compose 文件,并告诉 docker-compose 您的哪些服务需要使用此行更新:

docker-compose up -d --no-deps <service_name> 

-d 是分离模式:在后台运行容器,打印新的容器名称。

--no-deps 不会启动链接服务。

参考: https://docs.docker.com/compose/compose-file/#external_links

【讨论】:

  • 感谢 Brayan,只需考虑一个应用程序包含 12 个容器。关闭和打开,我们需要更新一些容器(通过将 jars 构建为 CI/CD 的组件)。在这种情况下什么是最好的解决方案。我的意思是如何更新正在运行的服务。
  • 为了更新一个特定的服务,你可以用你的更新更新你的 docker-compose 文件,并告诉 docker-compose 你的哪些服务需要用这一行更新: docker-compose up -d --no -deps -d 是分离模式:在后台运行容器,打印新的容器名称。 --no-deps 不会启动链接服务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-29
  • 2014-02-12
  • 1970-01-01
相关资源
最近更新 更多