理論+實操:docker網絡

前言:查看docker網絡信息

[root@nginx ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
d9330d2dd1f5        bridge              bridge              local
4cd521ee1cc4        host                host                local
41daeb3e59bd        none                null                local

docker網絡控制,重點了解

Docker使用Linux橋接,在宿主機虛擬一個Docker容器網橋(docker0),Docker啓動一個容器時會根據Docker網橋的網段分配給容器一個IP地址,稱爲Container-IP,同時Docker網橋是每個容器的默認網關。因爲在同一宿主機內的容器都接入同一個網橋,這樣容器之間就能夠通過容器的Container-IP直接通信。

Docker網橋是宿主機虛擬出來的,並不是真實存在的網絡設備,外部網絡是無法尋址到的,這也意味着外部網絡無法通過直接Container-IP訪問到容器。如果容器希望外部訪問能夠訪問到,可以通過映射容器端口到宿主主機(端口映射),即docker run創建容器時候通過 -p 或 -P 參數來啓用,訪問容器的時候就通過[宿主機IP]:[容器端口]訪問容器。

一:四類網絡模式

Docker網絡模式 配置 說明
host模式 –net=host 容器和宿主機共享Network namespace。
container模式 –net=container:NAME_or_ID 容器和另外一個容器共享Network namespace。 kubernetes中的pod就是多個容器共享一個Network namespace。
none模式 –net=none 容器有獨立的Network namespace,但並沒有對其進行任何網絡設置,如分配veth pair 和網橋連接,配置IP等。
bridge模式 –net=bridge (默認爲該模式)

二:網絡模式介紹

安裝docker時,它會自動創建三個網絡(其實還有一個),bridge(創建容器默認連接到此網絡)、none、host

2.1 host:容器將不會虛擬出自己的網卡,配置自己的IP等,而是使用宿主機的IP和端口

如果啓動容器的時候使用host模式,那麼這個容器將不會獲得一個獨立的Network Namespace,而是和宿主機共用一個Network Namespace。容器將不會虛擬出自己的網卡,配置自己的IP等,而是使用宿主機的IP和端口。但是,容器的其他方面,如文件系統、進程列表等還是和宿主機隔離的。

使用host模式的容器可以直接使用宿主機的IP地址與外界通信,容器內部的服務端口也可以使用宿主機的端口,不需要進行NAT,host最大的優勢就是網絡性能比較好,但是docker host上已經使用的端口就不能再用了,網絡的隔離性不好。

在這裏插入圖片描述

2.2 container:創建的容器不會創建自己的網卡、設置IP等,而是和一個指定地容器共享IP、端口範圍

這個模式指定新創建的容器和已經存在的一個容器共享一個network namespace,而不是和宿主機共享,新創建的容器不會創建自己的網卡,配置自己的IP,而是和一個指定地容器共享IP、端口範圍等。同樣,兩個容器除了網絡方面,其他的如文件系統、進程列表還是隔離的。兩個容器的進程可以通過loo網卡設備通信

在這裏插入圖片描述

2.3 None:該模式關閉了容器的網絡功能

這種網絡模式下容器只有lo迴環網口,沒有其他的網卡。none模式可以在容器創建時通過–network=none參數指定

這種類型的網絡無法聯網,但是封閉的網絡能很好的保證容器的安全性

在這裏插入圖片描述

2.4 Bridge:此模式會爲每一個容器分配、設置IP等,並將容器連接到一個docker虛擬網橋,通過docker0網橋及iptables的nat表配置與宿主機通信

當Docker進程啓動時,會在主機上創建一個名爲docker0的虛擬網橋,此主機上啓動的Docker容器會連接到這個虛擬網橋上。虛擬網橋的工作方式和物理交換機類似,這樣主機上的所有容器就通過交換機連在了一個二層網絡中。

從docker0子網中分配一個IP給容器使用,並設置docker0的IP地址爲容器的默認網關。在主機上創建一對虛擬網卡veth pair設備,Docker將veth pair設備的一端放在新創建的容器中,並命名爲eth0(容器的網卡),另一端放在主機中,以vethxxx這樣類似的名字命名,並將這個網絡設備加入到docker0網橋中。可以通過brctl show命令查看。

bridge模式是docker的默認網絡模式,不寫–net參數,就是bridge模式。使用docker run -p時,docker實際是在iptables做了DNAT規則,實現端口轉發功能。可以使用iptables -t nat -vnL查看。

在這裏插入圖片描述

以上都是不用的手動指定IP的,真正需要配置的時自定義網絡

演示

docker只基於cpu、內存、IO、網絡這三個層面進行控制

docker進行網絡資源管控時,需要開啓防火牆

三:網絡爲bridge時

3.1 安裝完docker後,默認出現一張docker0網卡,IP地址爲172.17.0.1(網關)

docker網絡模式默認爲Bridge,docker0是虛擬容器網關

[root@kibana docker]# ifconfig
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:02:6d:9c:9d  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

在這裏插入圖片描述

3.2 run 容器,–name --network-bridge --ip (會發現到指定IP時報ERROR)

//橋接

docker run -itd --name test1 --network bridge --ip 172.17.0.10 centos:7 /bin/bash

-itd

–name 容器名稱

–network 指定網絡模式

–ip 指定IP地址

[root@kibana docker]# docker run -itd --name test1 --network=bridge --ip 172.17.0.100 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
eccba4d38139360c8ab2490fc8609419baa9832eb018814179db3b6e96d683b0
docker: Error response from daemon: user specified IP address is supported on user defined networks only.

報錯(會發現使用bridge無法支持指定IP)

[root@kibana docker]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
eccba4d38139        centos:7            "/bin/bash"         About a minute ago   Created                                 test1
[root@kibana docker]# docker start eccba4d38139
Error response from daemon: user specified IP address is supported on user defined networks only
Error: failed to start containers: eccba4d38139

刪除錯誤容器

[root@kibana docker]# docker rm eccba4d38139
eccba4d38139

3.3 刪掉容器,去掉IP參數

[root@kibana docker]# docker run -itd --name test1 --network=bridge centos:7 /bin/bash
de37ff32e2c45188a4fd5d87c20dbbb0db8eeea13583e515b89a90a66ad3e7b1
[root@kibana docker]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
de37ff32e2c4        centos:7            "/bin/bash"         6 seconds ago       Up 5 seconds                            test1

進入容器查看IP

[root@kibana docker]# docker exec -it /bin/bash de37ff32e2c4
Error: No such container: /bin/bash
[root@kibana docker]# docker exec -it  de37ff32e2c4 /bin/bash
[root@de37ff32e2c4 /]# 
[root@de37ff32e2c4 /]# ip addr
bash: ip: command not found
[root@de37ff32e2c4 /]# yum install net-tools -y
[root@de37ff32e2c4 /]# 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

當前容器的IP地址爲172.17.0.2/16

ping測試docker0IP,服務器IP,dns8.8.8.8

[root@de37ff32e2c4 /]# ping 172.17.0.1
PING 172.17.0.1 (172.17.0.1) 56(84) bytes of data.
64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.091 ms
64 bytes from 172.17.0.1: icmp_seq=2 ttl=64 time=0.101 ms
64 bytes from 172.17.0.1: icmp_seq=3 ttl=64 time=0.109 ms
^C
--- 172.17.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.091/0.100/0.109/0.011 ms
[root@de37ff32e2c4 /]# ping 192.168.247.134
PING 192.168.247.134 (192.168.247.134) 56(84) bytes of data.
64 bytes from 192.168.247.134: icmp_seq=1 ttl=64 time=0.049 ms
64 bytes from 192.168.247.134: icmp_seq=2 ttl=64 time=0.102 ms
64 bytes from 192.168.247.134: icmp_seq=3 ttl=64 time=0.091 ms
^C
--- 192.168.247.134 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.049/0.080/0.102/0.025 ms
[root@de37ff32e2c4 /]# ping 8.8.8.8        
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=127 time=34.5 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=127 time=35.7 ms
^C
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 2 received, 33% packet loss, time 2000ms
rtt min/avg/max/mdev = 34.536/35.141/35.746/0.605 ms
[root@de37ff32e2c4 /]# 
[root@de37ff32e2c4 /]# exit

四:創建自定義網絡

//自定義網絡固定IP

docker network create --subnet=172.18.0.0/24 mynetwork

docker run -itd --name test2 --net mynetwork --ip 172.18.0.10 centos:7 /bin/bash

創建自定義網絡,創建自定義網絡下的docker,並指定IP

備註:創建的自定義網絡模式是網橋模式

創建網絡命名空間

–subnet 網段

[root@kibana docker]# docker network create --subnet=172.18.0.0/16 net172.18/16
c8eedf507a2c0ae921548d4c0866e6ea670a7e9159ff3111eef3ac056eca890f
[root@kibana docker]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
a9c5de5293d8        bridge              bridge              local
53d98b95c07a        host                host                local
c8eedf507a2c        net172.18/16        bridge              local
d48e5bd972d0        none                null                local
[root@kibana docker]# ifconfig
br-c8eedf507a2c: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.18.0.1  netmask 255.255.0.0  broadcast 172.18.255.255
        ether 02:42:9f:8d:31:da  txqueuelen 0  (Ethernet)
        RX packets 284219  bytes 205421304 (195.9 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 303654  bytes 32016693 (30.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@kibana docker]# docker run -itd --name test3 --net net172.18/16 --ip 172.18.0.10 centos:7 /bin/bash
dd5782cde89d7084de43e8c343f6cbbe99e5b12226e037b7e5529a35d05bce55

查看容器狀態

[root@kibana docker]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
dd5782cde89d        centos:7            "/bin/bash"         2 minutes ago       Up 2 minutes                            test3
de37ff32e2c4        centos:7            "/bin/bash"         55 minutes ago      Up 55 minutes                           test1
[root@kibana docker]# 

進入容器驗證IP地址

[root@kibana docker]# docker exec -it  test3  /bin/bash
[root@dd5782cde89d /]# yum install net-tools -y
[root@dd5782cde89d /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.0.10  netmask 255.255.0.0  broadcast 172.18.255.255
        [root@dd5782cde89d /]# exit
exit
[root@kibana docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7                   5e35e350aded        5 months ago        203MB

在這裏插入圖片描述

五:docker network 的相關命令

5.1 刪除網絡docker network rm

[root@kibana docker]# docker network rm --help
Usage:  docker network rm NETWORK [NETWORK...]
Remove one or more networks
Aliases:
  rm, remove

5.2 查看網絡docker network ls

[root@kibana docker]# docker network ls --help

Usage:  docker network ls [OPTIONS]

List networks

Aliases:
  ls, list

Options:
  -f, --filter filter   Provide filter values (e.g. 'driver=bridge')
      --format string   Pretty-print networks using a Go template
      --no-trunc        Do not truncate the output
  -q, --quiet           Only display network IDs
[root@kibana docker]# 

5.3 檢查網絡詳細信息docker network inspect

[root@kibana docker]# docker network inspect --help

Usage:  docker network inspect [OPTIONS] NETWORK [NETWORK...]

Display detailed information on one or more networks
顯示一個或多個網絡上的詳細信息
Options:
  -f, --format string   Format the output using the given Go template
  -v, --verbose         Verbose output for diagnostics

5.4 將容器連接到網絡docker network connect

[root@kibana docker]# docker network connect --help

Usage:  docker network connect [OPTIONS] NETWORK CONTAINER

Connect a container to a network

Options:
      --alias strings           Add network-scoped alias for the container
      --driver-opt strings      driver options for the network
      --ip string               IPv4 address (e.g., 172.30.100.104)
      --ip6 string              IPv6 address (e.g., 2001:db8::33)
      --link list               Add link to another container
      --link-local-ip strings   Add a link-local address for the container

5.5 斷開容器與網絡的連接docker network disconnect

[root@kibana docker]# docker network disconnect --help

Usage:  docker network disconnect [OPTIONS] NETWORK CONTAINER

Disconnect a container from a network

Options:
  -f, --force   Force the container to disconnect from a network
  
  強制容器斷開與網絡的連接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章