Docker 虛擬化

效能更快、資源更省 Docker虛擬化技術簡介

2015-03-13
虛擬化風潮席捲全球,技術日益翻新,目前最受矚目的是Docker,其虛擬獨立環境內無須另外運行的作業系統核心及相關系統程,所以需動用到的系統資源大幅減少。本文將詳解Docker的運作原理,並說明如何手動為容器配置對外固定IP位址。
Docker連接埠映射網路

前面提到,目前建立的Docker容器都是在172.17.0.0這個NAT網路內,外界是無法連線進容器的,若要讓外界可以連線進容器中,可使用Docker所提供的網路埠(Port)映射方式。首先仿照前面容器匯入的方式建立一個安裝好ssh伺服器軟體的映像。若要在Debian容器中安裝ssh伺服器,可使用「apt-get install openssh-server」指令新建好具備ssh伺服器的Debian映像檔,如圖22所示。


▲圖22 新建具備ssh伺服器的Debian映像檔debian:sshd。

然後使用指令「docker run --name debian7sshd -p 22222:22 -t -i debian:sshd /bin/bash」建立並啟動一個名稱為「debian7sshd」的容器,-p選項是將CentOS 7主系統中的網路埠22222對映到容器內的ssh標準埠22,如圖23所示。


▲圖23 建立並啟動一個具備ssh伺服器軟體並有外界網路埠對應的容器。

如圖23所示,在容器中還使用指令「/etc/init.d/ssh start」將ssh伺服器啟動,並檢視到系統中多了一個「/usr/sbin/sshd」在執行,最後在容器中採用「passwd」指令設定root密碼。

此時便可以使用ssh透過22222連接埠連接進入具備ssh伺服器的debian7sshd容器,如圖24所示。這個時候,CentOS 7的主系統主機IP位址為192.168.43.182,連接進入後,可以看到提示符號中容器的識別ID,與進入容器中提示符號的容器識別ID是一樣的。


▲圖24 ssh透過22222連接埠連接進入具備ssh伺服器的容器。

手動為容器配置對外固定IP位址

使用連接埠映射,似乎不是很方便。Docker的網路設定部分還在積極改良中,目前若要設定固定的對外IP位址,需要用指令手動設定。

首先執行指令「/etc/init.d/network stop」將CentOS 7主系統網路關閉,接著再使用指令「ip link add br0 type bridge」新增一個橋接網路介面br0,之後執行指令「ip link set enp0s3 master br0」將主系統上對外網卡enp0s3橋接到br0上。橋接後,使用指令「dhclient br0」指令讓br0取得對外網址,稍後容器會藉由橋接到br0來取得外部網址,整個執行過程如圖25所示。


▲圖25 新建立一個橋接網路卡br0橋接到外部網路。

由圖25可以發現,br0已由區網中取得一個網路IP位址192.168.43.182,接著使用指令「docker run --name debian7sshd --net=none -t -i debian:sshd /bin/bash」建立並啟動一個具備ssh伺服器的容器。不過,這裡使用選項「--net=none」指定此容器不套用預設的Docker網路設定,因為後續要透過CentOS 7主系統進行配置。目前的容器網路配置,如圖26所示。


▲圖26 不使用預設Docker網路設定的容器網路初步配置。

這裡要說明的是,在Docker容器中網路部分的配置都是由Docker或是透過主系統來設定,使用者不被允許在容器內改動,以避免系統安全性問題。接著使用指令「docker inspect -f '{{.State.Pid}}' ab355fd31ff7」來取得容器在主系統的行程ID。

如圖27所示,其中的ab355fd31ff7為剛建立容器的容器識別ID,這裡取得的行程ID為21750。接著使用指令「mkdir -p /var/run/netns」建立網路命名空間(Name Space)的對映目錄。然後以「ln -s /proc/21750/ns/net /var/run/netns/21750」指令在對映目錄內將容器行程下網路命名空間連結過來。


▲圖27 取得容器ID及容器在主系統的行程ID。

接著在主系統中建立一對點對點(Peer)相通的虛擬網路介面,分別為給主系統使用的q21750及給容器使用的r21750,使用的指令為「ip link add q21750 type veth peer name r21750」,其中的q21750與r21750可自行命名,只要方便識別是一對即可。

建立完成後,使用指令「ip link set q21750 master br0」將q21750橋接到對外網路,同時利用指令「ip link set q21750 up」讓網路卡q21750啟動,目前這兩張成對的虛擬網路配置如圖28所示。


▲圖28 兩張成對的虛擬網路配置。

至此,主系統的網路配置完成了,接著設定容器的網路,同樣都在主系統中以root身分操作,先使用指令「ip link set r21750 netns 21750」將r21750與容器的網路命名空間連結起來,然後執行「ip netns exec 21750 ip link set dev r21750 name eth0」指令,在容器中建立eth0網路介面對應到網路命名空間的r21750。

接著,使用指令「ip netns exec 21750 ip link set eth0 up」讓eth0在容器中啟動,此時在容器中就可以看到eth0網路卡出現了,如圖29所示。


▲圖29 容器中出現了新增的eth0網路卡。

最後使用底下兩個指令,分別設定容器中eth0網路卡的IP位址及網路閘道:


此時,容器便可使用固定的IP位址與外部網路連通,外部網路也可直接連接到容器所提供的服務。這讓容器更接近一台可獨立對外提供服務的虛擬伺服器,但是使用的系統資源卻遠少於一般使用Hypervisor的平台虛擬化技術,而這也是目前Docker最大的優點。

結語

設定外部網路連線的步驟比較繁複,但是反而能夠由這些步驟一窺作為Linux作業系統層級虛擬化技術基礎之命名空間的基本架構,下一次將進一步介紹Docker在系統映像檔及容器的進階管理與使用,同時也會介紹一些網路、系統工具以及應用。

<本文作者:黃明華,目前主要擔任雲端及儲存技術顧問,負責協助開發相關應用產品。擅長研究各式系統及程式技術,並提供相關技術支援、諮詢、導入及評估服務,特別是自由軟體/開放原始碼相關系統與技術。>


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!