使用撰写

时间:2015-11-18 16:51:10

标签: 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"

结果:

  • S1在“localhost”下不可见(这是非常期待的)
  • S2在“172.17.0.1”(= interface docker0)
  • 下的S2中不可见

我原本希望能够在172.17.0.1下达到它,因为S1根据我的理解使用了docker0。

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

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

1 个答案:

答案 0 :(得分:9)

  

注意:

     

这是旧内容。在docker-compose中删除了--x-networking   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

搬运工-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

在撰写

之外运行另一个容器

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

$ 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