新聞中心
替代Docker Compose實現(xiàn)容器雙向聯(lián)通的三種方法
作者:邵長鈺 翻譯 2015-12-30 09:58:49
云計算 目前容器的雙聯(lián)是一個難點,必須手動配置。這篇文章介紹了實現(xiàn)雙聯(lián)的三種方法,對想玩容器的開發(fā)者來說有一定的幫助作用。

企業(yè)建站必須是能夠以充分展現(xiàn)企業(yè)形象為主要目的,是企業(yè)文化與產(chǎn)品對外擴展宣傳的重要窗口,一個合格的網(wǎng)站不僅僅能為公司帶來巨大的互聯(lián)網(wǎng)上的收集和信息發(fā)布平臺,成都創(chuàng)新互聯(lián)公司面向各種領(lǐng)域:水處理設備等成都網(wǎng)站設計公司、成都全網(wǎng)營銷解決方案、網(wǎng)站設計等建站排名服務。
Docker 是目前最熱門的技術(shù)平臺之一,他在產(chǎn)生后很短的時間內(nèi)就獲得了社會的廣泛關(guān)注。簡單的說,他使得開發(fā)者和系統(tǒng)管理員能夠用一種簡易的方法去部署分布式應用。Docker 的生態(tài)系統(tǒng)非常龐大,有很多的工具協(xié)同工作,比如最常用的工具之一:Docker Compose。他使你可以在單個文件中定義并運行多容器應用,然后通過一個命令執(zhí)行。
一個 docker-compose.yml 文件看起來是這樣的:
links 選項使容器能夠在一個運行中創(chuàng)建的內(nèi)部網(wǎng)絡中通訊,并且在運行終止后銷毀。在上面的例子中,當這個應用啟動時,將在 web 容器中的 /etc/hosts 文件中建立一個別名為“redis”的入口,這使web容器能接通 redis 容器的服務。
問題
到目前為止,這個工具使你能夠通過一個命令運行多容器服務應用。但是,如果你的容器間有復雜的連通,這就有可能會導致問題甚至應用無法運行。這里復雜的意思是多于一個的容器通過 links 選項共用另一個容器的服務。舉例來說,在上面的應用中,web 容器想使用 redis 容器中的服務,如果在 redis 容器中添加“l(fā)inks:-web”并且通過 docker-compose 來運行他,你會看到如下信息:
事實上,這是 Docker 的一個歷史問題,Docker 的網(wǎng)絡系統(tǒng)曾有一些問題,而這正是一個典型體現(xiàn)。社區(qū)建議使用 ambassador pattern 作為解決這個問題的方法,但是這個解決方法增加了你應用的開銷,畢竟這只是一個變通方法,不是一個 docker 化的解決方式。
因為我在自己的應用開發(fā)中面臨這個問題,所以我尋找了一些基于 Docker 平臺和 Docker 工具的方法,下面是我嘗試成功的三種解決方法。
解決方案1:使用新的 Docker 網(wǎng)絡接口
Docker 在DockerCon 2015上宣布了很多新的特性和工具,其中一個進步就是新的網(wǎng)絡系統(tǒng)。新的網(wǎng)絡類型使我能夠采用一個簡單的方法來實現(xiàn)一個有復雜通訊的多容器應用。
使用下面的方法使在同一個私有網(wǎng)絡中的兩個容器相互可見。
創(chuàng)建一個網(wǎng)絡
- docker network create mynetwork
通過列舉所有的網(wǎng)絡,確保這個網(wǎng)絡成功創(chuàng)建。
- docker network ls
把容器連接到你的網(wǎng)絡上
打開一個終端,執(zhí)行以下命令來運行一個容器:
- docker run -it --publish-service web.mynetwork web
打開另一個終端并且運行另一個容器:
- docker run -it --publish-service redis.mynetwork redis
容器相互可見
現(xiàn)在,你可以從第一個終端 ping redis.mynetwork 并且收到回復。同樣,從第二個終端,你可以 ping web.mynetwork 并收到回復。這是發(fā)布在.下的服務。
通過這種方法,你無需將自己的應用與 Docker Compose 鏈接,你只需創(chuàng)建一個網(wǎng)絡并且在這個網(wǎng)絡上發(fā)布服務。換句話說,我們將 docker-compose.yml 的連接替換為一個網(wǎng)絡。
雖然這個功能還在試驗中(在本文寫作時),但我認為這種靈活的方式就是運行多容器應用的未來,所以,建議你遵循 Docker 發(fā)展的方向。
解決方案2:在多主機網(wǎng)絡中使用 Docker Swarm 和 Compose
在多主機網(wǎng)絡中使用 Swarm 和 Compose 也是一個實驗性的功能。這個解決方案比前一個需要做更多的工作,但是,如果你有很多容器需要連接并且你打算讓他們運行在集群中,這是最好的解決方法。
關(guān)于解決的詳細流程,請參照 GitHub 里的原始功能介紹。首先,在多主機網(wǎng)絡中安裝 Swarm,然后你可以在去掉 links 選項后立即運行一個組合應用。為什么?因為從這個使用 Swarm 集群的多主機網(wǎng)絡上啟動的每一個容器都默認使用“overlay:multihost”網(wǎng)絡,這意味著他們可以通過容器名相互訪問。
因為這是實驗性功能,所以請在 GitHub 給作者反饋。
解決方案3:使用外部 DNS 容器
一個經(jīng)典的解決方法(我覺得是臨時方法)是在你的 docker-compose.yml 文件中添加一個額外的容器。添加如下的容器到你的文件中。
- dnsdock:
- image: tonistiigi/dnsdock
- volumes:
- - /var/run/docker.sock:/run/docker.sock
- ports:
- - 172.17.42.1:53:53/udp
并且,在每個容器中你需要做如下的操作:
告訴容器 DNS 服務在什么位置:
- dns: 172.17.42.1
命名每個容器使其對于服務發(fā)現(xiàn)可見
- environment:
- - DNSDOCK_NAME=web
- - DNSDOCK_IMAGE=web
使用環(huán)境變量來完成這個命名。對 redis 容器做同樣的操作(不管你的其他容器是什么)。
現(xiàn)在容器在..docker下相互可見。這就是 redis 容器和 web 容器中的服務在 web.docker 下通信的方法。
網(wǎng)站欄目:替代DockerCompose實現(xiàn)容器雙向聯(lián)通的三種方法
網(wǎng)頁網(wǎng)址:http://www.dlmjj.cn/article/cdjgddo.html


咨詢
建站咨詢
