Docker network


1、docker容器的網絡模式

docker在安裝的時候就會配置一個docker0的linux bridge的方式,在不使用 --network時, 這也是docker默認使用的方式。docker有三種常見的網絡模式,分別是none,bridge,host

➜  ~ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
3ea8a3ad1a61        bridge              bridge              local
9043e76f315a        host                host                local
eba2113c67eb        none                null                local

1.1、docker network command

➜  ~ docker network --help

Usage:	docker network COMMAND

Manage networks

Options:
      --help   Print usage

Commands:
  connect     把一個容器連接到網絡
  create       創建一個網絡
  disconnect  從網絡中中斷容器的連接
  inspect     在一個或多個網絡上顯示詳細信息
  ls          列出網絡
  prune      移除所有未使用的網絡
  rm          移除一個或多個網絡

docker network

1.2、docker none network

➜  ~ docker run -it --network=none busybox
/ # ifconfig
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

/ # 

1.3、docker host network

host網絡模式,其實就是借用的docker host上的網卡信息

➜  ~ docker run -it --network=host busybox
/ # ifconfig
docker0   Link encap:Ethernet  HWaddr 02:42:D7:FD:FF:0D  
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:d7ff:fefd:ff0d/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:119 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:13785 (13.4 KiB)

enp2s0    Link encap:Ethernet  HWaddr 20:89:84:F1:62:2D  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:16 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:2800 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2800 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:262620 (256.4 KiB)  TX bytes:262620 (256.4 KiB)

veth4d23dcf Link encap:Ethernet  HWaddr A6:25:A8:AE:A8:26  
          inet6 addr: fe80::a425:a8ff:feae:a826/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:87 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:9515 (9.2 KiB)

wlp3s0    Link encap:Ethernet  HWaddr 48:D2:24:4C:07:81  
          inet addr:192.168.1.28  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::e61c:9373:321e:dc31/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:60055 errors:0 dropped:0 overruns:0 frame:0
          TX packets:41972 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:65692420 (62.6 MiB)  TX bytes:5900097 (5.6 MiB)
/ # 

docker network網絡的優缺點:

  • 好處
    • docker host網絡的性能比較好
    • docker host網絡傳輸效率高
  • 缺點
    • docker host的主機上使用的端口,容器不能繼續使用

1.4、docker bridge network

brctl show 將會顯示docker0上的網絡設備,如果有容器運行的是bridge的網絡模式,就會把虛擬網卡掛在docker0上,這里應該注意的是:容器內的虛擬網卡與docker0上掛的虛擬網卡是成對存在的pair

安裝brctl工具

apt-get install bridge-utils -y

查看容器的網絡地址

➜  ~ docker run -it --network=bridge busybox
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:03  
          inet addr:172.17.0.3  Bcast:0.0.0.0  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:12 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1459 (1.4 KiB)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

1.5 docker網絡模式之用戶自定義網絡

docker提供三種自定義的網絡驅動

  • bridge
  • overlay
  • macvlan

1.5.1 創建自定義bridge網絡

docker network create --driver bridge bridge1
brctl show
docker network create --driver bridge --subnet 172.17.16.0/24 --dateway 172.17.16.1 bridge2
docker run -it --network=bridge2 busybox
----ifconfig
docker run -it --network=bridge2 --ip=172.17.16.3 busybox

2、docker容器之間的互聯互通

docker容器之間的互聯互通基於三種模式:IP,Docker DNS,joined

2.1 基於IP方式的互聯互通

docker run -it --network=bridge2 --ip=172.17.16.4 busybox
docker run -it --network=bridge2 --ip=172.17.16.5 busybox
ping -c 3 172.17.16.4(from 172.17.16.5)

2.2 基於Docker DNS之間的互聯互通

注意:docker dns只能使用在用戶自定的網絡模式下運行的容器

docker run -it --network=bridge2 --name=busyboxone busybox
docker run -it --network=bridge2 --name=busyboxtwo busybox
ping -c 3 busyboxone(form busyboxtwo)

2.3 基於join方式的互聯互通

仔細觀察此種模式下的網絡配置信息完全一樣,是通過127.0.0.1進行通信

docker run -it --name web1 httpd
docker run -it --network=container:web1 httpd

3、docker容器與外部是如何進行互相訪問的

3.1 docker容器訪問外部

docker默認的網絡是bridge網絡,因此只要docker host可以連接互聯網,那么容器就是可以聯網的,但是容器訪問外部網絡的過程是如何實現的呢? 容器在向外部發送請求時,docker在NAT上將容器的源地址改為了docker host的地址,因此訪問外部的源地址就變成了docker host的地址

ip r
iptables -t NAT -S
tcpdump -i docker0 -n icmp
tcpdump -i ens33 -n icmp

3.2 外部是如何訪問docker容器的

容器為了響應外部的訪問請求,把容器自己的內部端口暴露給docker host,於是和docker host進行了 端口之間的映射,外部進行訪問容器就會變成訪問docker host上的一個端口,當docker-proxy進行發現有訪問docker host上的容器映射的端口時,就會自動轉發給容器,這就是外部訪問容器的一個過程;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM