重新启动命名容器会分配不同的IP

时间:2014-07-13 21:51:34

标签: linux networking docker linux-containers

我试图使用Docker部署我的应用程序并遇到一个问题,即重新启动命名容器会为容器分配不同的IP。也许解释我在做什么会更好地解释这个问题:

  • Postgres在名为"postgres"的单独容器内运行 $ PG_ID=$(docker run --name postgres postgres/image)
  • 我的webapp容器链接到postgres容器
    $ APP_ID=$(docker run --link postgres:postgres webapp/image)

将postgres容器映像链接到webapp容器,在webapp容器中插入一个带有postgres容器IP的hosts文件条目。这允许我使用postgres:5432指向我的webapp中的postgres数据库(我正在使用Django btw)。这一切都运作良好,除非由于某种原因postgres崩溃。

在我手动停止postgres进程以模拟postgres进程崩溃之前,我验证了postgres容器的IP:

$ docker inspect --format "{{.NetworkSettings.IPAddress}}" $PG_ID
172.17.0.73

现在模拟崩溃我停止了postgres容器:

$ docker stop $PG_ID

如果现在我使用

重新启动postgres
$ docker start $PG_ID

容器的ip更改:

$ docker inspect --format "{{.NetworkSettings.IPAddress}}" $PG_ID
172.17.0.74

因此,指向webapp容器中的postgres容器的IP不再正确。我通过命名容器docker为它指定一个名称,使用特定的配置,以便您可以可靠地链接容器(网络和卷)。如果IP发生变化,这似乎会破坏目的。

如果每次postgres重新启动时都必须重新启动我的webapp进程,这似乎没有比使用单个容器来运行这两个进程更好的了。然后我可以使用supervisor或类似的东西来保持它们都运行并使用localhost来链接进程。

我还是Docker的新手,所以我做错了什么,或者这是docker中的错误?

3 个答案:

答案 0 :(得分:0)

第二次更新:也许您已经发现了这一点,但作为解决方法,我计划映射服务以将数据库共享到主机接口(ej:with -p 5432:5432),并将webapps连接到主机IP( docker0接口的IP:在我的Ubuntu和CentOS中,IP是172.17.42.1)。如果重新启动postgres容器,则conteiner的IP将更改,但我将使用172.17.42.1:5432进行访问。缺点是你将该端口暴露给所有容器,并且松散了--link给你的细粒度映射。

---旧的更新:

更正:Docker会将'postgres'映射到webapp容器上/ etc / hosts文件中的容器IP。因此,在webapp容器中,您可以ping“postgres”,它将映射到IP。

第一次更新:我已经看到Docker生成并安装/ etc / hosts,/ etc / resolv.conf等以获得始终正确的信息,但这在重新启动链接容器时不适用。所以,我(错误地)认为Docker会更新主机文件。

- 原始(错误)回复:

添加--hostname = postgres-db(您可以使用anythin,我使用的不同于'postgres'以避免与容器名称混淆):

$ docker run --name postgres --hostname postgres-db postgres/image

Docker会将'postgres-db'映射到容器的IP(检查webapp容器上/ etc / hosts的内容)。

这将允许您从webapp容器运行'ping postgres-db'。如果IP发生变化,Dockers将为您更新/ etc / hosts。

在Django应用程序中,使用'postgres-db'而不是IP(或者用于PostgreSql的容器的主机名)。

再见! 奥拉西奥

答案 1 :(得分:0)

根据https://docs.docker.com/engine/reference/commandline/run/,应该可以使用--ip选项在容器创建时为容器分配静态IP:

示例:

docker run -itd --ip 172.30.100.104 --name postgres postgres/image

....其中172.30.100.104是自定义网桥/覆盖网络上的免费IP地址。

即使postgres容器崩溃/重新启动,它也应该保留相同的IP地址。

看起来这是在Docker Engine v 1.10或更高版本中发布的,因此如果您的版本较低,则必须先升级。

答案 2 :(得分:-1)

从Docker 1.0开始,他们实现了更强的链接容器感。现在,您可以使用容器实例名称,就好像它是主机名一样。

这是link

我发现link可以更好地描述您的问题。虽然这个问题得到了解答,我想知道这种ambassador模式是否可能无法解决问题...这假设大使比链接的服务更可靠。