Docker学习笔记:docker compose 中难缠的网络问题

越来越多的开发者被带到Docker的使用中,至少我的所有开发环境都是Docker的,Github直达。本人习惯用 Docker compose 来管理,在各种各样的容器之间,网络问题时不时的就蹦出来,现我就过程中遇到的问题做出自己的总结。

同一个 docker-compose 文件中的容器如何互联?

在整理开发环境时,我习惯性的把php和nginx放在一起,方便启动时能够同时启动。所以会把 nginx 和 php 放在同一个 docker-compose 中。那么如何保证 nginx 能转发到 php 呢?

links
version: "3"
services:
  nginx:
    image: nginx:1.15
    links:
      - "php7cache"
  php7cache:
    build: .

这样nginx和php就能简单的通信了。当然,我们的php不会是独立的,一般还会用到mysql,但是又不是必要的,所以我又单独启动了一个mysql容器。独立的mysql容器,独立的docker-compose文件。那么这时候又要怎样连接呢?

不同 docker-compose 文件中的容器如何互联?

external_links

external_links是连接外部网络的方式,这种方案来源于网上,如下:

  ...
  # other
  ...
  php7cache:
    build: .
    networks:
      - default
      - app_net
    external_links:
      - redis
      - mysql
networks:
  app_net:  # 定义了一个 app_net 的网络
    external: true # 并标识为外部网络
networks

在使用external_links这个过程中我意识的,这生效的极有可能不是external_links,而是在networks服务生效了,于是做了尝试,发现真的可以,我的理解是 app_net 其实是重新定义了一个网络,然后在容器的net_works参数上指定加入了 app_net 中。

version: "3"
services:
    flume:
        image: probablyfine/flume
        networks:
            - default
            - kafka_default
networks:
    kafka_default:
        external: true

细心的同学可能已经发现了,在上面的代码中我并没有再使用app_net,而是直接使用了kafka_default。为什么?其实,当使用 “docker network ls” 命令时,我们会发现在当指定 app_net 时,列表中会包含 app_net 网络,同时,也会有各种容器的 default 网络,如:kafka_default。为了偷懒,我就直接使用了 kafka_default。

extra_hosts

最近,又有一个需求,我的docker需要使用与宿主机同一网络的其它服务。尝试很多方法,改hosts、创建新网络,发现都无法解决。后来才发现还有extra_hosts参数,尝试了一下,发现真的可行。

version: "3"
services:
    flume_events:
        image: probablyfine/flume
        container_name: flume_events
        environment:
            FLUME_AGENT_NAME: agent
        extra_hosts:
            - "test-1:10.3.8.49"

指定extra_hosts后,在宿主机上修改host。然后在flume的配置文件中指定kafka的链接为 test-1:9092

转发请注明出处,来自三岁于辛的博客!原文链接

你可能感兴趣的:(Docker学习笔记:docker compose 中难缠的网络问题)