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" 暴露的任何东西,对吗?

所以我的情况是:

S2:
    build: .
    ports:
        - "8080:80"

结果:

我本来希望能够在 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