Docker幾種網路模式

robin_cai發表於2020-10-05

其於Docker run建立容器時,可以使用–net選項指定容器的網路模式。Docker預設有以下四種網路模式:

Host模式;使用–net=host指定

Host模式,預設Docker容器執行會分配獨立的Network Namespace隔離子系統,基於host模式,容器將不會獲得一個獨立的Network Namespace,而是和宿主機共用一個Network Namespace,容器將不會虛擬出自己的網路卡,配置自己的IP等,而是使用宿主機的IP和埠。

Container模式;使用–net=container:NAME or ID指定

Container模式指定新建立的容器和已經存在的一個容器共享一個Network Namespace,而不是和宿主機共享。即新建立的容器不會建立自己的網路卡,配置自己的IP,而是和一個指定的容器共享IP、埠範圍等。同樣兩個容器除了網路方面相同之外,其他的如檔案系統、程式列表等還是隔離的。

None模式;使用–net=none來指定。

None模式與其他的模式都不同,如果處於None模式,Docker容器擁有自己的Network Namespace,但是並不為Docker容器進行任何網路配置。也就是說該Docker容器沒有網路卡、IP、路由等資訊,需要手工為Docker容器新增網路卡、配置IP等,典型Pipework工具為Docker容器指定IP等資訊;

Bridge橋接模式,這個也是docker預設的網路模式,即Docker run時,不加–net指定網路模式時,自動啟動此模式。

Bridge模式是Docker預設的網路模式,該模式會為每一個容器分配Network Namespace、設定IP、路由等配置,預設會將Docker容器連線到一個虛擬網橋交換機Docker0上
以Bridge橋接模式,說明建立Docker Bridge過程與操作
橋接模式簡單拓撲
在這裡插入圖片描述
建立過程:

  1. 啟動Docker容器之後,首先宿主機上會建立一對虛擬網路卡veth 裝置,veth裝置總是成對出現的,組成了一個資料的通道,資料從一個裝置進入,就會從另一個裝置出來,veth裝置常用來連線兩個網路裝置。
  2. Docker將veth 裝置的一端放在新建立的容器中,並命名為eth0,然後將另一個veth 裝置放在宿主機中,以vethxxx這樣類似的名字命名,並將這個網路裝置vethxxx加入到docker0網橋中,可以通過brctl show命令檢視。
  3. 從docker0子網中分配一個IP給容器使用,並設定docker0的IP地址為容器的預設閘道器。
  4. 此時容器IP與宿主機能夠通訊,宿主機也可以訪問容器中的IP地址,在Bridge模式下,連在同一網橋上的容器之間可以相互通訊,同時容器也可以訪問外網,但是其他物理機不能訪問docker容器IP,需要通過NAT將容器IP的port對映為宿主機的IP和port。

操作方法:

vim /etc/sysconfig/network-scripts/ifcfg-ens33
#修改網路卡,增加:BRIDGE="br0"
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33      
m ifcfg-ens33 
TYPE=Ethernet
BOOTPROTO=static
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0
IPADDR=192.168.68.129
NETMASK=255.255.255.0
GATEWAY=192.168.68.2
DNS1=114.114.114.114
DNS2=1.2.4.8

cp /etc/sysconfig/network-scripts/ifcfg-ens33  /etc/sysconfig/network-scripts/ifcfg-br0
vim /etc/sysconfig/network-scripts/ifcfg-br0

#修改ifcfg-br0如下
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0 
fg-br0 
TYPE=Bridge
BOOTPROTO=static
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.68.129
NETMASK=255.255.255.0
GATEWAY=192.168.68.2
DNS1=114.114.114.114
DNS2=1.2.4.8
[root@localhost ~]# 
#重啟網路卡,啟動docker服務,即可;

service network restart
service docker start

可以看到,現在增加一個br0網路卡並與網路卡ens33繫結了,宿主機有兩個虛擬網路卡:Docker0和br0
在這裡插入圖片描述
Docker預設提供了一個隔離的內網環境,啟動時會在宿主機上建立一個docker0的虛擬網路卡,每個容器都是連線到docker0網路卡上的。而docker0的ip段為172.17.0.1,如果想讓容器與宿主機同一網段的其他機器訪問,就必須在啟動docker的時候將某個埠對映到宿主機的埠。

而為了直接讓容器和宿主機通訊,不需要對映埠,需要修改Docker啟用時候預設使用br0網路卡。這個咋修改呢?需要修改docker這個軟體的配置檔案

ls /etc/sysconfig/docker-network
vim /etc/sysconfig/docker-network
#在DOCKER_NETWORK_OPTIONS=後面增加"-b=br0"
#-b表示指定橋接,br0為橋接網路卡名稱  如果是原始碼安裝docker,執行/usr/local/docker/bin/dockerd -b=br0
[root@localhost ~]# cat /etc/sysconfig/docker-network  
# /etc/sysconfig/docker-network
DOCKER_NETWORK_OPTIONS="-b=br0"   
[root@localhost ~]# 

#重啟一下docker服務
systemctl restart docker

啟docker虛擬機器:

1).自動分配置IP啟動:
docker run -itd –privileged –name=caixin centos7-ansible:V2

這種方式啟動容器,容器只能通過埠對映方式與宿主要通訊,使用上不方便。

2).手機設定IP啟動:
docker run -itd –net=none –privileged –name=caixin centos7-ansible:V2
這種方法可以使啟動的容器的IP和宿主機在同一個網段。直接可以和宿主機通訊,企業生產環境常使用這一種方式。可以使用pipework工具來配置IP。

#首先要下載安裝pipework
wget https://github.com/jpetazzo/pipework/archive/master.zip
mv master.zip  pipework.zip
unzip pipework.zip
cp pipework /usr/bin/

#手動docker一個容器,網路模式為none,然後通過pipework設定新啟動的容器ip:192.168.68.11
[root@localhost pipework-master]# docker run -itd --net=none  --privileged centos7-ansible:V2             
08c6f52a09d7fe1fe1f800cd8fa804562e95760edb15281c16ba518872d04442
[root@localhost pipework-master]# docker ps
CONTAINER ID        IMAGE                COMMAND             CREATED             STATUS              PORTS               NAMES
08c6f52a09d7        centos7-ansible:V2   "/bin/bash"         6 seconds ago       Up 5 seconds                            heuristic_wilson
[root@localhost pipework-master]# pipework br0 08c6f52a09d7 192.168.68.11/24@192.168.68.129

[root@localhost pipework-master]# ping 192.168.68.11
PING 192.168.68.11 (192.168.68.11) 56(84) bytes of data.
64 bytes from 192.168.68.11: icmp_seq=1 ttl=64 time=0.151 ms
64 bytes from 192.168.68.11: icmp_seq=2 ttl=64 time=0.053 ms

以上手動啟動了一臺容器,並手動分配IP。如果一次性啟動多個容器,比如20臺,分配20個IP,怎麼操作?只需要執行:

for i in $(seq 11 30);do docker run -itd --name=vm$i --net=none --privileged centos7-ansible:V2 ;sleep 1 ;pipework br0 vm$i 192.168.68.$i/24@192.168.68.129 ;done

相關文章