docker 更改网络时反向代理不起作用(通过 --net)

docker reverse-proxy doesnt work when change network (by --net)

docker版本:17.05.0-ce

我有一些容器运行手动使用docker run ...,但最近我为新项目创建了docker-compose.yml 文件基于 this tutorial。然而,当我 运行 在我的主机中遵循命令时:

docker network create --driver bridge reverse-proxy
docker-compose up 

docker run -d --name nginx-reverse-proxy --net reverse-proxy  -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy

代理不适用于旧容器,我无法使用该项目的子域(它们 "stop work")。

那怎么办?

我在 docker run ... 中使用 --net 参数并使用 docker network inspect network_name 进行实验。我得到许多不同的结果,例如 welcome to nginxhttp 404 not foundhttp 503 temporary unavailable 和得出以下结论:

  1. 如果没有 --net 命令,则容器是 运行 在 bridge network
  2. if --net xxx command then cntainer is 运行 only in 'xxx' network (not in bridge !)
  3. 如果 --net xxx --net yyy 则容器仅在 'yyy' 中为 运行(根本没有 'xxx'!)

bridge 是容器间通信的默认 docker 网络。

所以在 运行ning 代理上我们只使用 --net reverse-proxy 然后代理容器看不到 bridge 并且不能与其他容器通信。如果我们尝试使用 --net reverse-proxy --net bridge(在一行中两次或多次 - 如 -p),那么容器将只连接到最后一个网络。

所以解决方案是... 运行 以下列方式代理:

docker run -d --name nginx-reverse-proxy  -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
docker network connect reverse-proxy reverse-proxy

如您所见,我们根本没有使用 --net 命令。 network connect 命令允许容器连接使用多个网络。当你执行 docker network inspect reverse-proxydocker network inspect bridge 我们会看到 nginx-reverse-proxy 在两个网络中:)