我在创建反向代理并将其指向其他容器中的应用程序时遇到麻烦。
我现在拥有的是Nginx的docker-compose,然后我想为几个不同的应用程序使用单独的docker-container,并让Nginx将流量直接引向这些应用程序。
我的Nginx docker-compose是:
version: "3"
services:
nginx:
image: nginx:alpine
volumes:
- ./default.conf:/etc/nginx/conf.d/default.conf
我的default.conf是:
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server {
listen 80;
server_name www.mydomain.com;
location /confluence {
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.1.50:8090/confluence;
}
}
我可以直接在以下位置访问汇合点: http://192.168.1.50:8090/confluence
我的融合思想是:
version: "3"
services:
db:
image: postgres:9.6
container_name: pg_confluence
env_file:
- env.list
ports:
- "5434:5432"
volumes:
- ./pg_conf.sql:/docker-entrypoint-initdb.d/pg_conf.sql
- dbdata:/var/lib/postgresql/data
confluence:
image: my_custom_image/confluence:6.11.0
container_name: confluence
volumes:
- confluencedata:/var/atlassian/application-data/confluence
- ./server.xml:/opt/atlassian/confluence/conf/server.xml
environment:
- JVM_MAXIMUM_MEMORY=2g
ports:
- "8090:8090"
depends_on:
- db
volumes:
confluencedata:
dbdata:
当我点击mydomain.com时,我可以看到Nginx的“欢迎”屏幕,但是如果我点击mydomain.com/confluence,则找不到。
所以看起来Nginx正在运行,只是没有将流量正确发送到另一个容器。
=======================
===更新解决方案===
=======================
我最终改用Traefik代替了Nginx。当我迈出下一步并开始学习k8s时,这也会有所帮助。
尽管即使您坚持使用Nginx,也需要这些网络设置,但我只是没有对Nginx进行过测试,因此希望无论您最终使用哪种设置,它们都会有所帮助。
对于融合的docker-compose.yml,我添加了:
networks:
proxy:
external: true
internal:
external: false
services:
confluence:
...
networks:
- internal
- proxy
db:
...
networks:
- internal
对于traefik docker-compose.yml,我添加了:
networks:
proxy:
external: true
services:
reverse-proxy:
networks:
- proxy
我必须使用以下方法手动创建网络:
docker network create proxy
答案 0 :(得分:0)
并不是正确使用docker的真正方法。
如果您处于生产环境中,请使用真正的编排工具(如今Kubernetes
是您的最佳选择)
如果您在计算机上,则只有在使用同一网络且该网络不是默认网络的情况下,才能引用容器的名称(或别名)。
一种方法是只有一个docker-compose文件。
另一种方法是在docker-compose中使用相同的网络。
docker network create --driver bridge my_network
networks:
default:
external:
name: my_network