[ Docker ] 基礎的網絡應用

1. Docker 基本網絡模型

 

 

 

Docker 有 4 種基本的網絡模型:nginx

  1. bridge 橋接模式
  2. host 網絡模式
  3. container 聯盟模式
  4. none 模式

 

Docker daemon 在啓動時會建立一個虛擬網橋 docker0 默認地址爲 172.17.0.1/16 ,容器啓動後會被橋接到 docker0 上,並自動分配到一個 IP 地址。docker

Docker 在啓動容器時,默認採用的是 bridge 橋接模式,能夠經過 -net 進行指定。json

 

如下是 Docker 網絡初始化過程:vim

 

 

 

 

 

 

1.1 bridge 橋接網絡模型

Bridge 橋接模式的實現邏輯以下:bash

 

 

 

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

 

優點:socket

  保證宿主機的網絡報文若發往 veth0,則當即會被 eth0 接收,實現宿主機到Docker Container 網絡的聯通性,同時,也保證 Docker Container 單獨使用 eth0,實現容器網絡環境的隔離性。tcp

 

劣勢:oop

  該模式下 Docker Container 不具備一個公有 IP,即和宿主機的 eth0 不處於同一個網段。致使的結果是宿主機之外的世界不能直接和容器進行通訊。雖然 NAT 模式通過中間處理實現了這一點,可是 NAT 模式仍然存在問題與不便,如:容器均須要在宿主機上競爭端口,容器內部服務的訪問者須要使用服務發現獲知服務的外部端口等。另外,NAT 模式因爲是在三層網絡上的實現手段,故確定會影響網絡的傳輸效率。

spa

查看 docker0 網橋信息:

 

 

 

建立一個容器

 

 

 

再次查看 橋接設備

 

 

 

網絡邏輯分析:

 

 

 

1.2 Host 網絡模式

Host 網絡模型實現邏輯以下:

 

 

 

優點:

  host 模式是 bridge 橋接模式很好的補充。採用 host 模式的 docker container,能夠直接使用宿主機的 IP 地址和外界通訊,若宿主機的 eth0 是一個公網IP ,那麼容器也擁有這個公網 IP
同時容器內服務的端口也可使用宿主機的端口,無需額外進行 NAT 轉換。

 

劣勢:

  使用 host 模式的 docker container 雖然可讓容器內部的服務和傳統狀況無差異、無改造的使用,可是因爲網絡隔離性的弱化,該容器會與宿主機共享競爭網絡棧的使用;
容器內部將再也不擁有全部的端口資源,緣由是部分端口資源已經被宿主機自己的服務佔用,還有部分端口已經用以 bridge 網絡模式容器的端口映射。

要建立 host 模式的容器,使用 --net host 指定:

 

 

 

能夠看到,建立後的容器和宿主機共享網絡資源。

 

1.3 Container 網絡模式

Container 網絡模型實現邏輯以下:

 

 

 

  1. 查找其餘 容器的網絡 namespace;
  2. 將新建立的 docker container 的 namespace,使用其餘容器的 namespace

說白了,就是兩個容器共享網絡等資源。

 

優點:

  能夠用來更好的服務用於容器間通訊,能夠經過 localhost 來訪問其餘容器,傳輸效率高。雖然多個容器共享網絡環境,可是多個容器造成的總體依然與宿主機以及其餘容器造成網絡隔離。

劣勢:

  並無改善容器與宿主機之外世界通訊的狀況。

 

要建立 Container 模式的容器,使用 --net container:mv1 指定:

 

 

在 Container 網絡模式中,兩個容器是共享網絡資源。

 

1.4 None 網絡模式

None 網絡模型實現邏輯以下:

 

 

網絡環境爲 none,即不爲容器提供任何的網絡環境。一旦容器採用了none 網絡模式,那麼容器內部就只能使用 loopback 網絡設備,不會再有其餘的網絡資源。

要建立 none 模式的容器,使用 --net none 指定:

 

 

在 none 網絡環境中,只有本地迴環地址。

 

2. 容器其餘網絡配置項

 

2.1 Docker 守護進程的兩種方式

docker 守護進程默認以 socket 方式,/var/run/docker.sock, 也可開啓 ip:port 方式。

Docker 版本信息

 

 

 

編輯 /etc/docker/daemon.json 文件添加:

[root@192.168.118.14 ~]#vim /etc/docker/daemon.json
{ "registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com"], "hosts": ["tcp://192.168.118.14:2375", "unix:///var/run/docker.sock"] # 添加監聽端口和 sock 監聽 } [root@192.168.118.14 ~]#systemctl restart docker [root@192.168.118.14 ~]#netstat -ntplu | egrep docker tcp 0 0 192.168.118.14:2375 0.0.0.0:* LISTEN 17309/dockerd

 

客戶端經過 ip:port 方式訪問:

 

 

 

2.2 修改 docker0 默認網橋地址

在docker守護進程啓動後,docker0的模式地址:172.17.0.1/16

 

 

 

能夠經過在 /etc/docker/daemon.json 中修改默認地址:

[root@192.168.118.14 ~]#ip addr show docker0
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:df:37:b9:38 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:dfff:fe37:b938/64 scope link 
       valid_lft forever preferred_lft forever
	   
[root@192.168.118.14 ~]#vim /etc/docker/daemon.json
{
    "registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com"],
    "hosts": ["tcp://192.168.118.14:2375", "unix:///var/run/docker.sock"],
    "bip": "10.0.10.1/24"	# 設置 docker0 網絡ip
}

# 修改完畢重啓 docker 服務生效

[root@192.168.118.14 ~]#systemctl restart docker 
[root@192.168.118.14 ~]#ip addr show docker0
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:df:37:b9:38 brd ff:ff:ff:ff:ff:ff
    inet 10.0.10.1/24 brd 10.0.10.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:dfff:fe37:b938/64 scope link 
       valid_lft forever preferred_lft forever

 

2.3 Docker 端口映射

docker run [-P|-p]

-P: 將爲容器暴露的全部端口進行映射:docker run -P nginx
-p: 指定映射容器的端口:docker run -p 80 nginx

 

 

訪問宿主機的映射端口:

 

 

docker run --name ngx_1 --rm -P -d nginx:alpine   --> 宿主機的端口將是隨機映射

docker run --name ngx_1 --rm -p 8080:80 -d nginx:alpine --> 11對應的映射,將容器的80端口映射到宿主機的 8080 端口
能夠綁定IP地址:
docker run --name ngx_1 --rm -p 192.168.118.14:8080:80 -d nginx:alpine
相關文章
相關標籤/搜索