单个主机上的Docker网络与compose

Joe*_*oel 4 docker docker-compose

我试图在docker 1.9中使用compose运行docker网络.我知道这在1.9中仍然是实验性的,但我想知道我的用例是否可行.

基本上和简化,我有两个服务器,每个服务器都在一个容器中.我们称他们为S1和S2.S1全局暴露,必须可从S2访问.我想通过docker-compose运行S2并使用--x-networking标志(我之所以想要的是S2实际上比这里假设的更复杂,有几个容器,我希望它们运行在一个子网络).S1可以在有或没有撰写的情况下运行.

我从docker网络中了解到,任何容器都可以从同一网络到达其他容器,或者可以通过主机端口映射到达"全局"暴露的任何容器,对吧?

所以我的方案是:

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

结果:

  • S2在"localhost"下无法从S2中看到(这是非常期待的)
  • 在"172.17.0.1"(=接口docker0)下从S2看不到S1

我希望能够在172.17.0.1下达到它,因为S1使用了docker0,据我所知.

此外,如果我在没有编写的情况下启动S2但是使用"docker run"手动启动,那么我可以使用172.17.0.1访问S1

那么为什么它不能用于撰写?由于网络功能仍处于试验阶段,这是一个限制吗?

Mar*_*nor 9

注意:

这是旧内容.在docker-compose 1.6中删除了--x-networking.另外Docker compose有一个新的文件格式.


该文档指出网络功能在Docker组合中实验性的.

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

Docker 1.9实际上实现了新功能:

https://docs.docker.com/engine/userguide/networking/dockernetworks/

也许一个例子会有所帮助.

??? demo
    ??? docker-compose.yml
Run Code Online (Sandbox Code Playgroud)

我正在使用docker 1.9.0和docker-compose 1.5.0

泊坞窗,compose.yml

声明两个称为"web1"和"web2"的容器.在这种情况下,无论什么图像我都在运行tomcat.

web1:
  image: tomcat:8.0
  ports:
    - 8080
web2:
  image: tomcat:8.0
  ports:
    - 8080
Run Code Online (Sandbox Code Playgroud)

创建容器

使用docker compose启动它

$ cd demo
$ docker-compose --x-networking up -d
Creating network "demo" with driver "None"
Creating demo_web2_1
Creating demo_web1_1
Run Code Online (Sandbox Code Playgroud)

请注意在指定新的--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
Run Code Online (Sandbox Code Playgroud)

在撰写之外运行另一个容器

启动另一个容器,并指定您希望将其附加到"演示"网络:

$ docker run --net demo --name helloworld -d tomcat:8.0
Run Code Online (Sandbox Code Playgroud)

并查看其他容器中的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
Run Code Online (Sandbox Code Playgroud)