【问题标题】:Docker networking on single host with compose使用 compose 在单个主机上建立 Docker 网络
【发布时间】:2016-03-10 02:27:32
【问题描述】:

我正在尝试在 docker 1.9 中使用 compose 运行 docker 网络。我知道这在 1.9 中仍处于试验阶段,但我想知道我的用例是否可以工作。

为了简化,我有两台服务器,每台都在一个容器中。我们称它们为 S1 和 S2。 S1 是全局公开的,必须可以从 S2 访问。我想通过带有--x-networking标志的docker-compose运行S2(我想要这个的原因是S2实际上比这里假设的要复杂一些,有几个容器,我希望它们在单个子网)。 S1 可以在有或没有 compose 的情况下运行。

我从 docker 网络中了解到,任何容器都可以从同一网络访问其他容器,或者可以访问通过主机端口映射“全局”公开的任何内容,对吗?

所以我的情况是:

  • 我使用“-p 7210:7202”等端口映射手动启动 S1(7202 在 dockerfile 中公开)
  • S2 是从一个简单的 compose 文件创建的,并带有标志 --x-networking 对于我的测试用例,我刚刚创建了一个非常简约的 compose 文件,例如:
S2:
    build: .
    ports:
        - "8080:80"

结果:

  • 在“localhost”下从 S2 看不到 S1(这是意料之中的)
  • S1 在“172.17.0.1”下的 S2 不可见(= 接口 docker0)

我本来希望能够在 172.17.0.1 下访问它,因为据我了解,S1 使用 docker0。

此外,如果我不使用 compose 而手动使用“docker run”启动 S2,那么我可以使用 172.17.0.1 访问 S1

那么为什么它不能与 compose 一起使用呢?由于网络功能仍处于试验阶段,是否存在限制?

【问题讨论】:

  • 我不希望它在该 IP 上可用。您可以使用docker network connect project-name S2-container-name 告诉 S1 加入 compose 网络。 project-name是compose项目名,可以设置,或者默认为compose文件所在目录的dirname。

标签: docker docker-compose


【解决方案1】:

注意:

这是旧内容。 --x-networking 已在 docker-compose 中删除 1.6.此外,Docker compose 具有新的文件格式。


文档指出网络功能是experimental in Docker compose

注意:Compose 的网络支持是实验性的,必须是 使用 docker-compose --x-networking 标志显式启用。

真正实现新功能的是 Docker 1.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”的容器。在这种情况下,我正在运行 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”的网络。

演示发现的工作原理

每个容器都在创建的“演示”网络上运行,每个容器都作为一个条目放置在其他主机文件中。

$ 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 之外运行一个额外的容器

启动另一个容器,并指定您希望它连接到“演示”网络:

$ docker run --net demo --name helloworld -d tomcat:8.0

并查看其他容器中的 hosts 文件是如何自动更新的

$ 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

【讨论】:

  • 完美运行,谢谢。请注意,我还尝试通过撰写运行我的第一台服务器(S1),在这里我可以通过在撰写时提供相同的“项目名称”来类似地解决问题:“docker compose --x-networking -p demo up”
  • 当我尝试这个例子时,它工作正常。当我尝试使用三个 wurstmeister/zookeeper 时,手动启动的第三个 zk 没有前两个服务的条目!
  • --x-networking 已在 docker-compose 1.6 中删除,他们本可以添加提示...应该将他的 docker-compose 文件移至版本 2
  • @Brice 我的回答已经合格。谢谢。
  • 实际上docker-compose 1.6 的一个好主意是在文件中声明网络。
猜你喜欢
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多