Docker网络

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 连通

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值