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選項,只有最後一個會生效!