Docker 错误转发端口
Docker mis-forwarding ports
我有几个域共享一个 public IP(EC2 实例)。我的设置是这样的:
/home/ubuntu
包含 docker-compose.yml
:
version: '3'
services:
nginx-proxy:
image: "jwilder/nginx-proxy"
container_name: nginx-proxy
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
ports:
- "80:80"
restart: "always"
这将创建一个名为 ubuntu_default
的网络,它将允许其他组合实例加入。 nginx-proxy
图像为这些其他撰写实例创建反向代理,以便您可以访问 example.com 并在适当的撰写实例中路由到适当的 UI。
/home/ubuntu/example.com/project-1
包含一个 docker-compose.yml
如:
version: '3'
services:
db:
build: "./db" # mongo
volumes:
- "./data:/data/db"
restart: "always"
api:
build: "./api" # a node backend
ports:
- "9005:9005"
restart: "always"
depends_on:
- db
ui:
build: "./ui" # a react front end
ports:
- "8005:8005"
restart: "always"
environment:
- VIRTUAL_HOST=project-1.example.com # this tells nginx-proxy which domain to proxy
- VIRTUAL_PORT=8005 # this tells nginx-proxy which port to proxy
networks:
default:
external:
name: ubuntu_default
/home/ubuntu/testing.com/project-2
包含一个 docker-compose.yml
如:
version: '3'
services:
db:
build: "./db" # postgres
volumes:
- "./data:/var/lib/postgresql/data"
restart: "always"
api:
build: "./api" # a python backend
ports:
- "9000:9000"
restart: "always"
depends_on:
- db
ui:
build: "./ui" # a react front end
ports:
- "8000:8000"
restart: "always"
environment:
- VIRTUAL_HOST=testing.com,www.testing.com # tells nginx-proxy which domains to proxy
- VIRTUAL_PORT=8000 # tells nginx-proxy which port to proxy
networks:
default:
external:
name: ubuntu_default
所以基本上:
- project-1.example.com:80 转发到 UI 运行ning on :8005
- project-1.example.com:80/api 转发到 API 运行ning on :9005
- testing.com 转发到 UI 运行ning on :8000
- 正在测试。com/api 转发到 API 运行ning on :9000
...只要我一次只 运行 一个,一切都完美无缺。当我启动两个 Compose 实例时,/api url 开始发生冲突。我可以坐在其中之一上并反复刷新,有时我会看到例如那个。com/api 有时我会看到测试用的。com/api。
我不知道此时发生了什么。也许我反对的前提存在根本性缺陷,但它似乎是 Docker/Compose 的预期用途。我愿意接受建议,以其他方式完成同样的事情。
Docker 容器在其网络上使用 DNS 查找进行通信。如果多个容器在同一网络上具有相同的别名,它将在每个网络连接的容器之间进行循环负载平衡。如果您不希望容器相互通信,那么您不希望它们在同一个 docker 网络上。好消息是你通过使用多个网络解决了这个问题,而不是将 api 和数据库服务器放在前端代理网络上:
version: '3'
services:
db:
build: "./db" # postgres
volumes:
- "./data:/var/lib/postgresql/data"
restart: "always"
api:
build: "./api" # a python backend
ports:
- "9000:9000"
restart: "always"
depends_on:
- db
ui:
build: "./ui" # a react front end
ports:
- "8000:8000"
restart: "always"
networks:
- default
- proxy
environment:
- VIRTUAL_HOST=testing.com,www.testing.com # tells nginx-proxy which domains to proxy
- VIRTUAL_PORT=8000 # tells nginx-proxy which port to proxy
networks:
proxy:
external:
name: ubuntu_default
如果您不覆盖默认网络,docker 将为您的 Compose 项目创建一个并将其用于未分配给其他网络的任何容器。
我有几个域共享一个 public IP(EC2 实例)。我的设置是这样的:
/home/ubuntu
包含 docker-compose.yml
:
version: '3'
services:
nginx-proxy:
image: "jwilder/nginx-proxy"
container_name: nginx-proxy
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
ports:
- "80:80"
restart: "always"
这将创建一个名为 ubuntu_default
的网络,它将允许其他组合实例加入。 nginx-proxy
图像为这些其他撰写实例创建反向代理,以便您可以访问 example.com 并在适当的撰写实例中路由到适当的 UI。
/home/ubuntu/example.com/project-1
包含一个 docker-compose.yml
如:
version: '3'
services:
db:
build: "./db" # mongo
volumes:
- "./data:/data/db"
restart: "always"
api:
build: "./api" # a node backend
ports:
- "9005:9005"
restart: "always"
depends_on:
- db
ui:
build: "./ui" # a react front end
ports:
- "8005:8005"
restart: "always"
environment:
- VIRTUAL_HOST=project-1.example.com # this tells nginx-proxy which domain to proxy
- VIRTUAL_PORT=8005 # this tells nginx-proxy which port to proxy
networks:
default:
external:
name: ubuntu_default
/home/ubuntu/testing.com/project-2
包含一个 docker-compose.yml
如:
version: '3'
services:
db:
build: "./db" # postgres
volumes:
- "./data:/var/lib/postgresql/data"
restart: "always"
api:
build: "./api" # a python backend
ports:
- "9000:9000"
restart: "always"
depends_on:
- db
ui:
build: "./ui" # a react front end
ports:
- "8000:8000"
restart: "always"
environment:
- VIRTUAL_HOST=testing.com,www.testing.com # tells nginx-proxy which domains to proxy
- VIRTUAL_PORT=8000 # tells nginx-proxy which port to proxy
networks:
default:
external:
name: ubuntu_default
所以基本上:
- project-1.example.com:80 转发到 UI 运行ning on :8005
- project-1.example.com:80/api 转发到 API 运行ning on :9005
- testing.com 转发到 UI 运行ning on :8000
- 正在测试。com/api 转发到 API 运行ning on :9000
...只要我一次只 运行 一个,一切都完美无缺。当我启动两个 Compose 实例时,/api url 开始发生冲突。我可以坐在其中之一上并反复刷新,有时我会看到例如那个。com/api 有时我会看到测试用的。com/api。
我不知道此时发生了什么。也许我反对的前提存在根本性缺陷,但它似乎是 Docker/Compose 的预期用途。我愿意接受建议,以其他方式完成同样的事情。
Docker 容器在其网络上使用 DNS 查找进行通信。如果多个容器在同一网络上具有相同的别名,它将在每个网络连接的容器之间进行循环负载平衡。如果您不希望容器相互通信,那么您不希望它们在同一个 docker 网络上。好消息是你通过使用多个网络解决了这个问题,而不是将 api 和数据库服务器放在前端代理网络上:
version: '3'
services:
db:
build: "./db" # postgres
volumes:
- "./data:/var/lib/postgresql/data"
restart: "always"
api:
build: "./api" # a python backend
ports:
- "9000:9000"
restart: "always"
depends_on:
- db
ui:
build: "./ui" # a react front end
ports:
- "8000:8000"
restart: "always"
networks:
- default
- proxy
environment:
- VIRTUAL_HOST=testing.com,www.testing.com # tells nginx-proxy which domains to proxy
- VIRTUAL_PORT=8000 # tells nginx-proxy which port to proxy
networks:
proxy:
external:
name: ubuntu_default
如果您不覆盖默认网络,docker 将为您的 Compose 项目创建一个并将其用于未分配给其他网络的任何容器。