qsnow6
V2EX  ›  问与答

不同容器之间端口通信困惑 for docker

  •  
  •   qsnow6 · Sep 5, 2017 · 4562 views
    This topic created in 3264 days ago, the information mentioned may be changed or developed.

    比如我有 A,B 两个容器,A 容器是 Mongodb 数据库,连接端口是 27017 ;

    B 容器是一个 web 服务器,如果需要在 B 容器中使用localhost:27017连接 A 容器中的数据库,应该怎么配置?

    Supplement 1  ·  Sep 6, 2017

    使用方法 docker run --network container:<id|name> [other-options] <image[:tag]> 这样两个容器就会使用同一个网络栈,做到使用 127.0.0.1 去访问另一个容器监听的端口了。
    当然了,多个容器之间无法监听统一端口了
    感谢11楼 @hxsf

    官方文档: https://docs.docker.com/engine/reference/run/#network-settings

    done

    16 replies    2017-09-06 11:49:07 +08:00
    arischow
        1
    arischow  
       Sep 5, 2017
    这两天刚好在弄类似的东西

    新建一个 network
    然后把他们 connect 起来
    https://docs.docker.com/engine/userguide/networking/


    如果你用的 docker-compose
    用到的是 networks 和 external
    https://docs.docker.com/compose/networking/
    arischow
        2
    arischow  
       Sep 5, 2017
    OOOOOH NO,我错了
    你这个问题在 docker-compose 用 link 就能解决了
    arischow
        3
    arischow  
       Sep 6, 2017
    #2 'links' - https://docs.docker.com/compose/compose-file/#links

    ```
    services:
    db-mysql:
    build: ./db
    environment:
    - MYSQL_ROOT_PASSWORD=mysql

    app-flask:
    build: .
    expose:
    - 5123
    environment:
    - APP_SETTINGS=instance.config.ProductionConfig
    - DATABASE_URL=mysql+pymysql://root:mysql@db-mysql/demo
    links:
    - db-mysql
    ```
    qsnow6
        4
    qsnow6  
    OP
       Sep 6, 2017
    @arischow 是通过 expose 来把容器 A 的端口暴露给容器 B ?

    直接 localhost:port 就可以了吗
    qsnow6
        5
    qsnow6  
    OP
       Sep 6, 2017
    我用的也是 flask,数据库在另外一个容器里;

    默认数据库地址是:localhost:27017

    想在不改变默认配置的情况下通过 localhost:27017 就能访问数据库容器
    mooncakejs
        6
    mooncakejs  
       Sep 6, 2017 via iPhone   ❤️ 1
    把 network 设置成 host,只有这一个方法
    arischow
        7
    arischow  
       Sep 6, 2017 via iPhone
    @qsnow6 我还是看错了,你是要用 localhost 访问,sorry
    wellsc
        8
    wellsc  
       Sep 6, 2017 via iPhone   ❤️ 1
    @arischow 现在已经不推荐用 link 了
    wellsc
        9
    wellsc  
       Sep 6, 2017 via iPhone
    Mongo conf 中的 host 设置成 0.0.0.0,a,b 容器在同一网段就可以了。
    microhz
        10
    microhz  
       Sep 6, 2017 via iPhone
    可以用 spring cloud config 去配置中心拿地址
    hxsf
        11
    hxsf  
       Sep 6, 2017   ❤️ 2
    楼上的各位,docker 容器网络有 container-network 的。。。可以多个容器使用同一网络栈

    使用方法 docker run --network container:<id|name> [other-options] <image[:tag]>
    这样两个容器就会使用同一个网络栈,做到使用 127.0.0.1 去访问另一个容器监听的端口了。
    当然了,多个容器之间无法监听统一端口了
    dangyuluo
        12
    dangyuluo  
       Sep 6, 2017
    @hxsf 学习了这个,一直使用 link 来通信的
    qsnow6
        13
    qsnow6  
    OP
       Sep 6, 2017
    @hxsf 你说的是`--network=host` 吗
    hxsf
        14
    hxsf  
       Sep 6, 2017   ❤️ 1
    @qsnow6 #13 难道我描述有问题? --network container:<id|name>

    容器网络
    1. none
    2. bridge
    3. host
    4. container
    qsnow6
        15
    qsnow6  
    OP
       Sep 6, 2017
    @hxsf 明白了,我看的文档上面,说显示有 none、bridge、host 这三个网络。。。
    qsnow6
        16
    qsnow6  
    OP
       Sep 6, 2017
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5672 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 03:07 · PVG 11:07 · LAX 20:07 · JFK 23:07
    ♥ Do have faith in what you're doing.