如何在不重新启动的情况下更改docker容器的源代码?

时间:2015-12-31 05:01:20

标签: docker

我有一个应用程序,我使用两个docker容器。说容器 A B 。现在B依赖于A.所以当我启动容器'B'时,我确实在命令行中提到了容器'A'的ip地址。

现在我在容器'A'中进行了代码更改。如果我必须在更改源代码后重新启动容器'A',那么在重新启动后,A的IP地址将会改变。因此,容器'B'将失去与'A'的连接,我必须使用新的IP地址'A'重新启动'B'。

是否有任何码头工作方法,我可以保留容器'A'的IP地址?或者我可以在不重新启动容器'A'的情况下更改代码吗? 请建议。

3 个答案:

答案 0 :(得分:1)

您需要一个服务发现,例如 consul ,再加上 registrator ,以便记录[FIRST]: { dealers: [ 5684f0b71e8265a43e3c9c27 ], __v: 0, price: '$17.99', title: 'Awesome Metal Towels', _id: 5684f0b71e8265a43e3c9c28 } [SECOND]: { products: [ 5684f0b71e8265a43e3c9c28 ], __v: 1, website: 'website.com', notes: 'notes', email: 'email@email.com', address: 'address', contact: 'contact', employees: 'employees', mode: 'mode', turnover: 'turnover', hours: 'hours', awards: 'awards', facilities: 'facilities', legal: 'legal', description: 'description', estd: 2010, owner: 'owner', name: 'Glaze', _id: 5684f0b71e8265a43e3c9c27 } (在领事中)每次开始。

然后A可以查询领事,以获取B最新的IP地址。

请参阅“Automatic Docker Service Announcement with Registrator

如果您的容器不是由同一个docker守护程序管理(意味着您处于多主机多节点环境中),则可以使用 docker swarm (仍与{一起使用} {1}}):

答案 1 :(得分:1)

两种方式

自定义IP'

您可以在容器内自定义Docker网络,远远超出Docker在pipework by Jérôme Petazzoni命令行允许的范围。

它允许您设置您想要的网络,以便您可以创建一个桥梁,让我们有创造力并称之为br1,为您的容器设置并在每个容器上设置特定的IP甚至使用dhcp服务器分配IP。这是一个静态配置:

启动aa容器并在我们的网桥上添加IP,br1eth0

→ docker run -d --net=none --name aa busybox cat
→ pipework br1 -eth0 aa 192.168.17.4/24

启动bb容器并在br1上添加192.168.17.5

→ docker run -d --net=none --name bb busybox cat
→ pipework br1 -eth0 bb 192.168.17.5/24

现在我们始终知道容器的IP地址

→ docker exec bb ping 192.168.17.4

Docker主机文件

默认情况下,Docker 1.8启用了/etc/hosts容器名称共享。

Docker 1.9在默认网络/网桥docker0上禁用此功能,但会在自定义网络上共享容器名称信息

创建网络

→ docker create network shared
ce8fb4c6d6d379e87314952f4dfbcdcd6cf6c03416431721bb8f6001492575ea

运行名为aa

的容器
→ docker run --name aa --net=shared -ti -d busybox sleep 5
754c7716cee65526cb2284066ccf2e495d494f5c351e281a89672aa5bdf1d84d

按容器名称aa

进行Ping
→ docker run --name bb --net=shared -ti --rm busybox ping aa
PING aa (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=1.354 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.081 ms
64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.090 ms
64 bytes from 172.18.0.2: seq=3 ttl=64 time=0.114 ms

--- aa ping statistics ---
8 packets transmitted, 4 packets received, 50% packet loss
round-trip min/avg/max = 0.081/0.409/1.354 ms

现在容器在5秒后停止了

→ docker run --name bb --net=shared -ti --rm busybox ping aa
ping: bad address 'aa'

Docker多节点主机文件

Docker本身通过其overlay network driver支持多个主机网络。这确实需要外部服务发现代理来提供kay /值存储服务,但这意味着您也可以在多个docker节点上执行此操作。

答案 2 :(得分:-1)

使用--volumes-from标志执行此操作。它看起来像这样:

$ docker run a --name a
$ docker run b --name b --volumes-from a

Docker将透明地为您处理网络。

https://docs.docker.com/engine/userguide/dockervolumes/