Docker 容器互聯方法
Docker容器都是獨立的,互相隔離的環境。然而,它們通常只有互相通訊時才能發揮作用。
雖然有許多方法可以連線容器們,可是我將並不會試著去將其全部討論在內。但是在這一系列的方法中,我們將看看那些常用的做法。
雖然看起來是很淺顯,但是這對於與Docker成天打交道的朋友來說,理解這些技術及底層的設計理念就顯得非常地重要了。
理解這些主題將會:
- 幫助開發和運維人員探索廣泛的容器部署的選擇。
- 讓開發和運維人員更自信的著手於微服務(microservice)架構設計。
- 讓開發和運維人員可以較好的編排更復雜的分散式應用程式。
幸運地是,大量的連線選項為容器間通訊開啟了更為廣泛的方法,可以讓我們靈活地選擇一個架構並能適合任何應用程式的需求。
在這篇文章中,我們將會看一下三個較為古老也是更基本的連線各容器的方法。我們會將這種知識和經驗作為基石,然後在下一章節中轉移到兩種較新,較為簡單且更強大的方法。
配置
在我們展示容器間如何被連線之前,我們需要先建立一對容器作為本次的例子。
第一個映象將是來源於一個簡單的Ubuntu作業系統安裝。它將扮演一個客戶端容器的角色。
首先,我們建立該容器並連線到它。
$ sudo docker run -itd --name=client_setup ubuntu /bin/bash $ sudo docker attach client_setup
接下來,一旦有了容器內的shell程式,我們就可以執行以下命令:
$ apt-get install curl
如果你看不見shell命令提示符,點選鍵盤方向區的向上箭頭。
當容器安裝完畢,執行CTRL+P和CTRL+Q命令退出該容器。
緊接著我們停止並提交該容器。
$ sudo docker stop client_setup $ sudo docker commit client_setup client_img
現在我們可以使用剛才建立的名為client_img的容器了。
第二個容器我們還是從之前的Ubuntu作業系統的安裝上獲得。但是這一次,我們將把它修改成一個執行了Apache HTTP的伺服器容器。
首先,我們像之前一樣建立並且連線到它:
$ sudo docker run -itd --name=server_setup ubuntu /bin/bash $ sudo docker attach server_setup
然後,一旦我們可以用容器內的shell程式了,就可以能安裝Apache的HTTP服務了。
$ apt-get install apache2
當容器安裝完畢,執行CTRL+P和CTRL+Q命令退出該容器。
現在我們停止並提交容器:
$ sudo docker stop server_setup $ sudo docker commit server_setup server_img
那麼現在我們就有了兩個映象了,分別是 client_img 和 server_img。
當這些設定好後,我們就可以探索多種的容器間連線的可能性了。
Docker橋接(Bridge)
單個Docker容器是預設地與其他容器和外部網路隔離的。Docker提供了bridge介面,名為docker0,這其實是在Docker Engine安裝時就建立好的。
它通過Docker的bridge介面可以讓容器間以及容器和主機之間進行通訊。
我們可以通過下面的命令來檢視一個位於Docker宿主機上的Docker bridge:
$ ifconfig docker0
你可以看到類似如下的輸出:
docker0 Link encap:Ethernet HWaddr 02:42:a2:dc:0f:a8 inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::42:a2ff:fedc:fa8/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1477 errors:0 dropped:0 overruns:0 frame:0 TX packets:2436 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:83901 (83.9 KB) TX bytes:3606039 (3.6 MB)
該bridge介面在本地一個單獨的Docker宿主機上執行,並且它是我們本篇文章所提及的所有三種方法背後的連線機制。在下一章節中,我們將轉向overlay介面,這種介面允許把網路容器部署在多個Docker宿主機上。
埠公開(Exposing Ports)
首先,讓我們看下如何執行一個容器服務並且公開其80埠(HTTP)給其他容器。
為了這麼做,我通過expose命令去執行該容器,這是告訴Docker在執行該容器的時候讓其公開特定的埠。當然,被公開的埠是可以被其他容器訪問的。
讓我們執行server_img並且把該容器命名為server1,公開其80埠:
$ sudo docker run -itd --expose=80 --name=server1 server_img /bin/bash
接下來我們會按依次命名這些容器(server1,server2以及其他)。
然後,連線到容器:
$ sudo docker attach server1
重申一遍,如果你看不見shell命令提示符,可以使用方向鍵的向上箭頭。
啟動該容器內的Apache HTTP服務:
$ /etc/init.d/apache2 start
讓我們來看下獲得的IP地址:
$ ifconfig eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:03 inet addr:172.17.0.3 Bcast:0.0.0.0 Mask:255.255.0.0
那麼,這樣我們就有了172.17.0.3這個IP地址。讓我們試一下從一個客戶端的容器裡去看這些資訊吧。
開啟第二個終端。
啟動名稱為client1的容器:
$ sudo docker run -itd --name=client1 client_img /bin/bash
進容器裡看一下:
$ sudo docker attach client1
如果你看不見shell命令提示符,可以使用方向鍵的向上箭頭。
讓我們來測試一下到server1的連通性:
$ curl 172.17.0.3
如果一切正常,你應該可以看見基於Apache HTTP服務的預設頁面。這表明client1容器已經可以與server1容器的HTTP埠正確地建立連線了。
埠繫結(Port Binding)
如果我們希望我們的HTTP伺服器公開在主機網路呢,包括主機上的應用及主機網路上的其他機器?在這個方案中,我們需要去將主機埠繫結(bind)至容器埠。
為了讓基於Apache的HTTP伺服器公開給主機所處的網路,我們需要將該容器的80埠繫結至宿主機上的8080埠。
我們可以按照以下命令來這麼做:
$ sudo docker run -itd -p 8080:80 --name=server2 server_img /bin/bash
在這裡需要注意的是-p 8080:80選項。
現在,進容器看下:
$ sudo docker attach server2
如果看不見shell的提示符,和之前一樣,按方向區的向上箭頭,緊接著我們啟動該HTTP服務:
$ /etc/init.d/apache2 start
現在,我們可以從宿主系統去訪問http://localhost:8080/,同時應該能看見基於Apache HTTP服務的預設頁面。
任何在你主機網路內的那些機器都可以訪問由你的宿主機所釋出出來的8080埠。
容器連結(Linking Containers)
Docker將另一種涉及到的連線各容器的方法稱為連結(linking)。
當你將一個容器連結到另一個容器的時候,Docker將通過一些環境變數來關聯這些容器之間的資訊。
我們可以看一下。
首先,啟動該伺服器容器。
$ sudo docker run -itd --name=server3 server_img /bin/bash
接著通過以下命令一樣去啟動客戶機容器並連結至伺服器容器。
$ sudo docker run -itd --link server3 --name=client3 client_img /bin/bash
請注意我們這裡用了–link server3 選項。
接著我們登入到客戶機容器看一眼:
$ sudo docker attach client3
然後我們檢查一下可用的環境變數:
$ env | grep SERVER3 SERVER3_PORT_80_TCP_PROTO=tcp SERVER3_PORT=tcp://172.17.0.2:80 SERVER3_PORT_80_TCP_PORT=80 SERVER3_NAME=/client3/server3 SERVER3_PORT_80_TCP=tcp://172.17.0.2:80 SERVER3_PORT_80_TCP_ADDR=172.17.0.2
Docker同樣也更新了客戶端容器中的/etc/hosts 檔案並且將server3作為一個本地主機指向了伺服器容器。
為了演示該情況,讓我們執行以下命令看一看:
$ curl server3
你應該可以再一次看見那個相同的預設HTML頁面了。
總結
在這一系列的第一部分,我們介紹了Docker橋接(bridge)介面,它可以讓我們連線同一臺宿主機上的各容器。
我們也聊了聊以下三種連線方法:
- 通過埠公開(exposure)連線
- 將宿主機埠繫結(bind)至容器埠
- 通過連結(link)選項去連線兩個容器
在第二部分,我們將一睹隔離容器內部的使用者定義網路。我們也會介紹overlay介面並且看一眼該如何在多個Docker宿主機之間去將Docker容器連線起來。它甚至可以跨越資料中心和雲提供商!
相關文章
- kafka zookeeper docker容器互聯KafkaDocker
- 【Docker】Docker基礎-埠對映與容器互聯Docker
- Docker 築夢師系列(一):實現容器互聯Docker
- 主機和Docker容器之間的檔案互傳方法Docker
- Docker容器間網路互聯原理,講不明白算我輸....Docker
- Docker 入門學習筆記三:Docker獨立IP及容器互聯(待處理)Docker筆記
- C++ vector容器的swap方法(容器互換)C++
- 如何互動式地建立一個Docker容器Docker
- docker link 過時不再用了?那容器互聯、服務發現怎麼辦?Docker
- 進入docker容器的四種方法Docker
- Dry:一個命令列互動式 Docker 容器管理器命令列Docker
- Docker容器學習梳理 - 容器登陸方法梳理(attach、exec、nsenter)Docker
- Docker容器Docker
- 8天入門docker系列 —— 第五天 使用aspnetcore小案例熟悉容器互聯和docker-compose一鍵部署DockerNetCore
- 3568F-Docker容器部署方法說明Docker
- k8s容器互聯-flannel host-gw原理篇K8S
- docker 容器互通Docker
- Docker 容器操作Docker
- 操作Docker容器Docker
- Docker容器操作Docker
- 容器引擎-DockerDocker
- Docker高階應用之多臺主機網路互聯Docker
- Docker容器的退出狀態碼及解決方法Docker
- RORedis快速部署為Docker容器的實現方法zmhRedisDocker
- docker容器技術基礎之聯合檔案系統OverlayFSDocker
- Docker 容器基本操作[Docker 系列-2]Docker
- Docker 入門:容器Docker
- Docker 容器學習Docker
- Docker重要容器命令Docker
- docker容器儲存Docker
- Docker容器的搭建Docker
- 容器Docker詳解Docker
- Docker的容器管理Docker
- 進入Docker容器Docker
- docker建立lnmp容器DockerLNMP
- Docker 容器管理:rancherDocker
- Docker 容器十誡Docker
- 初識Docker容器Docker