欧美亚洲中文,在线国自产视频,欧洲一区在线观看视频,亚洲综合中文字幕在线观看

      1. <dfn id="rfwes"></dfn>
          <object id="rfwes"></object>
        1. 站長(zhǎng)資訊網(wǎng)
          最全最豐富的資訊網(wǎng)站

          Docker網(wǎng)絡(luò)模式與配置Docker自定義網(wǎng)絡(luò)(bridge模式)

          前言

          ? 上篇文章講述了有關(guān)docker的資源控制,主要是三個(gè)方面:CPU、內(nèi)存以及IO。本文將講述docker的4種網(wǎng)絡(luò)模式。

          • 揭開(kāi)Docker的面紗 – 基礎(chǔ)理論梳理和安裝流程演示  http://www.haoyitu.cn/Linux/2020-04/163003.htm
          • Docker基礎(chǔ)命令詳解 – 鏡像及容器操作  http://www.haoyitu.cn/Linux/2020-04/163005.htm
          • 深入理解Docker的硬件資源控制與驗(yàn)證  http://www.haoyitu.cn/Linux/2020-04/163006.htm

          一、簡(jiǎn)述VMware中三種網(wǎng)絡(luò)模式

          ? 可能,對(duì)于許多接觸Linux操作系統(tǒng)的朋友而言,起初都是通過(guò)虛擬機(jī)軟件進(jìn)行層層深入的學(xué)習(xí)。而對(duì)于其中一種軟件——VMware軟件的網(wǎng)絡(luò)連接可能就是初學(xué)者的一個(gè)難題??赡芤恢倍疾⒉涣私馑峁┑娜N網(wǎng)絡(luò)模式的原理和意義。那么本小節(jié)將簡(jiǎn)單講述一下有關(guān)VMware的三種網(wǎng)絡(luò)模式:Bridged(橋接模式)、NAT(網(wǎng)絡(luò)地址轉(zhuǎn)換模式)、Host-Only(僅主機(jī)模式)。而此三種分別對(duì)應(yīng)于網(wǎng)卡設(shè)備中的VMnet0、VMnet1(或者后期新增創(chuàng)建的)、VMnet8(NAT網(wǎng)卡也只能有一個(gè))

          1.1橋接模式

          ? 概念:橋接模式就是一種將主機(jī)(好比是你的筆記本上的)的網(wǎng)卡與虛擬機(jī)的網(wǎng)卡利用虛擬網(wǎng)橋進(jìn)行通信。

          ? 原理理解:對(duì)這種模式的理解可以認(rèn)為是將物理機(jī)虛擬為一個(gè)交換機(jī),所有橋接設(shè)置的虛擬機(jī)連接到這個(gè)交換機(jī)的一個(gè)接口上,當(dāng)然物理機(jī)也一樣需要連接到這個(gè)交換機(jī),也就是說(shuō)橋接模式下的所有網(wǎng)卡都是交換模式,相互可以訪問(wèn)而且互不干擾。

          ? 典型特征:虛擬機(jī)的IP地址需要與主機(jī)在同一網(wǎng)段,如果需要聯(lián)網(wǎng)則網(wǎng)關(guān)與DNS需要與主機(jī)網(wǎng)卡一致。

          ? 具體可以再通過(guò)下面的圖示理解:

          Docker網(wǎng)絡(luò)模式與配置Docker自定義網(wǎng)絡(luò)(bridge模式)

          1.2網(wǎng)絡(luò)地址轉(zhuǎn)換模式

          ? NAT模式的話相對(duì)來(lái)說(shuō)應(yīng)該是最熟悉的了。網(wǎng)絡(luò)地址轉(zhuǎn)換,既然有地址轉(zhuǎn)換,肯定是發(fā)生了轉(zhuǎn)變了。NAT模式就比較適合于IP資源緊缺,而且希望虛擬機(jī)可以聯(lián)網(wǎng)的情況。

          ? NAT模式借助的是虛擬的NAT設(shè)備以及虛擬的DHCP服務(wù)器,從而使得虛擬機(jī)可以聯(lián)網(wǎng)。如下圖所示:

          Docker網(wǎng)絡(luò)模式與配置Docker自定義網(wǎng)絡(luò)(bridge模式)

          1.3僅主機(jī)模式

          ? 僅主機(jī)模式呢,其實(shí)說(shuō)白了就是沒(méi)有NAT設(shè)備的網(wǎng)絡(luò)模式,僅使用的是VMnet1虛擬網(wǎng)卡與虛擬交換機(jī)連接,從而與虛擬機(jī)通信,而這種模式就實(shí)現(xiàn)了虛擬機(jī)與外網(wǎng)的隔離,即獨(dú)立的一臺(tái)服務(wù)器,只與主機(jī)互相通信。如下圖所示:

          Docker網(wǎng)絡(luò)模式與配置Docker自定義網(wǎng)絡(luò)(bridge模式)

          ? 好的,現(xiàn)在大概了解了VMware中三種網(wǎng)絡(luò)模式的原理了吧,現(xiàn)在繼續(xù)來(lái)聊聊在docker中的網(wǎng)絡(luò)模式。

          二、docker的網(wǎng)絡(luò)模式

          2.1docker網(wǎng)絡(luò)實(shí)現(xiàn)原理

          ? docker使用Linux橋接的方式,即在宿主機(jī)虛擬一個(gè)docker容器網(wǎng)橋(docker0),docker啟動(dòng)一個(gè) 容器時(shí)會(huì)根據(jù)docker網(wǎng)橋的網(wǎng)段分配給容器一個(gè)IP地址,這個(gè)地址就是容器ip,同時(shí)docker就是每個(gè)容器的默認(rèn)網(wǎng)關(guān)。因此,同一個(gè)宿主機(jī)內(nèi)的容器就可以通過(guò)容器ip地址直接通信。

          ? 一般情況下,我們?cè)诎惭b和啟動(dòng)docker服務(wù)之后使用ifconfig命令即可查看到這個(gè)docker0的虛擬網(wǎng)橋設(shè)備:

          [root@localhost ~]# ifconfig | head -7  docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500          inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255          ether 02:42:58:71:c9:ba  txqueuelen 0  (Ethernet)          RX packets 0  bytes 0 (0.0 B)          RX errors 0  dropped 0  overruns 0  frame 0          TX packets 0  bytes 0 (0.0 B)          TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0  

          從上面顯示的結(jié)果來(lái)看,默認(rèn)的容器網(wǎng)關(guān)地址為172.17.0.1/16哈!當(dāng)然loopback網(wǎng)卡是回環(huán)網(wǎng)卡,測(cè)試驗(yàn)證(TCP/IP連接),virtual bridge則是虛擬網(wǎng)橋(想想KVM【云原生】)

          ? 當(dāng)然,docker網(wǎng)橋是宿主機(jī)虛擬出來(lái)的,并不是真實(shí)存在的網(wǎng)絡(luò)設(shè)備,外部網(wǎng)絡(luò)是無(wú)法通過(guò)ip地址直接尋址的,這就表明我們需要通過(guò)其他的方式來(lái)使外部網(wǎng)絡(luò)可以訪問(wèn)容器,一般會(huì)通過(guò)訪問(wèn)宿主機(jī)ip結(jié)合容器的端口(并且端口一般是進(jìn)行了端口映射,之后會(huì)講述)進(jìn)行容器的訪問(wèn)。

          2.2docker四種網(wǎng)絡(luò)模式

          下面直接通過(guò)下面的表格來(lái)區(qū)分理解一下docker的四種網(wǎng)絡(luò)模式

          docker網(wǎng)絡(luò)模式 配置 說(shuō)明
          host   容器和宿主機(jī)共享Network namespace
          container模式   容器和另外一個(gè)容器共享Network namespace
          none模式   容器有獨(dú)立的Network namespace,但并沒(méi)有對(duì)其進(jìn)行任何網(wǎng)絡(luò)設(shè)置,如分配veth pair 和網(wǎng)橋連接,配置IP等
          bridge模式   默認(rèn)的模式

          其實(shí)啟動(dòng)docker服務(wù)之后,可以使用docker network相關(guān)命令控制管理網(wǎng)絡(luò),下面我們查看一下網(wǎng)絡(luò)列表:(默認(rèn)存在下面三個(gè))下面逐一介紹(結(jié)合第一小節(jié)的內(nèi)容來(lái)理解docker 中的網(wǎng)絡(luò)原理)

          [root@localhost ~]# docker network ls  NETWORK ID          NAME                DRIVER              SCOPE  3763f78eb404        bridge              bridge              local  3bb2f50eb211        host                host                local  e12cd7b98c54        none                null                local  

          2.2.1host模式

          host模式結(jié)合VMware中的僅主機(jī)模式即可理解,通過(guò)下圖表示一下:

          Docker網(wǎng)絡(luò)模式與配置Docker自定義網(wǎng)絡(luò)(bridge模式)

          從上圖可以看出,如果在啟動(dòng)容器后使用的是host模式,那么這個(gè)容器將不會(huì)獲得一個(gè)獨(dú)立的Network Namespace(網(wǎng)絡(luò)命名空間),而是和宿主機(jī)系統(tǒng)共用一個(gè)Network Namespace。并且這就意味著容器將不會(huì)虛擬出自己的網(wǎng)卡以及配置自己的ip等,而是使用宿主機(jī)的ip以及端口。不過(guò)呢,在其他方面例如文件系統(tǒng)等還是與之隔離的。

          這種方式最大優(yōu)勢(shì)在于網(wǎng)絡(luò)性能比較好但是缺點(diǎn)也很明顯——網(wǎng)絡(luò)的隔離性很弱。

          2.2.2container模式

          ? 這個(gè)模式正如上述表格中的說(shuō)明一般,是表示指定新創(chuàng)建的容器和已經(jīng)存在的一個(gè)容器共享一個(gè)Network Namespace。當(dāng)然這也表示新建的這個(gè)容器不會(huì)創(chuàng)建自己的網(wǎng)卡等相關(guān)操作,而是和與指定的容器共享這些資源。

          ? 這種模式也和上述的host差不多,除了網(wǎng)絡(luò)方面,其文件系統(tǒng)、進(jìn)程列表等都是隔離的。

          參照下圖:

          Docker網(wǎng)絡(luò)模式與配置Docker自定義網(wǎng)絡(luò)(bridge模式)

          2.2.3none模式

          ? 使用none模式,Docker容器擁有自己的Network Namespace,但是,不會(huì)對(duì)Docker容器進(jìn)行任何的網(wǎng)絡(luò)配置。這就表明這個(gè)Docker容器沒(méi)有網(wǎng)卡、IP、路由等信息。需要我們自己為Docker容器添加網(wǎng)卡、配置IP等。這種方式網(wǎng)絡(luò)的隔離性最為徹底,即表明關(guān)閉了容器的網(wǎng)絡(luò)功能,也無(wú)法訪問(wèn)這個(gè)容器。

          示意圖如下:

          Docker網(wǎng)絡(luò)模式與配置Docker自定義網(wǎng)絡(luò)(bridge模式)

          2.2.4bridge模式

          ? 該模式就是我們?cè)趩?dòng)docker服務(wù)后默認(rèn)的docker網(wǎng)絡(luò)模式,其會(huì)在主機(jī)上創(chuàng)建一個(gè)名為docker0的虛擬網(wǎng)橋,這個(gè)主機(jī)上的所有啟動(dòng)的容器就會(huì)連接到這個(gè)虛擬網(wǎng)橋上。結(jié)合VMware中網(wǎng)橋模式原理,想想物理交換機(jī)的原理,就不難理解了。

          ? 從docker0子網(wǎng)中分配一個(gè)IP給容器使用,并設(shè)置docker0的IP地址為容器的默認(rèn)網(wǎng)關(guān)。在主機(jī)上創(chuàng)建一對(duì)虛擬網(wǎng)卡veth pair設(shè)備,Docker將veth pair設(shè)備的一端放在新創(chuàng)建的容器中(這個(gè)veth對(duì)我們?cè)贠penStack中見(jiàn)過(guò),筆者覺(jué)得可以將之理解為一個(gè)橋梁,建立橋兩岸的關(guān)系而存在的一種虛擬設(shè)備),并命名為eth0(容器的網(wǎng)卡),另一端放在主機(jī)中,以vethxxx這樣類(lèi)似的名字命名,并將這個(gè)網(wǎng)絡(luò)設(shè)備加入到docker0網(wǎng)橋中。

          ? 使用docker run -p 命令時(shí),docker實(shí)際是在防火墻做了DNAT規(guī)則,實(shí)現(xiàn)端口轉(zhuǎn)發(fā)的功能。

          下面通過(guò)一個(gè)節(jié)點(diǎn)的服務(wù)器結(jié)構(gòu)圖來(lái)理解:

          Docker網(wǎng)絡(luò)模式與配置Docker自定義網(wǎng)絡(luò)(bridge模式)

          當(dāng)然,這四種模式都不需要手動(dòng)配置,真正需要配置的是自定義網(wǎng)絡(luò)。

          三、docker網(wǎng)絡(luò)控制相關(guān)命令配置

          上面已經(jīng)給出了對(duì)應(yīng)docker網(wǎng)絡(luò)控制的命令docker network,下面具體看一下這個(gè)命令的具體說(shuō)明:

          docker network的命令用法:  Usage:  docker network COMMAND    Manage networks    Commands:    connect     Connect a container to a network    create      Create a network    disconnect  Disconnect a container from a network    inspect     Display detailed information on one or more networks    ls          List networks    prune       Remove all unused networks    rm          Remove one or more networks  

          3.1橋接命令設(shè)置

          我們通過(guò)嘗試、排錯(cuò)和驗(yàn)證的方式來(lái)配置docker網(wǎng)絡(luò)。

          因?yàn)樾枰狽AT地址轉(zhuǎn)換功能,所以需要開(kāi)啟防火墻,但是核心防護(hù)還是關(guān)了吧。

          [root@localhost ~]# systemctl start firewalld.service   [root@localhost ~]# systemctl status firewalld.service   ● firewalld.service - firewalld - dynamic firewall daemon     Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)     Active: active (running) since 一 2020-04-06 10:18:40 CST; 2s ago       Docs: man:firewalld(1)   Main PID: 65611 (firewalld)  ...

          初始化環(huán)境:(后面會(huì)返回到這個(gè)環(huán)境狀態(tài))

          [root@localhost ~]# docker images   REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE  [root@localhost ~]# docker ps -a  CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES  

          我們嘗試通過(guò)docker網(wǎng)橋方式(橋接)給一個(gè)容器設(shè)置一個(gè)ip地址(自定義的),下面看一下命令執(zhí)行的結(jié)果:

          [root@localhost ~]# docker run -itd --name test --network bridge --ip 172.17.0.10 CentOS:7 /bin/bash  Unable to find image 'centos:7' locally  7: Pulling from library/centos  ab5ef0e58194: Pull complete   Digest: sha256:4a701376d03f6b39b8c2a8f4a8e499441b0d567f9ab9d58e4991de4472fb813c  Status: Downloaded newer image for centos:7  29f9e9cbb398085d7c89bed2982d626bfb7e564371a76a6cb693cffa68b917af  docker: Error response from daemon: user specified IP address is supported on user defined networks only.  

          首先,由于沒(méi)有改鏡像,所以會(huì)先拉取鏡像之后創(chuàng)建以及嘗試運(yùn)行容器,但是會(huì)遇到報(bào)錯(cuò),報(bào)錯(cuò)原因是因?yàn)橛脩糇约涸O(shè)置的ip地址只適合于他們自己定義的網(wǎng)絡(luò)。但是這并不影響鏡像的獲取與創(chuàng)建,我們嘗試運(yùn)行看看結(jié)果:

          [root@localhost ~]# docker images  REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE  centos              7                   5e35e350aded        4 months ago        203MB  [root@localhost ~]# docker ps -a  CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES  29f9e9cbb398        centos:7            "/bin/bash"         About a minute ago   Created                                 test  [root@localhost ~]# docker start 29f9e9cbb398  Error response from daemon: user specified IP address is supported on user defined networks only  Error: failed to start containers: 29f9e9cbb398  

          ? 很顯然,結(jié)果告訴我們還是上述的原因?qū)е铝诉@個(gè)問(wèn)題,好吧只能刪除這個(gè)容器了。索性還原為初始化環(huán)境吧(其實(shí)可以去掉–network bridge就不會(huì)報(bào)錯(cuò),但是設(shè)置的ip地址會(huì)不生效,可以自行嘗試一下),我們不指定ip地址來(lái)試一下,順便驗(yàn)證一下不加這個(gè)參數(shù)試試,最后還原為初始化狀態(tài)后我們?cè)偻ㄟ^(guò)自定義的方式來(lái)設(shè)置ip地址吧。

          [root@localhost ~]# docker run -itd --name demo centos:7 /bin/bash  984545df8ebf2c30f4ccf3f5f4699ed67bd2a93cbc068f2ace4865a828b4a4d1  [root@localhost ~]# docker ps -a  CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES  984545df8ebf        centos:7            "/bin/bash"         8 seconds ago       Up 6 seconds                            demo  

          進(jìn)入容器查看ip地址

            [root@localhost ~]# docker exec -it 984545df8ebf /bin/bash  [root@984545df8ebf /]# yum install -y net-tools  Loaded plugins: fastestmirror, ovl  Determining fastest mirrors  [root@984545df8ebf /]# ifconfig   eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500          inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255          ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)          RX packets 2201  bytes 15042254 (14.3 MiB)          RX errors 0  dropped 0  overruns 0  frame 0          TX packets 1999  bytes 111171 (108.5 KiB)          TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536          inet 127.0.0.1  netmask 255.0.0.0          loop  txqueuelen 1000  (Local Loopback)          RX packets 0  bytes 0 (0.0 B)          RX errors 0  dropped 0  overruns 0  frame 0          TX packets 0  bytes 0 (0.0 B)          TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0  

          那么首先我們需要?jiǎng)?chuàng)建一個(gè)自定義的子網(wǎng)段,并且給他一個(gè)名稱,通過(guò)這個(gè)網(wǎng)段給對(duì)應(yīng)的容器設(shè)置固定的ip地址。

          [root@localhost ~]# docker network create --subnet=172.18.0.0/24 mynetwork  Error response from daemon: Failed to Setup IP tables: Unable to enable SKIP DNAT rule:  (iptables failed: iptables --wait -t nat -I DOCKER -i br-4cd28c051bec -j RETURN: iptables: No chain/target/match by that name.   (exit status 1))  

          看來(lái)很不幸啊,又error了,不要慌,我們看看是什么原因?qū)е碌?,這個(gè)報(bào)錯(cuò)的根源看似是防火墻,說(shuō)是無(wú)法跳過(guò)DNAT(目標(biāo)網(wǎng)絡(luò)地址轉(zhuǎn)換)規(guī)則,其實(shí)導(dǎo)致這個(gè)問(wèn)題的原因是我們剛剛開(kāi)啟了防火墻,卻沒(méi)有重啟docker服務(wù),就有點(diǎn)類(lèi)似更改了配置文件沒(méi)有重啟服務(wù)。

          [root@localhost ~]# systemctl restart docker  [root@localhost ~]# docker network create --subnet=172.18.0.0/24 mynetwork  723d0fd514eb219d57667f72c3eb75fc4864af0cd94c21b6c70e868fb8d520a1  
          [root@localhost ~]# docker network ls  NETWORK ID          NAME                DRIVER              SCOPE  00008a1e778b        bridge              bridge              local  3bb2f50eb211        host                host                local  723d0fd514eb        mynetwork           bridge              local  e12cd7b98c54        none                null                local  [root@localhost ~]#   

          此時(shí)進(jìn)行驗(yàn)證自定義設(shè)置一個(gè)容器的固定IP地址的測(cè)試:

          [root@localhost ~]# docker run -itd --name test2 --network mynetwork --ip 172.18.0.10 centos:7 /bin/bash  Unable to find image 'centos:7' locally  7: Pulling from library/centos  ab5ef0e58194: Pull complete   Digest: sha256:4a701376d03f6b39b8c2a8f4a8e499441b0d567f9ab9d58e4991de4472fb813c  Status: Downloaded newer image for centos:7  683ad76f7789b5c16f251577047a288a3a4a00777128a216adfee15985b94c04  

          查看容器的狀態(tài),進(jìn)入容器查看ip地址

          [root@localhost ~]# docker ps -a  CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES  683ad76f7789        centos:7            "/bin/bash"         23 seconds ago      Up 22 seconds                           test2  [root@localhost ~]# docker exec -it 683ad76f7789 /bin/bash  [root@683ad76f7789 /]# yum install -y net-tools  Loaded plugins: fastestmirror, ovl  ...  [root@683ad76f7789 /]# ifconfig   eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500          inet 172.18.0.10  netmask 255.255.255.0  broadcast 172.18.0.255          ether 02:42:ac:12:00:0a  txqueuelen 0  (Ethernet)          RX packets 2302  bytes 15050471 (14.3 MiB)          RX errors 0  dropped 0  overruns 0  frame 0          TX packets 2049  bytes 113777 (111.1 KiB)          TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536          inet 127.0.0.1  netmask 255.0.0.0          loop  txqueuelen 1000  (Local Loopback)          RX packets 62  bytes 7019 (6.8 KiB)          RX errors 0  dropped 0  overruns 0  frame 0          TX packets 62  bytes 7019 (6.8 KiB)          TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0  

          此時(shí)發(fā)現(xiàn)自定義的網(wǎng)絡(luò)設(shè)置容器ip地址成功了。

          四、總結(jié)

          ? 本文通過(guò)對(duì)VMware軟件中的三種網(wǎng)絡(luò)模式工作的原理,層層遞進(jìn)深入講解docker的各種網(wǎng)絡(luò)模式,并且通過(guò)案例結(jié)合排障思路詳細(xì)介紹了有關(guān)docker網(wǎng)橋模式是如何配置容器ip地址的,有默認(rèn)模式以及自定義模式。

          ?最后,需要注意的是命令還是需要多記多敲多練,謝謝閱讀!

          贊(0)
          分享到: 更多 (0)
          網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)