理解Docker网络
测试 ip addr
测试
- 启动一个tomcat
docker run -d -P --name tomcat01 tomcat
- 查看容器内部网络ip地址
docker exec -it tomcat01 ip addr
root@lsMusKVEqm:~# docker exec -it tomcat01 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
114: eth0@if115: <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@lsMusKVEqm:~#
# 此时有可能报错
root@lsMusKVEqm:~# docker exec -it tomcat01 ip addr
OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "ip": executable file not found in $PATH: unknown
root@lsMusKVEqm:~#
# 说明容器内没有这个命令
# 1. 进入容器
docker exec -it tomcat01 /bin/bash
# 2. 更新apt(我的系统环境是ubuntu)
apt update
# 3. 安装
apt install -y iproute2
# 4. 退出容器测试正常
每个容器启动时docker都会给他分配一个ip地址
ping测试
再次测试
ip addr
此时我们会发现跟容器内的惊人的相似
再启动一个tomcat02
docker run -d -P --name tomcat02 tomcat
再次查看ip addr多了个类似的网卡
探讨
- 我们可以发现docker容器带来的网卡都是一对一对的
- docker网络使用了evth-pair技术
- evth-pair就是一堆的虚拟设备接口,他们是成对出现的,一端连着协议,另一端使大家彼此相连
- evth-pair充当着一个桥梁,连接着各种虚拟网络设备
tomcat01和tomcat02是共用一个路由器--docker0
所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认可用的IP
小结
Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥docekr0。
--link
思考一个场景,我们编写了一个微服务,项目每次重启IP都会变,我们希望可以处理这个问题,如何做到用名字来进行访问?
root@lsMusKVEqm:~# docker exec -it tomcat01 ping tomcat02
ping: tomcat02: Name or service not known
root@lsMusKVEqm:~#
此时是无法ping通的,那么该如何解决该问题呢? 我们在启动容器时可用--link进行链接
docker run -d -P --name tomcat01 --link tomcat02 tomcat
--link本质是在hosts文件中增加了一个映射
自定义网络
容器互联
查看docker的网络
| 模式 | 说明 |
|---|---|
| bridge | 桥接 docker默认,自定义也是用该模式 |
| none | 不配置网络 |
| host | 和所主机共享网络 |
| container | 容器内网络连通!(很少使用) |
直接启动容器会带默认的网络配置参数
--net bridge,也就是docker0
docker网络相关命令
尝试
# --driver bridge 使用桥接模式
# --subnet 192.168.0.0/16 子网
# --gateway 192.168.0.1 网关
# mynet 自己创建的网络名字
root@lsMusKVEqm:/etc/apt# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
35a1b8d86f099dd87713ef889c22a8899995419eb33f1ab6949916f39b7747e4
root@lsMusKVEqm:/etc/apt#
root@lsMusKVEqm:/etc/apt# docker network ls
NETWORK ID NAME DRIVER SCOPE
8ec57ea61f63 bridge bridge local
9328b0336d70 host host local
35a1b8d86f09 mynet bridge local
2791d40430e4 none null local
root@lsMusKVEqm:/etc/apt#
使用我们自定义的网络启动容器
root@lsMusKVEqm:/etc/apt# docker run -d -P --name tomcat-mynet-01 --net mynet tomcat
48fe314604e4b8af6a513f55913f7a6ca75921a525ee111ca0c14e14a160fc30
root@lsMusKVEqm:/etc/apt# docker run -d -P --name tomcat-mynet-02 --net mynet tomcat
198c73aabff36cde4fb19e8e6b2d8c2e00950c98899a558a8e1a1c3a91e52228
此时不管使用名字还是ip都可以ping通
网络连通
docker network connect mynet tomcat01