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 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
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选项,只有最后一个会生效!