如何更改docker容器的源代码,而不重新启动它?

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

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

是否有任何docker的方法,我总是可以保留容器“A”的IP地址? 或者我可以在不重新启动容器“A”的情况下更改代码? 请build议。

你需要像领事这样的服务发现,结合注册人 ,以便每次开始时loggingA (在领事)。

然后B可以查询领事为了得到A最新的IP地址。

请参阅“ 使用注册器自动执行Docker服务公告 ”

如果你的容器不是由同一个docker守护进程pipe理的(也就是说你在一个多主机多节点环境中),你可以使用docker swarm (仍然与consul一起):

  • “ 使用Docker Swarm和Dockernetworking部署容器 ”
  • “ 与Docker的Atlassian Orchestration:多主机支持获胜! ”

两种方式

自定义IP的

您可以在远离Docker允许的容器内使用JérômePetazzoni的pipework自定义Dockernetworking。

它允许你设置你想要的networking,这样你就可以创build一个网桥,让它具有创造性,并为你的容器调用它,并在每个容器上设置特定的IP,甚至使用DHCP服务器来分配IP。 这是一个静态configuration:

启动aa容器并在我们的网桥上添加一个IP,将其作为eth0

 → 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在默认networking/网桥docker0上禁用了这个function,但会在自定义networking上共享容器名称信息

创buildnetworking

 → 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本身通过overlaynetworking驱动程序支持多主机联网。 这确实需要一个外部服务发现代理来提供kay / value存储服务,但是这意味着你可以通过多个docker节点来完成。

你用--volumes-from标志来做到这一点。 它看起来像这样:

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

Docker将透明地处理您的networking。

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