V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
qsnow6
V2EX  ›  问与答

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

  •  
  •   qsnow6 · 2017-09-05 23:34:00 +08:00 · 4121 次点击
    这是一个创建于 2666 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    第 1 条附言  ·  2017-09-06 17:10:54 +08:00

    使用方法 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 条回复    2017-09-06 11:49:07 +08:00
    arischow
        1
    arischow  
       2017-09-05 23:52:17 +08:00
    这两天刚好在弄类似的东西

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


    如果你用的 docker-compose
    用到的是 networks 和 external
    https://docs.docker.com/compose/networking/
    arischow
        2
    arischow  
       2017-09-05 23:52:52 +08:00
    OOOOOH NO,我错了
    你这个问题在 docker-compose 用 link 就能解决了
    arischow
        3
    arischow  
       2017-09-06 00:02:34 +08:00
    #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
       2017-09-06 00:14:11 +08:00
    @arischow 是通过 expose 来把容器 A 的端口暴露给容器 B ?

    直接 localhost:port 就可以了吗
    qsnow6
        5
    qsnow6  
    OP
       2017-09-06 00:18:26 +08:00
    我用的也是 flask,数据库在另外一个容器里;

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

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

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

    容器网络
    1. none
    2. bridge
    3. host
    4. container
    qsnow6
        15
    qsnow6  
    OP
       2017-09-06 11:29:12 +08:00
    @hxsf 明白了,我看的文档上面,说显示有 none、bridge、host 这三个网络。。。
    qsnow6
        16
    qsnow6  
    OP
       2017-09-06 11:49:07 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3073 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 12:51 · PVG 20:51 · LAX 04:51 · JFK 07:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.