我们有以下设置:
我们在 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,因此在这种特定情况下,这对您没有帮助。
有几种替代解决方案。最容易实现的两个解决方案是:
- 如果你在同一个容器中运行 nginx 和 php(你不应该这样做),只需在 php-fpm 和 nginx 中使用 127.0.0.1:9000
- 如果您在不同的容器中运行 nginx 和 php-fpm,或者在容器内运行 php-fpm 而在主机上运行 nginx,请添加
-p 9000:9000
到 php 容器,然后配置 nginx 容器以使用fastcgi_pass 172.17.42.1:9000
(或主机 docker0 接口使用的任何静态 IP) 如果您希望使用静态 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(但我不建议这样做)!