我试图使用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?
—旧的更新:
更正: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的容器的主机名).
再见!
奥拉西奥