gpt4 book ai didi

使用 compose 在单个主机上建立 Docker 网络

转载 作者:行者123 更新时间:2023-12-04 22:58:35 25 4
gpt4 key购买 nike

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

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

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

所以我的情况是:

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

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


    结果:
  • 在“localhost”下从 S2 看不到 S1(这是完全可以预料的)
  • S1 在“172.17.0.1”下的 S2 不可见(= 接口(interface) 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.



    真正实现新功能的是 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

    并查看其他容器中的主机文件如何自动更新
    $ 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

    关于使用 compose 在单个主机上建立 Docker 网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33785804/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com