【问题标题】:Link containers in docker (RancherOS and command line)在 docker 中链接容器(RancherOS 和命令行)
【发布时间】:2018-03-14 09:17:52
【问题描述】:
  • 我运行 RancherOS 来运行 docker 容器
  • 我在 GUI 上创建了一个容器来运行我的数据库(图像:mysql,名称:r-mysql-e4e8df05)。不同的容器使用它。
  • 我可以在 GUI 上将其他容器链接到它
  • 这次我想在 jenkins 上自动创建和启动一个容器,但是链接效果不好

我的命令:

docker run -d --name=app-that-needs-mysql --link mysql:mysql myimages.mycompany.com/appthatneedsmysql

我得到错误:

Error response from daemon: Could not get container for mysql

我尝试了不同的方法:
1)

--link r-mysql-e4e8df05:mysql

错误:

Cannot link to /r-mysql-e4e8df05, as it does not belong to the default network

2)
尝试使用--net 选项
正在运行:docker network ls

NETWORK ID          NAME                DRIVER              SCOPE
c..........e        bridge              bridge              local
4..........c        host                host                local
c..........a        none                null                local
  • --net none 成功,但实际上它不起作用。该应用无法连接到数据库
  • 带有--net host错误信息conflicting options: host type networking can't be used with links. This would result in undefined behavior
  • 带有--net bridge 错误信息:Cannot link to /r-mysql-e4e8df05, as it does not belong to the default network

我还检查了运行这个 mysql 的 Rancher GUI:

它会得到一个continer IP 开头为:10.X.X.X

我也试过add --net managed,但报错:network managed not found

我相信我错过了在这个 docker 链接过程中的理解。 请给我一些想法,我怎样才能使这些工作。
(以前当我创建相同的容器并在 GUI 中链接到 mysql 时它正在工作)

【问题讨论】:

标签: docker rancher docker-link


【解决方案1】:

嘿@Tomi,你可以在任何你喜欢的端口上公开mysql容器,从牧场主那里。这样您就不必链接容器,然后您的詹金斯派生容器连接到主机上暴露端口上的容器。您还可以使用 jenkins 在 Rancher 中启动容器,使用 rancher cli。这样一来,您就不必在主机网络上显示 mysql……有几种方法可以用牧场主给那只猫剥皮。

【讨论】:

  • 嘿@aemneina 我回到这个问题上。通过暴露 mysql 作品(但感觉就像我不喜欢的硬编码版本)。使用 Rancher cli 在 Rancher 中启动容器是什么意思。
【解决方案2】:

乍一看,Rancher 似乎使用托管网络,docker network ls 没有显示。

重现问题

我使用虚拟高山容器来重现这个:

# create some network
docker network create your_invisible_network

# run a container belonging to this network
docker container run \
  --detach \
  --name r-mysql-e4e8df05 \
  --net your_invisible_network \
  alpine tail -f /dev/null

# trying to link this container
docker container run \
  --link r-mysql-e4e8df05:mysql \
  alpine ping mysql

确实我得到了docker: Error response from daemon: Cannot link to /r-mysql-e4e8df05, as it does not belong to the default network.

可能的解决方案

一种解决方法是创建一个user-defined bridge network 并简单地将您的 mysql 容器添加到其中:

# create a network
docker network create \
  --driver bridge \
  a_workaround_network

# connect the mysql to this network (and alias it)
docker network connect \
  --alias mysql \
  a_workaround_network r-mysql-e4e8df05

# try to ping it using its alias
docker container run \
  --net a_workaround_network \
  alpine \
  ping mysql

# yay!
PING mysql (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: seq=0 ttl=64 time=0.135 ms
64 bytes from 127.0.0.1: seq=1 ttl=64 time=0.084 ms

正如您在输出中看到的那样,可以通过其 DNS 名称 ping mysql 容器。

很高兴知道:

  • 使用用户创建的桥接网络,DNS 解析开箱即用,无需显式 --link 容器 :)
  • 容器可以属于多个网络,这就是它起作用的原因。在这种情况下,mysql 容器同时属于your_invisible_networka_workaround_network

我希望这会有所帮助!

【讨论】:

  • Deat @stepf 非常好的答案,我还有一个问题:Error response from daemon: container cannot be connected to multiple networks with one of the networks in private (none) mode 我必须将 mysql 保留在原始网络上,因为那里有其他容器连接到它
  • @Tomi 这只是一个猜测,但您可以在加入mysqla_workaround_network 之前尝试docker network disconnect none mysql
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
相关资源
最近更新 更多