我刚接触docker网络和nginx的东西,但是尝试在本地devserver上"dockerize“所有东西。用于测试带有nginx的docker镜像,该镜像应将另一个容器(gogs)从端口3000重定向到端口为80的特定url。我想让反向代理配置和docker镜像“分离”,为每个"app“创建一个自己的docker-compose文件。
因此,我应该使用http://app.test.local来安装gog。但是:我使用http://app.test.local只访问了nginx的一个糟糕的网关,而使用http://app.test.local:3000我访问了gog安装……
我尝试了很多教程,但总会有一些错误,那就是每次都会出错。
所以我做了什么:
$ docker network create testserver-network为nginx创建docker-compose:
version: '3'
services:
proxy:
container_name: proxy
hostname: proxy
image: nginx
ports:
- 80:80
- 443:443
volumes:
- /docker/proxy/config:/etc/nginx
- /docker/proxy/certs:/etc/ssl/private
networks:
- testserver-network
networks:
testserver-network:一个用于gogs:
version: '3'
services:
gogs:
container_name: gogs
hostname: gogs
image: gogs/gogs
ports:
- 3000:3000
- "10022:22"
volumes:
- /docker/gogs/data:/var/gogs/data
networks:
- testserver-network
networks:
testserver-network:(映射目录有效)
配置nginx的default.conf:
# upstream gogs {
# server 0.0.0.0:10880;
# }
server {
listen 80;
server_name app.test.local;
location / {
proxy_pass http://localhost:3000;
}
} 并添加到客户端app.test.local <server ip>上的主机文件中
docker exec proxy nginx -t和docker exec proxy nginx -s reload说一切都很好..。
发布于 2021-11-16 19:48:00
答案
您应该将这两个容器连接到相同的docker网络,然后将代理连接到http://gogs:3000。您也不需要在本地主机上公开端口3000,除非您想让http://app.test.local:3000工作。我认为理想情况下你应该删除它,所以http://app.test.local应该代理你的gogs服务器,而http://app.test.local:3000应该会出错。
解释
gogs在其容器内的端口3000上公开,然后在主机上的端口3000上进一步公开。nginx容器没有访问您主机上的端口3000的权限,所以当它试图代理http://localhost:3000时,它会代理到nginx容器内的端口3000 (没有托管任何内容)。
将容器连接到同一网络后,您应该能够通过nginx容器的主机名(已设置为gogs)从nginx容器引用gogs容器。现在,nginx将通过docker网络进行代理。因此,您应该能够在不需要在本地计算机上公开3000的情况下执行代理。
https://stackoverflow.com/questions/69990549
复制相似问题