天天看點

Docker實戰(五)之端口映射與容器互聯

除了網絡通路外,Docker還提供了兩個很友善的功能來滿足服務通路的基本需求:一個是允許映射容器内應用的服務端口到本地宿主主機;另一個是互聯機制實作多個容器間通過容器名來快速通路。

1.端口映射實作通路容器

(1)從外部通路容器應用

在啟動容器的時候,如果不指定對應的參數,在容器外部是無法通過網絡來通路容器内的網絡應用和服務的。

當容器中運作一些網絡應用,要讓外部通路這些應用時,可以通過-P或-p參數來指定端口映射。當使用-P(大寫的)标記時,Docker會随機映射一個49000~49900的端口到内部容器開放的網絡端口。

docker run -d -P training/webapp python app.py

docker ps -l

Docker實戰(五)之端口映射與容器互聯

此時可以使用docker ps看到,本地主機的49155被映射到了容器的5000端口。通路宿主主機的49155端口即可通路容器内Web應用提供的界面。

同樣,可以通過docker logs指令檢視應用的資訊:

docker logs -f nostalgic_proskuriakova

Docker實戰(五)之端口映射與容器互聯

-p(小寫的)可以指定要映射的端口,并且,在一個指定端口上隻可以綁定一個容器。支援的格式有IP:HostPort:ContainerPort | IP:ContainerPort | HostPort:ContainerPort

(2)映射所有接口位址

使用HostPort:ContainerPort格式将本地的5000端口映射到容器的5000端口,可以執行:

docker run -d -p 5000:5000 training/webapp python app.py

Docker實戰(五)之端口映射與容器互聯

(3)映射到指定位址的指定端口

可以使用IP:HostPort:ContainerPort格式指定映射使用一個特定位址,比如localhost位址127.0.0.1:

docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py

 (4)映射到指定位址的任意端口

使用IP::ContainerPort綁定localhost的任意端口到容器的5000端口,本地主機會自動配置設定一個端口:

docker run -d -p 127.0.0.1::5000 training/webapp python app.py

還可以使用udp來指定udp端口

docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

(5)檢視映射端口配置

使用docker port指令檢視目前映射的端口配置,也可以檢視到綁定的位址:

docker port nostalgic_proskuriakova

Docker實戰(五)之端口映射與容器互聯

docker port nostalgic_proskuriakova 5000

Docker實戰(五)之端口映射與容器互聯

注意:容器有自己的内部網絡和IP位址,使用docker inspect+容器ID可以擷取容器的具體資訊

2.互聯機制實作便捷互訪

容器的互聯是一種讓多個容器中應用進行快速互動的方式。。它會在源和接收容器之間建立連接配接關系,接收容器可以通過容器名快速通路到源容器,而不用指定具體的IP位址。

(1)自定義容器别名

連接配接系統依據容器的名稱來執行。是以,首先需要定義一個好記的容器名字。

雖然當建立容器的時候,系統預設會配置設定一個名字,但自定義容器名字有兩個好處:

a.自定義名字比較好記,比如一個web應用容器,我們可以給它起名叫web,一目了然;

b.當要連接配接其他容器時,即便重新開機,也可以使用容器名而不用改變,比如連接配接web容器到db容器;

使用--name标記可以為容器自定義命名:

docker run -d -P --name web training/webapp python app.py

Docker實戰(五)之端口映射與容器互聯

注意:容器的名稱是唯一的。如果已經命名一個叫web的容器,當你要再次使用web這個名稱的時候,需要先用docker rm來删除隻有建立的同名容器。

在執行docker run的時候如果添加--rm标記,則容器在終止後會立刻删除。注意,--rm和-d參數不能同時使用。

(2)容器互聯

使用--link參數可以讓容器之間安全地進行互動。

下面建立一個新的資料庫容器:

docker run -d --name db training/postgres

删除之前的web容器

docker rm -f web

然後建立一個新的web容器,并将它連接配接到db容器:

docker run -d -P --name web --link db:db training/webapp python app.py

此時,db容器和web容器建立互聯關系:

--link參數的格式為--link name:alias,其中name是要連接配接的容器名稱,alias是這個連接配接的别名。

使用docker ps 來檢視容器的連接配接,如下所示:

Docker實戰(五)之端口映射與容器互聯

可以看到自定義命名的容器,db和web,db容器的names列有db也有web/db。這個表示web容器連接配接到db容器,這允許web容器通路db容器的資訊。

Docker相當于在這兩個互聯的容器之間建立一個虛機通道,而且不用映射它們的端口到宿主主機上。在啟動db容器的時候并沒有使用-p和-P标記,進而避免了暴露資料庫服務端口到外部網絡上。

Docker通過兩種方式為容器公開連接配接資訊:

a.更新環境變量;

b.更新 /etc/hosts檔案

使用env指令來檢視web容器的環境變量:

docker run --rm --name web2 --link db:db training/webapp env

Docker實戰(五)之端口映射與容器互聯

其中DB_開頭的環境變量是供web容器連接配接db容器使用的,字首采用大寫的連接配接别名。

除了環境變量之外,Docker還添加host資訊到父容器的/etc/host檔案。下面是父容器web的hosts檔案:

docker run -t -i --rm --link db:db training/webapp /bin/bash

cat /etc/host

Docker實戰(五)之端口映射與容器互聯

這裡有兩個hosts資訊,第一個是web容器,web容器用自己的id作為預設主機名,第二個是db容器的IP和主機名。可以在web容器中安裝ping指令來測試與db容器的連通:

Docker實戰(五)之端口映射與容器互聯

用ping來測試db容器,它會解析成172.17.0.8。使用者可以連接配接多個子容器到父容器,比如可以連接配接多個web到同一個db容器上。

在生産環境中,網絡方面的需求更加複雜多變,包括跨主機甚至跨資料中心的通信,這時候往往就需要引入額外的機制,例如SDN(軟體定義網絡),NFV(網絡功能虛拟化)的相關技術。