Docker學習筆記:docker compose 中難纏的網路問題
越來越多的開發者被帶到Docker的使用中,至少我的所有開發環境都是Docker的,ofollow,noindex">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 。