【Docker】十、网络

198 阅读3分钟

理解Docker网络

测试 ip addr

image.png

测试

  1. 启动一个tomcat
docker run -d -P --name tomcat01 tomcat
  1. 查看容器内部网络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地址

image.png

ping测试

image.png

再次测试ip addr

image.png

此时我们会发现跟容器内的惊人的相似

再启动一个tomcat02

 docker run -d -P --name tomcat02 tomcat

再次查看ip addr多了个类似的网卡

image.png

探讨

  1. 我们可以发现docker容器带来的网卡都是一对一对的
  2. docker网络使用了evth-pair技术
  3. evth-pair就是一堆的虚拟设备接口,他们是成对出现的,一端连着协议,另一端使大家彼此相连
  4. evth-pair充当着一个桥梁,连接着各种虚拟网络设备

image.png tomcat01和tomcat02是共用一个路由器--docker0

所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认可用的IP

小结

Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥docekr0。 image.png

--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的网络

image.png

模式说明
bridge桥接 docker默认,自定义也是用该模式
none不配置网络
host和所主机共享网络
container容器内网络连通!(很少使用)

直接启动容器会带默认的网络配置参数--net bridge,也就是docker0

docker网络相关命令

image.png

image.png

尝试

# --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# 

image.png

使用我们自定义的网络启动容器

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

image.png

此时不管使用名字还是ip都可以ping通

网络连通

image.png

image.png

docker network connect mynet tomcat01