V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
SlipStupig
V2EX  ›  程序员

想问一下 docker link 问题

  •  
  •   SlipStupig · 2017-06-03 20:38:35 +08:00 · 3875 次点击
    这是一个创建于 2730 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我现在有多个 mongodb 的容器,有一个 tornado 的服务端,tornado 不在一起,我怎么通过 link 到 mongodb,但是我程序里面怎么才能知道 mongodb 的地址和端口呢?
    第 1 条附言  ·  2017-06-04 10:28:48 +08:00
    如果用 swarm 可以远程映射么?
    13 条回复    2017-06-05 12:22:35 +08:00
    zuolan
        1
    zuolan  
       2017-06-03 20:43:03 +08:00
    Docker 的 link 实际上会修改容器的 /etc/hosts 文件,所以直接使用 mongodb 的容器名称加上端口号就可以连接了,有点像使用域名连接一样。
    SlipStupig
        2
    SlipStupig  
    OP
       2017-06-03 21:30:57 +08:00
    @zuolan 哦,那程序里面要改成 host:port 这种形式?
    tlday
        3
    tlday  
       2017-06-03 21:53:34 +08:00 via Android
    link 选项已经不推荐了,你说的这些 docker 文档写的很清楚
    SlipStupig
        4
    SlipStupig  
    OP
       2017-06-03 21:56:26 +08:00
    @tlday 有什么更好的办法吗?
    tlday
        5
    tlday  
       2017-06-03 22:01:08 +08:00 via Android   ❤️ 1
    Warning: The --link flag is a deprecated legacy feature of Docker. It may eventually be removed. Unless you absolutely need to continue using it, we recommend that you use user-defined networks to facilitate communication between two containers instead of using --link. One feature that user-defined networks do not support that you can do with --link is sharing environmental variables between containers. However, you can use other mechanisms such as volumes to share environment variables between containers in a more controlled way.
    出处:https://docs.docker.com/engine/userguide/networking/default_network/dockerlinks/#connect-using-network-port-mapping
    yiding
        6
    yiding  
       2017-06-03 22:58:38 +08:00 via iPhone
    @SlipStupig 可以使用 network 参数,最新的几个版本中都有
    https://docs.docker.com/engine/userguide/networking/#default-networks
    beginor
        7
    beginor  
       2017-06-04 07:59:55 +08:00 via Android
    确实不推荐使用 link, 建议使用指定 network 或者 volume 的形式
    SlipStupig
        8
    SlipStupig  
    OP
       2017-06-04 10:32:40 +08:00
    @beginor 我是使用 docker-compose 构建的,我该如何编排多个容器呢?
    deepzz
        9
    deepzz  
       2017-06-04 15:14:56 +08:00
    有 a-docker-compose.yml 和 b-docker-compose.yml:
    version: '2'
    services:
    ping:
    image: alpine
    command: ping redis
    external_links:
    - redis

    networks:
    default:
    external:
    name: a_default

    这是 b-docker-compose.yml。目的是去 ping redis。
    在 a.docker-compose.yml 启动的时候创建了默认的网络 a_default (你可以通过 $docker network ls 查看)并启动了 redis.

    那么重要的来了,你需要在 b-docker-compose.yml 中指定 a 的 networks,如上面所示。
    SlipStupig
        10
    SlipStupig  
    OP
       2017-06-04 15:36:47 +08:00
    @deepzz 如果 host 和容器不是一个机器也可以嘛?
    jhsea3do
        11
    jhsea3do  
       2017-06-05 11:16:46 +08:00
    既然使用 link, 你应该不太用 scale 的,

    其实指定 hostname / domainname 就可以了,另外 可以考虑指定 depends_on

    如果两个 container 都在同一个域下面,可以直接用主机名互相访问的
    jarlyyn
        12
    jarlyyn  
       2017-06-05 12:01:12 +08:00
    制定 network 比较好用
    beginor
        13
    beginor  
       2017-06-05 12:22:35 +08:00 via Android
    @SlipStupig 就是按照 deepzz 的配置, 网络配好就行
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2413 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 01:59 · PVG 09:59 · LAX 17:59 · JFK 20:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.