Docker网络
理解docker0
清空所有镜像和容器
ip addr 查看所有网卡
[root@Graht ~]# ip addr
#本机回环地址
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state U...
#阿里云内网地址
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc ...
#docker0地址
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc ...
三个网络
#[root@Graht ~]# docker run -d -P --name tomcat01 tomcat
#查看容器内部网络地址 ip addr
#[root@Graht ~]# docker exec tomcat01 ip addr
如果这里报错 就进入容器内输入:
root@c6f719fe0664:/usr/local/tomcat# apt update && apt install -y iproute2
再次重试
#[root@Graht ~]# docker exec -it c6f719fe0664 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
#这个就是docker给容器分配的地址 eth0@if167
166: eth0@if167: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
#[root@Graht ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.085 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.074 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.068 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.082 ms
64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.083 ms
^C
--- 172.17.0.2 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4000ms
rtt min/avg/max/mdev = 0.068/0.078/0.085/0.010 ms
#linux可以ping同容器内部
原理
1、我们每启动一个docker容器,docker就会给容器分配一个ip,只要你电脑上安装了docker就会默认有一个docker0的网卡 [桥接模式] 使用的技术evth-pair技术!
[root@Graht ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc\
#再次测试就会有个167
这里是167:veth72fbac4@if166 容器中166: eth0@if167 一对一对的
167: veth72fbac4@if166: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether da:d1:74:a3:66:08 brd ff:ff:ff:ff:ff:ff link-netnsid
每次启动容器都会多一对网卡
我们发现容器带来的网卡都是一对一对的
#evth-pair就是一对虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连
#正因为有这个特性 evth-pair 充当一个桥梁连接各种虚拟网络信息
#Docker容器的连接OpenStack都是使用的evth-pair技术
#测试 容器一ping 容器二:
容器内ping命令不可使用 【apt install iputils-ping】
这里可以发现是可以ping通的
原理
结论: tomcat01 和 tomcat02是公用的一个路由器
所有容器不指定网络的情况下 都是docker0路由的 docker会给我们容器分配一个默认的可用ip
小结 docker网络使用的是linux的桥接模式
Docker中的所有的网络接口都是虚拟的。虚拟的转发效率高!(内网传递文件!)
只要容器删除那么对应的网桥就没了
–link[不建议使用]
思考一个场景,我们写了一个微服务,datebase url = ip:端口号, 项目不重启,数据库ip地址换掉了 我们希望可以处理这个问题,可以名字来进行访问容器?
[root@Graht ~]# docker exec -it tomcat01 ping tomcat02
ping: tomcat02: Name or service not known
#如何能够解决呢?
#[root@Graht ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat
#[root@Graht ~]# docker exec -it tomcat02 ping tomcat03
#--link 将tomcat03绑定到tomcat02上 【注意】这里不是双向绑定
探究link
docker network ls 查看docker所有网络
docker network inspect 网络id
docker inspect 容器id
#查看hosts配置
[root@Graht ~]# docker exec -it tomcat03 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.17.0.3 tomcat02 33855dcfeba6 #这里我们发现tomcat02被写死在这里
172.17.0.4 a955cedb2461
--link就是在hosts中增加了一个127.17.03
自定义网络!不使用docker0
docker0的问题: 他不支持容器名访问
容器互联
查看所有网卡
[root@Graht ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
9460465e8177 bridge bridge local
aa971b340ef5 host host local
acc9f2597b2d none null local
#网络模式
bridge桥接模式 就是在docker搭桥(默认) 自己创建也使用这个
none不配置网络
host主机模式 和宿主机共享网络
container容器内网络连通!(用的少!局限性很大)
#我们直接启动的命令 --net bridge 这个就是我们docker0
[root@Graht ~]# docker run -d -p --name tomcat01 --net bridge tomcat 【默认】
#docker0的特点 默认的 域名不能访问 --link可以打通连接 【不建议使用】
#我们可以自定义一个网络
[root@Graht ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
--driver 网络模式 默认bridge可以不写
--subnet 子网地址
--gateway 网关 192.168.0.2---192.168.255.25
[root@Graht ~]# docker network inspect mynet
里面有
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
到这里我们自己的网络就创好了
启动两个容器并设置自己网络
[root@Graht ~]# docker run -d -P --name tomcat01 --net mynet tomcat
ea18d9fbf1229fc2acc29889077fbcb4c23c5bea73b46193339c3154c97ffc06
[root@Graht ~]# docker run -d -P --name tomcat02 --net mynet tomcat
a36be2e0aef383e62df2891441cf2d1e2063f6043248409fbff9448e33611028
[root@Graht ~]# docker network inspect mynet
#这里的Containers 里面有启动的两个tomcat
"Containers": {
"a36be2e0aef383e62df2891441cf2d1e2063f6043248409fbff9448e33611028": {
"Name": "tomcat02",
"EndpointID": "26355e45c40250943f01eaf147c3fc004a9e527c4dc661ddd32768b9ef1bdf84",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
},
"ea18d9fbf1229fc2acc29889077fbcb4c23c5bea73b46193339c3154c97ffc06": {
"Name": "tomcat01",
"EndpointID": "d35ad9e918fe152c9efed6a229c7d7797c9064abbe45651496a44ef2a8c5369b",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
}
},
这里tomcat01就可以ping通tomcat02【如果遇到问题请仔细阅读上面的问题
IP命令不可用或者ping命令不可用
】 进入容器#apt update && apt install -y iproute2 && apt install iputils-ping
网络连通
建立两个新容器 --driver 默认也就是
docker run -d -P --name tomcat01-net tomcat和
docker run -d -P --name tomcat02-net tomcat
#####################
[root@Graht ~]# docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
#connect连接一个网络到一个容器
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.
##########################
#测试打通 tomcat01-net - mynet
[root@Graht ~]# docker network connect mynet tomcat01-net
[root@Graht ~]# docker network inspect mynet
"Containers": {
"12c5904cb9ee88bfb42f11df93e5b4f332260bf69e4c77452febf8dbc4230c8a": {
"Name": "tomcat01-net",
"EndpointID": "e3b1b7563703c1d5b60d8c124428ecc69f8d242dd0bf2e203a966a41f6e90590",
"MacAddress": "02:42:c0:a8:00:04",
"IPv4Address": "192.168.0.4/16",
"IPv6Address": ""
},
"a36be2e0aef383e62df2891441cf2d1e2063f6043248409fbff9448e33611028": {
"Name": "tomcat02",
"EndpointID": "26355e45c40250943f01eaf147c3fc004a9e527c4dc661ddd32768b9ef1bdf84",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
},
"ea18d9fbf1229fc2acc29889077fbcb4c23c5bea73b46193339c3154c97ffc06": {
"Name": "tomcat01",
"EndpointID": "d35ad9e918fe152c9efed6a229c7d7797c9064abbe45651496a44ef2a8c5369b",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
}
},
#这里你会发现他直接将tomcat01-net 添加到mynet的网络里面来了
##一个容器两个ip地址! 例如阿里云一个公网ip一个私网ip
结论:假设要跨网络操作别人 就需要使用docker network connect 连通