启动时使用 docker 容器 IP 更新 nginx conf 中的 fastcgi_pass

启动时使用 docker 容器 IP 更新 nginx conf 中的 fastcgi_pass

我们有以下设置:

我们在 Ubuntu 服务器上托管了多个网站,其中大多数运行 PHP 5.6。其中一个在 Docker 容器中运行 PHP 7.1。

该网站的 nginx conf 包含以下行:

fastcgi_pass 172.17.0.4:9000;

它指向 docker 容器的 IP,我们可以从

docker inspect <container>|grep IP

问题是,每当系统重新启动时,容器都会被分配一个新的 IP,我们必须再次将其复制到 nginx conf 中并重新启动 nginx。我们如何才能自动完成这一操作?

谢谢你!

BR,彼得

答案1

Docker 在 /etc/hosts 中创建一个条目,将容器的新 IP 地址映射到其名称。不幸的是,nginx 会忽略 /etc/hosts,只依赖其 DNS 解析器来解析 IP,因此在这种特定情况下,这对您没有帮助。

有几种替代解决方案。最容易实现的两个解决方案是:

  1. 如果你在同一个容器中运行 nginx 和 php(你不应该这样做),只需在 php-fpm 和 nginx 中使用 127.0.0.1:9000
  2. 如果您在不同的容器中运行 nginx 和 php-fpm,或者在容器内运行 php-fpm 而在主机上运行 nginx,请添加-p 9000:9000到 php 容器,然后配置 nginx 容器以使用fastcgi_pass 172.17.42.1:9000(或主机 docker0 接口使用的任何静态 IP)
  3. 如果您希望使用静态 IP 地址,请创建一个独立的网络并为您的 php 容器分配一个静态 IP,例如:

    docker network create --subnet=172.18.0.0/16 mynet123

    docker run --net mynet123 --ip 172.18.0.22 -d --rm php-image-name

更清洁的解决方案将涉及使用编排解决方案,在这里我只是选择快速而肮脏的方法。

答案2

我会将容器端口 9000 映射到主机上的开放端口,然后您可以设置 nginx 以直接代理到主机和端口。这样,分配给 docker 实例的 IP 地址就无关紧要了。

docker run -p 127.0.0.1:9001:9000

然后你可以更改 nginx conf:

fastcgi_pass 127.0.0.1:9001;

答案3

您可以使用套接字吗?您可以绕过这个问题,因为...

  • php-fpm 容器正在监听套接字
  • 您具有 sudo 权限来创建目录

我不知道您的环境的具体情况,但这应该可以让您走上正确的轨道:

[host]# sudo mkdir -p /var/run/my_app/ [host]# docker run -d -v /var/run/my_app:/var/run/php-fpm my_org/my-php-fpm-container

/var/run/php-fpm你的容器应该在诸如下面放置一个插座/var/run/php-fpm/php-fpm.sock

然后在相应的 nginx 配置中,你可以使用fastcgi_pass unix:/var/run/my_app/php-fpm.sock;

这使得您甚至根本不暴露端口。

这是可行的,因为如果你将整个目录暴露给 docker,它不会创建任何文件,只会创建目录。如果你将文件放入容器内的该目录中,它将暴露在主机上。套接字只是特殊文件,因此它们与其他任何东西一样暴露。:)

从技术上讲,您也可以在这里执行相反的操作,即在主机上运行 php-fpm 并在容器中运行 nginx(但我不建议这样做)!

相关内容