Docker 使用 compose 在单个主机上联网
Docker networking on single host with compose
我正在尝试 运行 docker 与 docker 1.9 中的 compose 联网。我知道这在 1.9 中仍处于试验阶段,但我想知道我的用例是否可行。
基本上,为了简化起见,我有两台服务器,每台都在一个容器中。我们称它们为 S1 和 S2。 S1 是全局公开的,必须可以从 S2 访问。我想 运行 S2 通过 docker-compose 与 --x-networking 标志(我想要这个的原因是 S2 实际上比这里假设的要复杂一些,有几个容器,并且我希望它们在单个子网中 运行)。 S1 可以 运行 有或没有组合。
我从 docker 网络中了解到,任何容器都可以从同一网络到达其他容器,或者可以到达通过主机端口映射 "globally" 暴露的任何东西,对吗?
所以我的情况是:
- 我用端口映射手动启动 S1,例如“-p 7210:7202”(7202 在 docker 文件中公开)
- S2 是从一个简单的组合文件创建的,并带有 --x-networking 标志
对于我的测试用例,我刚刚创建了一个非常简约的组合文件,例如:
S2:
build: .
ports:
- "8080:80"
结果:
- S1 在 "localhost" 下从 S2 中不可见(这是意料之中的)
- S1 在“172.17.0.1”下的 S2 中不可见(= 接口 docker0)
我本来希望能够在 172.17.0.1 下到达它,因为据我所知,S1 使用 docker0。
此外,如果我不使用 compose 而是手动使用 "docker run" 启动 S2,那么我可以使用 172.17.0.1
访问 S1
那么为什么它不能与 compose 一起使用?是否由于网络功能仍处于实验阶段而受到限制?
Note:
This is old content. The --x-networking has been removed in docker-compose
1.6. Additionally Docker compose has a new file format.
文档指出网络功能是 experimental in Docker compose。
Note: Compose’s networking support is experimental, and must be
explicitly enabled with the docker-compose --x-networking flag.
真正实现新功能的是Docker1.9:
https://docs.docker.com/engine/userguide/networking/dockernetworks/
也许一个例子会有所帮助。
例子
└── demo
└── docker-compose.yml
我正在使用 docker 1.9.0 和 docker-compose 1.5.0
docker-compose.yml
声明两个名为 "web1" 和 "web2" 的容器。在这种情况下我 运行ning tomcat.
是什么图像并不重要
web1:
image: tomcat:8.0
ports:
- 8080
web2:
image: tomcat:8.0
ports:
- 8080
创建容器
使用 docker compose
开始
$ cd demo
$ docker-compose --x-networking up -d
Creating network "demo" with driver "None"
Creating demo_web2_1
Creating demo_web1_1
请注意当您指定新的 --x-networking 参数时如何创建名为 "demo" 的网络。
展示发现的工作原理
每个容器在创建的 "demo" 网络上 运行,每个容器都作为另一个主机文件中的一个条目。
$ docker-compose ps
Name Command State Ports
---------------------------------------------------------------
demo_web1_1 catalina.sh run Up 0.0.0.0:32773->8080/tcp
demo_web2_1 catalina.sh run Up 0.0.0.0:32772->8080/tcp
$ docker exec -it demo_web1_1 cat /etc/hosts
..
172.18.0.2 demo_web2_1
$ docker exec -it demo_web2_1 cat /etc/hosts
..
172.18.0.3 demo_web1_1
运行 compose 之外的额外容器
启动另一个容器,并指定您希望它连接到 "demo" 网络:
$ docker run --net demo --name helloworld -d tomcat:8.0
并查看其他容器中的主机文件如何自动更新
$ docker exec -it demo_web1_1 cat /etc/hosts
..
172.18.0.2 demo_web2_1
172.18.0.4 helloworld
$ docker exec -it demo_web2_1 cat /etc/hosts
172.18.0.3 demo_web1_1
172.18.0.4 helloworld
$ docker exec -it helloworld cat /etc/hosts
172.18.0.2 demo_web2_1
172.18.0.3 demo_web1_1
我正在尝试 运行 docker 与 docker 1.9 中的 compose 联网。我知道这在 1.9 中仍处于试验阶段,但我想知道我的用例是否可行。
基本上,为了简化起见,我有两台服务器,每台都在一个容器中。我们称它们为 S1 和 S2。 S1 是全局公开的,必须可以从 S2 访问。我想 运行 S2 通过 docker-compose 与 --x-networking 标志(我想要这个的原因是 S2 实际上比这里假设的要复杂一些,有几个容器,并且我希望它们在单个子网中 运行)。 S1 可以 运行 有或没有组合。
我从 docker 网络中了解到,任何容器都可以从同一网络到达其他容器,或者可以到达通过主机端口映射 "globally" 暴露的任何东西,对吗?
所以我的情况是:
- 我用端口映射手动启动 S1,例如“-p 7210:7202”(7202 在 docker 文件中公开)
- S2 是从一个简单的组合文件创建的,并带有 --x-networking 标志 对于我的测试用例,我刚刚创建了一个非常简约的组合文件,例如:
S2: build: . ports: - "8080:80"
结果:
- S1 在 "localhost" 下从 S2 中不可见(这是意料之中的)
- S1 在“172.17.0.1”下的 S2 中不可见(= 接口 docker0)
我本来希望能够在 172.17.0.1 下到达它,因为据我所知,S1 使用 docker0。
此外,如果我不使用 compose 而是手动使用 "docker run" 启动 S2,那么我可以使用 172.17.0.1
访问 S1那么为什么它不能与 compose 一起使用?是否由于网络功能仍处于实验阶段而受到限制?
Note:
This is old content. The --x-networking has been removed in docker-compose 1.6. Additionally Docker compose has a new file format.
文档指出网络功能是 experimental in Docker compose。
Note: Compose’s networking support is experimental, and must be explicitly enabled with the docker-compose --x-networking flag.
真正实现新功能的是Docker1.9:
https://docs.docker.com/engine/userguide/networking/dockernetworks/
也许一个例子会有所帮助。
例子
└── demo
└── docker-compose.yml
我正在使用 docker 1.9.0 和 docker-compose 1.5.0
docker-compose.yml
声明两个名为 "web1" 和 "web2" 的容器。在这种情况下我 运行ning tomcat.
是什么图像并不重要web1:
image: tomcat:8.0
ports:
- 8080
web2:
image: tomcat:8.0
ports:
- 8080
创建容器
使用 docker compose
开始$ cd demo
$ docker-compose --x-networking up -d
Creating network "demo" with driver "None"
Creating demo_web2_1
Creating demo_web1_1
请注意当您指定新的 --x-networking 参数时如何创建名为 "demo" 的网络。
展示发现的工作原理
每个容器在创建的 "demo" 网络上 运行,每个容器都作为另一个主机文件中的一个条目。
$ docker-compose ps
Name Command State Ports
---------------------------------------------------------------
demo_web1_1 catalina.sh run Up 0.0.0.0:32773->8080/tcp
demo_web2_1 catalina.sh run Up 0.0.0.0:32772->8080/tcp
$ docker exec -it demo_web1_1 cat /etc/hosts
..
172.18.0.2 demo_web2_1
$ docker exec -it demo_web2_1 cat /etc/hosts
..
172.18.0.3 demo_web1_1
运行 compose 之外的额外容器
启动另一个容器,并指定您希望它连接到 "demo" 网络:
$ docker run --net demo --name helloworld -d tomcat:8.0
并查看其他容器中的主机文件如何自动更新
$ docker exec -it demo_web1_1 cat /etc/hosts
..
172.18.0.2 demo_web2_1
172.18.0.4 helloworld
$ docker exec -it demo_web2_1 cat /etc/hosts
172.18.0.3 demo_web1_1
172.18.0.4 helloworld
$ docker exec -it helloworld cat /etc/hosts
172.18.0.2 demo_web2_1
172.18.0.3 demo_web1_1