Docker 网络 - link 还是不 link?
Docker Networking - to link or not to link?
我们有 1000 多个 python 单元测试,为了 运行 它们高效,我们将它们分批并行化。每个批次都有自己的 Docker 环境,由核心应用程序和 mongo 实例组成。它的设置是这样的:
docker network create --driver bridge ut_network-1
docker network create --driver bridge ut_network-2
docker run -d --name mongo-unittest-1 --network ut_network-1 mongo:3.4.2
docker run -d --name mongo-unittest-2 --network ut_network-1 mongo:3.4.2
docker run untapt_ut --rm --network ut_network-{%} --link mongo-unittest-{%}:db python discover.py
连接字符串是"mongodb://db:27017/mydb"
{%} 是与环境关联的数字 - 所以在 ut_network-1 上,数据库将是 mongo-unittest-1。请注意 'db'.
的别名
这很好用,但我读到 --link will be deprecated。
我认为解决方案就像删除 --link 并设置主机名一样简单:
docker run -d --hostname db --network ut_network-1 mongo:3.4.2
docker run -d --hostname db --network ut_network-2 mongo:3.4.2
docker run untapt_ut --rm --network ut_network-{%} python discover.py
但是,如果我这样做,应用程序将无法找到 mongo 实例。进一步:
- 我不能使用
--name db
,因为 Docker 会尝试创建多个名为 'db' 的容器,这显然无法做到(即使它们在不同的网络上)。
- mongo 数据库的默认主机名是容器 ID 的前几位数字。我的单元测试都从一个秘密文件中获取 mongo 数据库字符串,该文件假定数据库名为 'db'.
- 正如我所说,如果我使用
--hostname db
核心应用程序找不到 mongo 实例。但是,如果我将容器 ID 硬编码为服务器,那么核心应用程序会发现 mongo 实例正常。
- 我想保留别名 'db',这样单元测试就可以使用单一来源的 mongo 数据库字符串,我不需要弄乱它。
The documentation here 意味着我 可以 使用 --link.
那么我这样做对吗?或者,如果没有,我应该如何配置 Docker 网络,以便我可以创建多个网络并为 'db' 别名 'static' 主机名?
如有任何建议,我们将不胜感激。
提前致谢!
是的,链接正在被弃用,应该避免使用。对于 DNS 发现,我认为主机名会起作用,但我看到的结果与您看到的相同。您可以使用带有 --name db
的容器名称,它具有独特的容器问题,因此出于与您发现的相同原因,我建议不要这样做。最好的解决方案是直接使用 --network-alias db
:
进入网络别名的目标
docker run -d --network-alias db --network ut_network-1 mongo:3.4.2
docker run -d --network-alias db --network ut_network-2 mongo:3.4.2
docker run untapt_ut --rm --network ut_network-{%} python discover.py
我们有 1000 多个 python 单元测试,为了 运行 它们高效,我们将它们分批并行化。每个批次都有自己的 Docker 环境,由核心应用程序和 mongo 实例组成。它的设置是这样的:
docker network create --driver bridge ut_network-1
docker network create --driver bridge ut_network-2
docker run -d --name mongo-unittest-1 --network ut_network-1 mongo:3.4.2
docker run -d --name mongo-unittest-2 --network ut_network-1 mongo:3.4.2
docker run untapt_ut --rm --network ut_network-{%} --link mongo-unittest-{%}:db python discover.py
连接字符串是"mongodb://db:27017/mydb"
{%} 是与环境关联的数字 - 所以在 ut_network-1 上,数据库将是 mongo-unittest-1。请注意 'db'.
的别名这很好用,但我读到 --link will be deprecated。
我认为解决方案就像删除 --link 并设置主机名一样简单:
docker run -d --hostname db --network ut_network-1 mongo:3.4.2
docker run -d --hostname db --network ut_network-2 mongo:3.4.2
docker run untapt_ut --rm --network ut_network-{%} python discover.py
但是,如果我这样做,应用程序将无法找到 mongo 实例。进一步:
- 我不能使用
--name db
,因为 Docker 会尝试创建多个名为 'db' 的容器,这显然无法做到(即使它们在不同的网络上)。 - mongo 数据库的默认主机名是容器 ID 的前几位数字。我的单元测试都从一个秘密文件中获取 mongo 数据库字符串,该文件假定数据库名为 'db'.
- 正如我所说,如果我使用
--hostname db
核心应用程序找不到 mongo 实例。但是,如果我将容器 ID 硬编码为服务器,那么核心应用程序会发现 mongo 实例正常。 - 我想保留别名 'db',这样单元测试就可以使用单一来源的 mongo 数据库字符串,我不需要弄乱它。
The documentation here 意味着我 可以 使用 --link.
那么我这样做对吗?或者,如果没有,我应该如何配置 Docker 网络,以便我可以创建多个网络并为 'db' 别名 'static' 主机名?
如有任何建议,我们将不胜感激。
提前致谢!
是的,链接正在被弃用,应该避免使用。对于 DNS 发现,我认为主机名会起作用,但我看到的结果与您看到的相同。您可以使用带有 --name db
的容器名称,它具有独特的容器问题,因此出于与您发现的相同原因,我建议不要这样做。最好的解决方案是直接使用 --network-alias db
:
docker run -d --network-alias db --network ut_network-1 mongo:3.4.2
docker run -d --network-alias db --network ut_network-2 mongo:3.4.2
docker run untapt_ut --rm --network ut_network-{%} python discover.py