我的项目使用CI/CD进行部署,我有一个docker-compose文件为每个应用程序阶段(开发,分期,发布)。
根据应用程序的阶段,我想用Nginx为不同的ip/端口重定向我的API用户。
On mydefault.conf我想写这样的文件
server {
listen 443 ssl;
ssl_certificate /etc/ssl/server/cert.pem;
ssl_certificate_key /etc/ssl/server/privkey.pem;
location / {
proxy_pass https://api:$API_PORT;
proxy_set_header Host $host;
...
api,${API_PORT}是我在docker-compose文件中定义的服务IP的引用,我希望${API_PORT}是我在docker-compose文件中定义的环境变量的引用。
我的<<p> strong> docker-compose 文件看起来像这样。version: "3"
services:
api:
...
ports:
- 4000:4000
nginx:
...
environment:
- API_PORT=4000
ports:
- 5180:80
- 5181:443
我怎么才能做到呢?
注意:如果我有一个静态端口,例如4000,当我启动阶段和发布版本时,我将在端口4000上发生冲突。
Nginx的配置,你不需要做任何事情;使用固定端口4000
proxy_pass https://api:4000;
因为这是一个从Nginx容器到API容器的连接,所以它留在Docker网络环境中。这个连接不需要注意您可能设置为ports:
的内容,它连接到API容器中侦听端口4000的服务器进程。
当您启动API容器时,容器中的服务器进程应该使用相同的固定端口4000。如果您需要使API容器对外可见,您可以为ports:
块中的第一个端口选择一个不同的编号,但第二个端口需要是4000。
services:
api:
ports: ['4001:4000']
nginx:
ports: ['5180:80', '5181:443']
如果您需要启动该堆栈的多个副本,则需要更改所有ports:
块中的第一个端口号,但保持第二个数字不变。
如果所有访问API容器是通过这个Nginx代理,你可能不需要api: { ports: [] }
块,你可以安全地删除它;同样,它不用于容器之间的连接。
你需要设置你的Dockerfile和重命名你的。conf文件,以便Nginx理解你想做什么。
首先,Nginx本身支持你想做的事情,所以你需要使用模板。
默认情况下,如果你把你的配置文件放在/etc/nginx/templates文件名以.template结尾, Nginx将使用envsubst代替你的环境变量里面. conf在docker-compose文件中定义的值。
我们来举个例子。
你有default.conf.template(不要忘记重命名你的。conf文件)文件与你的Nginx设置:
server {
listen 443 ssl;
ssl_certificate /etc/ssl/server/cert.pem;
ssl_certificate_key /etc/ssl/server/privkey.pem;
location / {
proxy_pass https://api:$API_PORT;
proxy_set_header Host $host;
...
Dockerfile会复制你的default.conf.template并将其粘贴到/etc/nginx/templates中
...
COPY /your/nginx/settings/folder/default.conf.template /etc/nginx/templates
...
这样,当Nginx开始运行时,它会在模板文件夹中搜索*.template当它找到你的default.conf.template文件,它将替换实际值的环境变量引用,并将该文件移动到/etc/nginx/conf.d文件夹。所以如果你的docker-compose文件看起来像这样:
version: "3"
services:
api:
...
ports:
- 4000:4000
nginx:
...
environment:
- API_PORT=4000
你的<<p> strong> default.conf.template default.conf/etc/nginx/conf.d/看起来像这样:
location / {
proxy_pass https://api:4000;
...
因此Nginx将替换值的引用并将.conf文件移动到正确的位置。