1. 程式人生 > >Docker學習筆記之容器的四種網路模式

Docker學習筆記之容器的四種網路模式

首先從映象庫pull一個rhel7的映象下來,這些東西你得玩,光看沒意思。
本人pull了前兩個映象進行測試,如果連線失敗可以多試幾次,連上之後速度不算很差
這裡寫圖片描述

docker pull richxsl/rhel7
docker pull bluedata/rhel7

這裡寫圖片描述

首先溫習一下前面有用到的命令

1.執行NGINX容器,並且將網站預設釋出目錄與真機的/tmp/website目錄進行對映,方便在真機中進行開發:

docker run -it --name vm1 --net host -v /tmp/website:/usr/share/nginx/html nginx

2. 在宿主機中通過Docker執行命令檢視容器ip:

docker exec vm1 ip addr

3. 批量終止或者刪除容器:

# docker kill `docker ps -aq`

# docker rm `docker ps -aq`

這裡寫圖片描述

1. 容器的四種網路模式

Docker在建立容器時有四種網路模式,bridge為預設不需要用–net去指定,其他三種模式需要在建立容器時使用–net去指定。

bridge模式,使用–net=bridge指定,預設設定。 
none模式,使用–net=none指定。 
host模式,使用–net=host指定。 
container模式,使用–net=container:容器名稱或ID指定

啟動容器時可以使用 –net 引數指定,預設是橋接模式。

1.1 Bridge 橋接模式的實現步驟主要如下:
這裡寫圖片描述

(1) Docker Daemon 利用 veth pair 技術,在宿主機上建立兩個虛擬網路介面裝置,假設為veth0 和 veth1。而 veth pair 技術的特性可以保證無論哪一個 veth 接收到網路報文,都會將報文傳輸給另一方。
(2) Docker Daemon 將 veth0 附加到 Docker Daemon 建立的 docker0 網橋上。保證宿主機的網路報文可以發往 veth0;
(3) Docker Daemon將 veth1新增到 Docker Container所屬的 namespace下,並被改名為 eth0。如此一來,保證宿主機的網路報文若發往 veth0,則立即會被 eth0 接收,實現宿主機到Docker Container網路的聯通性;同時,也保證 Docker Container單獨使用 eth0,實現容器網路環境的隔離性。
bridge 橋接模式下的 Docker Container 在使用時,並非為開發者包辦了一切。最明顯的是,該模式下 Docker Container不具有一個公有 IP,即和宿主機的 eth0不處於同一個網段。導致的結果是宿主機以外的世界不能直接和容器進行通訊。雖然 NAT 模式經過中間處理實現了這一點,但是 NAT 模式仍然存在問題與不便,如:容器均需要在宿主機上競爭埠,容器內部服務的訪問者需要使用服務發現獲知服務的外部埠等。另外 NAT 模式由於是在三層網路上的實現手段,故肯定會影響網路的傳輸效率。

1.2 Host 網路模式
這裡寫圖片描述

host 模式是 bridge 橋接模式很好的補充。採用 host 模式的 Docker Container,可以直接使用宿主機的 IP 地址與外界進行通訊,若宿主機的 eth0 是一個公有 IP,那麼容器也擁有這個公有 IP。同時容器內服務的埠也可以使用宿主機的埠,無需額外進行 NAT 轉換。當然,有這樣的方便,肯定會損失部分其他的特性,最明顯的是 Docker Container 網路環境隔離性的弱化,即容器不再擁有隔離、獨立的網路棧。另外,使用 host 模式的 Docker Container 雖然可以讓容器內部的服務和傳統情況無差別、無改造的使用,但是由於網路隔離性的弱化,該容器會與宿主機共享競爭網路棧的使用;另外,容器內部將不再擁有所有的埠資源,原因是部分埠資源已經被宿主機本身的服務佔用,還有部分埠已經用以 bridge 網路模式容器的埠對映。

1.3 Container 網路模式
這裡寫圖片描述

(1) 查詢 other container(即需要被共享網路環境的容器)的網路 namespace;
(2) 將新建立的 Docker Container(也是需要共享其他網路的容器)的 namespace,使用other container 的 namespace。Docker Container 的 other container 網路模式,可以用來更好的服務於容器間的通訊。在這種模式下的 Docker Container 可以通過 localhost 來訪問 namespace 下的其他容器,傳輸效率較高。雖然多個容器共享網路環境,但是多個容器形成的整體依然與宿主機以及其他容器形成網路隔離。另外,這種模式還節約了一定數量的網路資源。但是需要注意的是,它並沒有改善容器與宿主機以外世界通訊的情況。

1.4 None 網路模式

網路環境為 none,即不為 Docker Container 任何的網路環境。一旦 Docker Container 採用了none 網路模式,那麼容器內部就只能使用 loopback 網路裝置,不會再有其他的網路資源。可以說 none模式為 Docker Container做了極少的網路設定,但是俗話說得好“少即是多”,在沒有網路配置的情況下,作為 Docker 開發者,才能在這基礎做其他無限多可能的網路定製開發。這也恰巧體現了 Docker 設計理念的開放。

接下來講一下如何在 none 網路模式下為容器分配固定 ip:

這裡寫圖片描述

netns 是在 linux 中提供網路虛擬化的一個專案,使用 netns 網路空間虛擬化可以在本地虛擬化出多個網路環境,目前 netns 在 lxc 容器中被用來為容器提供網路。
使用 netns 建立的網路空間獨立於當前系統的網路空間,其中的網路裝置以及 iptables 規則等都是獨立的,就好像進入了另外一個網路一樣。

直接上命令,少點截圖,少浪費點CSDN的儲存

[[email protected] ~]# docker exec vmx ip addr | grep 192#無結果

[[email protected] ~]# ip link add name veth0 type veth peer name veth1#建立對等連線

[[email protected] ~]# brctl addif docker0 veth0#將連線的一頭加到docker0

[[email protected] ~]# docker inspect -f '{{.State.Pid}}' vmx
4850#過濾當前容器程序號

[[email protected] ~]# mkdir /var/run/netns#為對映建立目錄

[[email protected] ~]# ln -s /proc/4850/ns/net /var/run/netns/4850#做軟連線/對映

[[email protected] ~]# ip link set veth1 netns 4850#將連線的另一頭進行鍼對容器進行設定

[[email protected] ~]# docker exec vmx ip addr | grep veth1
11: [email protected]: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000#發現已經有網絡卡了

[[email protected] ~]# docker exec vmx ip addr | grep eth0

[[email protected] ~]# ip netns exec 4850 ip link set veth1 name eth0#修改網絡卡名稱,也可不改

[[email protected] ~]# docker exec vmx ip addr | grep eth0
11: [email protected]: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000#網絡卡還未起來

[[email protected] ~]# ip netns exec 4850 ip link set eth0 up#起容器網絡卡

[[email protected] ~]# docker exec vmx ip addr | grep eth0
11: [email protected]: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state LOWERLAYERDOWN qlen 1000

[[email protected] ~]# ip netns exec 4850 ip addr add 192.168.3.10/24 dev eth0#為容器網絡卡新增 ip

[[email protected] ~]# docker exec vmx ip addr | grep eth0
11: [email protected]: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state LOWERLAYERDOWN qlen 1000
    inet 192.168.3.10/24 scope global eth0

[[email protected] ~]# docker exec vmx ping 192.168.3.1#測試連同性,無果,因為宿主機一端未起對應網絡卡
PING 192.168.3.1 (192.168.3.1) 56(84) bytes of data.
From 192.168.3.10 icmp_seq=1 Destination Host Unreachable
From 192.168.3.10 icmp_seq=2 Destination Host Unreachable

^C[[email protected] ~]# ip link set veth0 up#起宿主機網絡卡

[[email protected] ~]# docker exec vmx ping 192.168.3.1
PING 192.168.3.1 (192.168.3.1) 56(84) bytes of data.
64 bytes from 192.168.3.1: icmp_seq=1 ttl=64 time=0.067 ms
64 bytes from 192.168.3.1: icmp_seq=2 ttl=64 time=0.124 ms

^C[[email protected] ~]# ping www.baidu.com
PING www.a.shifen.com (183.232.231.173) 56(84) bytes of data.
64 bytes from www.sn.10086.cn (183.232.231.173): time=47.3 ms
64 bytes from www.sn.10086.cn (183.232.231.173): icmp_seq=4 ttl=54 time=47.0 ms

這裡寫圖片描述

這裡寫圖片描述

虛擬機器能夠上網,但是容器還上不了網:

[[email protected] ~]# docker exec vmx ping www.baidu.com
ping: www.baidu.com: Name or service not known
[[email protected] ~]# 

最後一步:新增閘道器使容器可以上網(閘道器即為docker0的ip):

[[email protected] ~]# ip netns exec 4850 ip route add default via 192.168.3.1

這裡寫圖片描述
其實以上命令摘出來主要步驟然後一鍵指令碼執行就可以了,這裡只是為了做講解和效果展示

常用的 namespace 的命令:

1. 新增一個 namespace
ip netns add [name]
2. 在 namespace 中啟用一個裝置
ip netns exec [name] ip link set lo up
3. 在 namespace 中新加一個裝置
ip link set [dev-name] netns [name]
啟用:
ip netns exec [name] ip link set [dev-name] up
4. 檢視指定 namespace 中指定裝置的引數資訊
ip netns exec [name] ip addr show [dev-name] permanent scope global
5. 為 namespace 中指定裝置設定 ip
ip netns exec [name] ip -4 addr add 192.168.1.2/24 brd 192.168.1.255 scope global dev
[dev-name]
6.檢視所有 network namespace
ip netns list
7.ping 虛擬機器例項
ip netns exec [name] ping 192.168.1.3

新增固定 IP 的 Shell 指令碼:

#/bin/bash
if [ -z $1 ] || [ -z $2 ] || [ -z $3 ] || [ -z $4 ] || [ -z $5 ];
then
echo "*****Input the necessary parameters: CONTAINERID IP MASK GATEWAY
ETHNAME"
echo "*****Call the script like: sh static_ip.sh vm1 192.168.1.10 24 192.168.1.1 veth0"
exit
fiCONTAINERID=$1
SETIP=$2
SETMASK=$3
GATEWAY=$4
ETHNAME=$5
#判斷宿主機網絡卡是否存在
ifconfig $ETHNAME > /dev/null 2>&1
if [ $? -eq 0 ]; then
read -p "$ETHNAME exist,do you want delelte it? y/n " del
if [[ $del == 'y' ]]; then
ip link del $ETHNAME
else
exit
fi
fi
#
pid=`docker inspect -f '{{.State.Pid}}' $CONTAINERID`
mkdir -p /var/run/netns
find -L /var/run/netns -type l -delete
if [ -f /var/run/netns/$pid ]; then
rm -f /var/run/netns/$pid
fi
ln -s /proc/$pid/ns/net /var/run/netns/$pid
#
ip link add $ETHNAME type veth peer name B
brctl addif br3 $ETHNAME
ip link set $ETHNAME up
ip link set B netns $pid
#先刪除容器內已存在的 eth0
ip netns exec $pid ip link del eth0 > /dev/null 2>&1
#設定容器新的網絡卡 eth0
ip netns exec $pid ip link set dev B name eth0
ip netns exec $pid ip link set eth0 up
ip netns exec $pid ip addr add $SETIP/$SETMASK dev eth0
ip netns exec $pid ip route add default via $GATEWAY

容器埠對映:

[[email protected] ~]# docker run -p 8000:80 -p 8001:443 -it --name web nginx bash

這裡寫圖片描述

這裡寫圖片描述

通過宿主機ip:8000進行訪問
這裡寫圖片描述

我們修改下預設釋出頁:
這裡寫圖片描述
這裡寫圖片描述

Docker 的埠對映是由 iptables 來實現的
這裡寫圖片描述

容器間互聯:

--link 引數可以在不對映埠的前提下為兩個容器間建立安全連線, --link 引數可以連線一個或多個容器到將要建立的容器。
--link 引數的格式為 --link name:alias,其中 name 是要連結的容器的名稱,alias 是這個連線的別名

docker run -it --name web2 --link web:alias nginx bash

這裡寫圖片描述

相關推薦

Docker學習筆記容器網路模式

首先從映象庫pull一個rhel7的映象下來,這些東西你得玩,光看沒意思。 本人pull了前兩個映象進行測試,如果連線失敗可以多試幾次,連上之後速度不算很差 docker pull richxsl/rhel7 docker pull bluedata/r

Android學習筆記——Activity的啟動模式

1.Activity的管理機制 Android的管理主要是通過Activity棧來進行的。當一個Activity啟動時,系統根據其配置或呼叫的方式,將Activity壓入一個特定的棧中,系統處 於執行(Running or Resumed)狀態。當按Back鍵或觸發finish(

android開發筆記 Activity載入模式

既然是安卓開發,我們就免不了和Activity打交道,因為它是前臺的介面,也是android四大元件之一,那我們就來談談Activity的四種載入模式。 為什麼要為Activity指定載入模式? Android對Activity的管理,採用Task(即棧)來

Docker搭建2048遊戲,網路模式學習容器和管理,資料卷的管理,用Dockerfile建立映象

1.映象管理 物理機上: 軟體包: docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm docker-engine-selinux-17.03.1.ce-1.el7.centos.noarch.rpm [

Docker網路管理(容器網路模式

下面,我們來學習Docker的網路管理。 Docker 在啟動時會建立一個虛擬網橋 docker0,預設地址為 172.17.0.1/16,容器啟動後都會被橋接到 docker0 上,並自動分配到一個 IP 地址 . docker0預設地址 網橋 容器橋接

Docker學習筆記-部署.Net Core 3.1專案到Docker容器,並使用Nginx反向代理(CentOS7)(二)

接著上一節沒有演示完的繼續,連結:Docker學習筆記之-部署.Net Core 3.1專案到Docker容器,並使用Nginx反向代理(CentOS7)(一) 演示步驟: 1,獲取nginx映象,並執行Nginx容器 2,根據上傳的專案生成映象檔案,並執行專案容器 3,配置Nginx反向代理相關對映,並對映

Docker 學習筆記 核心概念

api rest api 核心概念 log 筆記 try nbsp .com ont Docker核心概念: Docker Daemon Docker Container Docker Registry Docker Client 通過rest API 和Docker

Docker學習筆記 Docker安裝配置使用

容器 dcoker 簡介Docker是一個開源的引擎,可以輕松的為任何應用創建一個輕量級的、可移植的、自給自足的容器。開發者在筆記本上編譯測試通過的容器可以批量地在生產環境中部署,包括VMs(虛擬機)、bare metal、OpenStack 集群和其他的基礎應用平臺。環境:CentOS7.3地址:1

Introduction to 3D Game Programming with DirectX 12 學習筆記 --- 第章:Direct 3D初始化

學習目標 對Direct 3D程式設計在3D硬體中扮演的角色有基本瞭解; 理解COM在Direct 3D中扮演的角色; 學習基本的圖形學概念,比如儲存2D影象、頁面切換,深度緩衝、多重紋理對映和CPU與GPU如何互動; 學習如何使用效能計數函式讀取高精度時間;

docker網路模式區別

1.host模式 host表示容器共享宿主機的ip和埠號。容器中不會虛擬自己的網絡卡和ip,當你檢視容器ip的時候,其實是宿主機的ip。 如:建立nginx容器 docker run -tid --net=host --name nginx nginx:1.13.12 你訪問主機的htt

JAVA學習筆記第一天---訪問許可權修飾符

  public protected 空的(deault) private 同一類中 √ √ √ √ 同一包中(子類與無關類) √

Docker(十)-Docker網路模式

Docker 安裝時會自動在 host 上建立三個網路,我們可用 docker network ls 命令檢視: none模式,使用--net=none指定,該模式關閉了容器的網路功能。 host模式,使用--net=host指定,容器將不會虛擬出自己的網絡卡,配置自己的I

多執行緒學習筆記——CountDownLatch、 CyclicBarrie、Semaphore的使用

CountDownLatch CountDownLatch的構造器: public CountDownLatch(int count) { if (count < 0) throw new IllegalArgumentExceptio

docker的基礎操作及網路形式

yum install  -y container-selinux-2.21-1.el7.noarch.rpm docker-ce-18.03.1.ce-1.el7.centos.x86_64.rpm libsemanage-2.5-8.el7.x86_64.rpm l

docker學習筆記建立本地映象(三)docker build的結果

docker build -t tonyxinminghui/test:v1 . Sending build context to Docker daemon 586.9 MB Step 1 : FROM ubuntu:latest —> f753

Docker學習筆記容器資料管理,連結容器,構建私有庫

$ sudo docker run --rm --name web2 --link db:db training/webapp env . . . DB_NAME=/web2/db DB_PORT=tcp://172.17.0.5:5432 DB

Zynq-Linux移植學習筆記十-u-boot網路配置

在zynq開發板zc706上,網路通路由下面三個裝置組成: 其中zynq負責對phy進行配置,當zynq上的網路控制器以及phy完成正確配置時,能夠看到RJ45上面的黃燈亮,此時表明鏈路已經通了。如果u-boot中已經設定了IP地址,通過網線就可以ping通

Docker網路模式

docker run建立Docker容器時,可以用–net選項指定容器的網路模式,Docker有以下4種網路模式:  bridge模式:使用–net =bridge指定,預設設定;  host模式:使用–net =host指定;  non

《Javascript權威指南》學習筆記:JavaScript內建類

    前面的幾篇博文分別介紹了物件、字串、陣列、日期等內建類,本篇將介紹Boolean/Math/Function/Arguments類 一、使用Boolean類處理邏輯值     Boolean

kubernetes學習筆記:helm入門

1.Helm的簡介 Helm是Kubernetes的一個包管理工具,用來簡化Kubernetes應用的部署和管理。可以把Helm比作CentOS的yum工具。 Helm有如下幾個基本概念: Chart: 是Helm管理的安裝包,裡面包含需要部署的安裝包資源。可以把Chart比作CentOS yum使