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

前端之家收集整理的这篇文章主要介绍了linux – 重新启动命名容器分配不同的IP前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我试图使用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指向我webapp中的postgres db:5432(我正在使用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中的一个bug?

最佳答案
第二个更新:也许你已经发现了这个,但作为解决方法,我计划映射服务以将数据库共享到主机接口(ej:with -p 5432:5432),并将webapps连接到主机IP(IP) docker0接口:在我的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的容器的主机名).

再见!
奥拉西奥

猜你在找的Docker相关文章