Docker網絡

docker 網絡:

docker0 ---NAT橋[snat]

SDN--軟件定義的網絡

docker網絡:
[root@www18:53:45~]#docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
11439dd220a7        bridge              bridge              local
d1a47b89891e        host                host                local
e3f6e14fbfa3        none                null                local

顯示在ifconfig命令下的只是一半網卡
另一半在容器上:
ip a可以查看
vethe76aa54@if18

另外一半在容器中的eth0網卡中

1 默認是橋接bridge ----net橋

2 host:
讓容器使用宿主機的網絡名稱空間

3 none:沒有網絡
這有lo接口!
封閉式容器!--Closed container

4 聯盟式網絡
共享部分內容:
獨立部分:
User ---用戶
Mount ---掛載文件系統
Pid ---進程的ID

共享部分:
IPC ---進程間通信
Net ---網絡
UTS ---主機名|域名

可以通過lo接口通信!--聯盟式網絡

聯盟式網絡展示:

指定docker網絡:
docker  create --network [網絡模型]
查看容器網絡信息:
docker network inspect [容器ID] 

聯盟式容器:
共享部分內容:
獨立部分:
User ---用戶
Mount ---掛載文件系統
IPC ---進程間通信

共享部分:
Pid ---進程的ID
Net ---網絡
UTS ---主機名域名

啓用兩個容器:
容器1:
[root@www21:14:56~]#docker run --name t2 -it --rm busybox
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:03  
          inet addr:172.17.0.3  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6 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:508 (508.0 B)  TX bytes:0 (0.0 B)

容器2:
[root@www21:14:39~]#docker run --name t1 -it --rm busybox
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02  
          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 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:648 (648.0 B)  TX bytes:0 (0.0 B)

創建特殊:共享t1的網絡名稱空間
docker run --name t2 --network container:t1 -it --rm busybox
查看IP地址:和t1一樣!
[root@www21:17:51~]#docker run --name t2 --network container:t1 -it --rm busybox
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02  
          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 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:648 (648.0 B)  TX bytes:0 (0.0 B

測試網絡名稱空間是否共享:
t2主機中啓用httpd服務並且創建默認頁面
在t1中訪問:
/ # wget -O - -q 127.0.0.1
test docker file

測試網絡名稱空間共享是否影響其它:
在t1中創建一個目錄:mkdir /tmp/test
從t2中去訪問,發現沒有這個目錄!

容器網絡-none

具體應用2:none
[root@www20:27:21~]#docker run --name t1 -it --network none --rm 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)

容器網絡-host:

host網絡:

具體使用:
docker run --name t1 --network host -it --rm busybox

效果展示:
[root@www21:28:44~]#docker run --name t1 --network host -it --rm busybox
/ # ifconfig
docker0   Link encap:Ethernet  HWaddr 02:42:01:EE:B1:13  
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
          inet6 addr: fe80::42:1ff:feee:b113/64 Scope:Link
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:466 errors:0 dropped:0 overruns:0 frame:0
          TX packets:535 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:235323 (229.8 KiB)  TX bytes:712571 (695.8 KiB)

eth0      Link encap:Ethernet  HWaddr 00:0C:29:4F:0B:22  
          inet addr:172.20.23.33  Bcast:172.20.255.255  Mask:255.255.0.0
          inet6 addr: fe80::20c:29ff:fe4f:b22/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:387501 errors:0 dropped:0 overruns:0 frame:0
          TX packets:28694 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:492451344 (469.6 MiB)  TX bytes:3057821 (2.9 MiB)

此時啓用容器中的httpd服務!在物理機中的瀏覽器直接訪問宿主機IP
即可訪問到頁面內容!

開放容器內端口:

開放容器內的對外端口:
端口暴露:
EXPOSE

方式1:
指定端口映射:
方式1:通過-p選項生成nat規則!
-p:指定本機端口
-name [name]:指定容器名稱
案例:
docker run -p 81:80 -name nginx-test-port1 [鏡像名nginx]

方式1:指定本機IP和本機地址
docker run -p 172.20.23.31:81:80 -name nginx-test-port2 [鏡像名nginx]

方式2:指定本機IP和本機地址及協議[默認是tcp]
docker run -p 172.20.23.31:81:80/udp -name nginx-test-port2 [鏡像名nginx]

方式3:一次性映射多個端口+協議
docker run -p 81:80/udp -p 82:80/tcp -name nginx-test-port2 [鏡像名nginx]

方式4:
docker run --name myweb --rm -p 172.20.23.33::80 a010162b89bb

172.20.23.33::80 --這裏的80是docker容器的80端口!

查看映射結果:
[root@www21:01:08~]#docker port a010162b89bb
80/tcp -> 172.20.23.33:80

隨機端口映射 -P

docker port [容器名稱] --查看暴露端口關聯情況

容器DNS:

默認是使用宿主機的DNS

使用格式:
docker run -it --rm -dns [dns] [鏡像名稱] 

具體操作:
[root@www15:49:33~]#docker run -it  -d --dns 233.6.6.6 centos bash
ae3671d0d59523a3283b899011a4a873ea670d55fc93ae9b9616b1bf0476062c
[root@www15:50:00~]#docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
ae3671d0d595        centos              "bash"              5 seconds ago       Up 4 seconds                            wonderful_wozniak
401c2bad7283        centos              "/bin/bash"         3 minutes ago       Up 3 minutes                            laughing_kilby
[root@www15:50:05~]#bash docker.sh ae3671d0d595
[root@ae3671d0d595 /]# cat /etc/resolv.conf 
search mysql.com
nameserver 233.6.6.6
具體用法2:
[root@www20:36:13~]#docker run --name t1 -it --network bridge -h t1.test.com --dns 114.114.114.114 --rm busybox
/ # cat /etc/resolv.conf 
search mysql.com
nameserver 114.114.114.114
/ # 

自動搜索域:
--dns-search [c.com]

利用/etc/hosts文件解析:
docker run --name t1 -it --network bridge -h t1.test.com --add-host www.sql2.com:172.20.23.33 --rm busybox
查看結果:
[root@www20:42:22~]#docker run --name t1 -it --network bridge -h t1.test.com --dns 114.114.114.114 --add-host www.sql2.com:172.20.23.33 --rm busybox
/ # cat /etc/hosts
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.20.23.33    www.sql2.com
172.17.0.4  t1.test.com t1

指定容器內部主機名:

容器內部的hostname就是容器的id --docker ps
[root@www20:28:34~]#docker run --name t1 -it --network bridge --rm busybox
/ # hostname
45fbf0e574fa

1 容器使用正常主機名:
1 容器內部使用hostname命令
2 使用命令外部注入:
docker run --name t1 -it --network bridge -h t1.test.com --rm busybox
具體用法:
[root@www20:32:59~]#docker run --name t1 -it --network bridge -h t1.test.com --rm busybox
/ # hostname
t1.test.com

一些測試幫助工具:

容器中訪問其他主機頁面內容工具:
wget -O - -q 127.0.0.1

ip命令所屬的程序包:
iproute

添加網絡名稱空間:
ip netns add r1
ip netns add r2 

查看網絡名稱空間列表:
ip netns list

網絡名稱空間中執行命令:
ip netns exec [網絡空間名稱] [命令]
ip netns exec r1 ifconfig -a

創建虛擬網卡對:
ip link add name veth1.1 type veth peer veth1.2

查看虛擬網卡對:
ip link show

把虛擬網卡設備關聯至網絡名稱空間:
ip link set dev veth1.2 netns r1 

更改網絡名稱空間中的虛擬網卡設備名稱:
ip netns exec r1 ip link set dev veth1.2 name eth0

激活虛擬網卡對兒:
宿主機:
ifconfig veth1.1 172.20.23.1/16
網絡名稱空間:
ip netns exec r1 ifconfig eth0 172.20.23.2/16

測試:
宿主機用ping命令去網絡名稱空間中的ip

也可以把在物理機上的另一半網卡送給r2
ip link set dev veth1.1 netns r2
手動激活r2中的網卡:
ip netns exec r2 ifconfig veth1.1 172.20.23.2/16

測試從r2中ping r1的地址:
ip netns exec r2 ping 172.20.23.2 
查看網絡模型內容:
docker network inspect [bridge] 

關鍵內容:
所屬網絡:
"Config": [
  {
    "Subnet": "172.17.0.0/16",
    "Gateway": "172.17.0.1"
   }

net橋網卡名稱:
"com.docker.network.bridge.name": "docker0",

工具:brctl
yum install -y bridge-utils

[root@www18:59:47~]#brctl show
bridge name bridge id       STP enabled interfaces
docker0     8000.02427d38dc0c   no      vethe76aa54
                                        vethe911032

更改docker0橋的IP:

要更改/etc/docker/daemon.json文件:
{
    "bip": "192.168.1.5/24",
    "fixed-cidr": "10.20.0.0/16"
    "fixed-cidr-v6": "2001:db8::/64",
    "mtu": 1500,
    "default-gateway": "10.20.1.1",
    "default-gateway": "10.20.1.1",
    "default-gateway-v6": "2001:db8:abcd::89"
    "dns": ["10.20.1.2","10.20.1.3"]
}   

注意:
最後一個key後面不能有逗號

具體解析:
指定docker0橋的ip地址和掩碼:最主要!
"bip": "192.168.1.5/24",
系統會自動推算出所在網絡,今後添加的容器就在這裏分配

指定默認網關:
"default-gateway": "10.20.1.1",

指定默認dns地址:
"dns": ["10.20.1.2","10.20.1.3"]

具體使用:
[root@www21:44:11~]#cat /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://c7roarh7.mirror.aliyuncs.com"],
  "bip": "192.168.23.1/24"
}

效果展示:
[root@www21:44:08~]#ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.23.1  netmask 255.255.255.0  broadcast 192.168.23.255
        inet6 fe80::42:1ff:feee:b113  prefixlen 64  scopeid 0x20<link>
        ether 02:42:01:ee:b1:13  txqueuelen 0  (Ethernet)
        RX packets 466  bytes 235323 (229.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 535  bytes 712571 (695.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker默認sock文件位置:
[root@www21:46:40~]#ls /var/run/docker.sock 
/var/run/docker.sock

dockerd守護進程的C/S:
"docker服務器端"
編輯配置文件:
/etc/docker/daemon.json

格式:
{
    "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.scok"]
}

"docker客戶端連接方式"
docker -H|--host

具體使用:
[root@www21:52:12~]#cat /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://c7roarh7.mirror.aliyuncs.com"],
  "bip": "192.168.23.1/24",
  "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.scok"]

}

docker客戶端連接方式具體應用:
docker -H 172.20.23.33:2375 ps
[root@www20:51:41~]#docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                       NAMES
cf9508d9e842        4bd6559a1956        "/bin/bash"         2 hours ago         Up 2 hours                                      festive_williams
a3256189aeed        4bd6559a1956        "/bin/bash"         2 hours ago         Up 2 hours          172.20.23.31:8080->80/tcp   compassionate_williams
[root@www21:53:55~]#docker -H 172.20.23.33:2375 ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

創建自定義橋:

創建自定義橋:
docker network create [options] [網絡接口名稱--類似eth0]
常用選項:
-d:指定橋類型 [bridge[nat橋] host[共享宿主機網絡名稱空間] macvlan null[不使用網絡] overlay]
--subnet " " :指定子網所處網絡
--gateway :指定網關
--ip-range:指定地址池 

具體使用:
docker network create -d bridge --subnet "172.26.0.0/16" --gateway "172.26.0.1" testbr0

查看效果:
[root@www21:54:00~]#docker network create -d bridge --subnet "172.26.0.0/16" --gateway "172.26.0.1" testbr0
d47407dd04e399463821887c9d184f13fa598147dd831c7a5a7732966a9ca92e
[root@www22:02:03~]#docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
655d19edbd35        bridge              bridge              local
d7bab84a04a3        host                host                local
0bbd7518157b        none                null                local
d47407dd04e3        testbr0             bridge              local

更名:需要先down掉!
ip link set dev br-d47407dd04e3 name docker1

創建容器加入網絡:
docker run -it --name t1  --network testbr0 busybox  

在宿主機中打開核心轉發!同一主機中不同橋中的主機就可以互通!

刪除網絡橋:docker network rm [橋名稱]
[root@www22:09:21~]#docker network rm testbr0
testbr0
[root@www22:09:56~]#docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
655d19edbd35        bridge              bridge              local
d7bab84a04a3        host                host                local
0bbd7518157b        none                null                local

--network在創建容器時,如果指定多個network選項,只有最後一個會生效!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章