Docker動手教程5.1:容器單機網絡1

內容摘要

none網絡

host網絡

bridge網絡

初步觀察容器網絡

安裝網橋管理工具

為了便於觀察容器網絡,在容器測試環境中安裝 brctl 命令,命令為:

yum install bridge-utils

查詢所有網橋信息:

brctl show
Docker動手教程5.1:容器單機網絡1

在容器環境中容器的網橋為docker0。

查詢容器網絡

使用命令:

docker network ls
Docker動手教程5.1:容器單機網絡1

可以看到有3種容器網絡: bridge,host,none。

使用 ifconfig 查詢容器環境網絡設備:

Docker動手教程5.1:容器單機網絡1

說明:

1、eth0 表示第一塊網卡, eth0是以太網設備編號0(0就是第一塊,linux是從0開始編號的)

2、lo 是表示主機的迴環地址127.0.0.1,這個一般是用來測試一個網絡程序,但又不想讓局域網或外網的用戶能夠查看,只能在此臺主機上運行和查看所用的網絡接口。

3、mtu 1500 網卡的最大傳輸單元 (bytes)為1500。

4、docker0 是容器的虛擬網橋。

容器在安裝時,自動創建了3種網絡:none,host,bridge,下面分別予以介紹。

none網絡

運行 busybox 容器,使用none網絡,命令為:

docker run -it --network=none --name busybox1 busybox
Docker動手教程5.1:容器單機網絡1

容器運行時使用 --network=none 參數。

在容器種使用 ip -a 查詢網絡設備,可以看到只有迴環設備。

退出容器,使用 docker inspect 命令查看容器網絡配置:

Docker動手教程5.1:容器單機網絡1

可以看到 IPAddress 和 Gateway 沒有值。

使用 brctl show 查看容器網橋:

Docker動手教程5.1:容器單機網絡1

可以看到 interfaces 列沒有信息。

從上面可以看出 none 網絡的容器,主機是沒有辦法訪問的,容器完全封閉。

host網絡

運行 busybox 容器,使用 host 網絡,命令為:

docker run -it --network=host --name busybox2 busybox
Docker動手教程5.1:容器單機網絡1

在容器種查詢網絡,之後再主機種查詢,可以看到容器網絡和主機網絡居然一模一樣。

而且,容器的 hostname 竟然也是 ~,即root。

使用 docker inspect 觀察容器:

Docker動手教程5.1:容器單機網絡1

可以看到 Gateway和IPAddress 兩個參數值為空。

查看 容器網橋 docker0:

Docker動手教程5.1:容器單機網絡1

可以看到:interfaces 列沒有任何數據。

bridge網絡

在實驗前,請使用快照恢復容器環境到最初。

先使用 brctl show 命令查詢網橋信息:

Docker動手教程5.1:容器單機網絡1

使用 bridge 網絡部署容器 tomcat:jdk8,命令為:

docker run -d -p 8080 --name=tomcat8 --network=bridge tomcat:jdk8
 
Docker動手教程5.1:容器單機網絡1

使用bridge網絡運行tomcat容器後,進入容器,使用 ip a 命令查詢網絡設備,可以發現除了迴環設備lo外,還有一塊虛擬網卡:eth0@if25,IP地址為172.17.0.2/16。

在主機中查詢網橋信息,看發生了什麼變化:

Docker動手教程5.1:容器單機網絡1

可以看到多了veth設備,網絡對。

使用 docker inspect 查看容器網絡配置信息:

Docker動手教程5.1:容器單機網絡1

可以看到Gateway是 172.17.0.1,這個IP地址剛好是docker0 的IP地址。

在主機中查看網絡設備:

Docker動手教程5.1:容器單機網絡1

可以看到主機中 docker0的IP地址的確是172.17.0.1,它是tomcat容器的網關。

最下面是新建的veth,veth設備相當於一根網線,將容器的虛擬網卡和主機的docker0鏈接起來,從而使得容器可以被主機訪問。

下面分別在主機和容器中相互ping一下,看網絡能否聯通:

Docker動手教程5.1:容器單機網絡1

可以發現,網絡是互通的。

問題:容器的IP為172.17.0.2,為什麼是這個網段?

使用 docker network inspect 命令查看 bridge網絡的配置:

Docker動手教程5.1:容器單機網絡1

可以看到Subnet為:172.17.0.0/16,容器IP剛好在該網段中。

自定義bridge網絡

docker在安裝成功後,自動創建3種類型網絡。我們也可以自己定義網絡,下面演示下如何自定義bridge網絡。

創建名為hello_net的網絡,命令為:

 docker network create --driver bridge hello_net
Docker動手教程5.1:容器單機網絡1

查詢網橋:

Docker動手教程5.1:容器單機網絡1

可以看到多個一個網橋設備:br-6a4613082c78

查詢自定義網絡詳細信息:

Docker動手教程5.1:容器單機網絡1

可以看到新建網絡的Subnet和網關分別為: 172.19.0.0./16,172.19.0.1。

下面使用自定義網絡運行上面的tomcat:jdk8容器,命令為:

docker run -d -p 8080 --name=tomcat8 --network=hello_net tomcat:jdk8
Docker動手教程5.1:容器單機網絡1

運行成功後,進入容器,可以看到新建的網卡IP為172.19.0.2,該IP地址處於hello_net網絡的網段中;

查詢網橋可以看到interfaces多了一個veth設備。

上面自定義網絡的網段和網關是docker自動生成的,實際上可以自己指定網段和網關:

使用如下命令創建網絡:

docker network create --driver bridge --subnet 172.20.0.0/16 --gateway 172.20.0.1 hello_net2
Docker動手教程5.1:容器單機網絡1

可以發現,網段和網關就是我們定義的方式。

下面使用該網絡運行tomcat:jdk8容器,同時,我們可以自己指定IP地址:172.20.0.2,命令為:

docker run -d -p 8080 --name=tomcat8 --network=hello_net2 --ip 172.20.0.2 tomcat:jdk8
Docker動手教程5.1:容器單機網絡1

可以看到日期的IP地址和指定的一樣。

至此,容器主機網絡就講完了,請大家在自己的容器環境中實驗。

實驗

創建容器,使用none網絡

創建容器,使用host網絡

創建容器,使用bridge網絡

常用命令

sudo docker rm -f $(sudo docker ps -a | awk 'NR == 1 {next} {print $1}')

sudo docker rmi -f $(sudo docker images | awk 'NR == 1 {next} {print $3}')

docker rmi httpd


分享到:


相關文章: