初识Docker网络

137 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情

Docker网络

理解Docker0

先清除所有镜像和容器

docker rmi -f $(docker images -aq) 
docker ps -a -q|xargs docker rm

image-20220918093434993.png

启动一个tomcat容器,查看IP地址

#启动docker容器
[root@VM-16-10-centos /]# docker run -d -P --name=tomcat01 tomcat#执行ip addr后报错:没有命令
[root@VM-16-10-centos /]# docker exec -it tomcat01 ip addr
OCI runtime exec failed: exec failed: unable to start container process: exec: "ip": executable file not found in $PATH: unknown
​
#所以先进入容器,下载基础命令
[root@VM-16-10-centos /]# docker exec -it tomcat01 /bin/bash
root@6cd0a231ba62:/usr/local/tomcat# ip addr
bash: ip: command not found
root@6cd0a231ba62:/usr/local/tomcat# apt update && apt install -y iproute2

此时执行ip addr,发现了两个地址 lo 和eth0,其中eth0就是docker为各容器分配的,可以看到 docker0的ip地址为:172.17.0.1 ,启动的tomcat01容器分配的地址为:172.17.0.2,这两个ip在同一网段。

image-20220918095548689.png 此时用本机ping容器,发现也是可以ping通的

再输入 ip addr 可以发现多了一对网卡和上面启动的tomcat01容器相对应

image-20220918100318877.png

  • 我们只要安装了docker,就会有一个网卡(docker0),网络模式为桥接模式,使用的是 evth-pair技术;
  • 每启动一个容器docker就会为它分配一个IP地址,对应的也会多一对网卡(本机是@if92,容器内是@if93)!
  • 容器和linux主机可以ping通,而且每个容器之间也可以通过ip地址ping通。

网络模型

02ping03时,相当于通过01路由器转发到了03

image-20220918102755514.png

image-20220918105627864.png

容器互联--link

容器之间通过ip地址能ping通,但是通过容器名是无法ping通的

image-20220919202418479.png 所以这时就需要使用--link解决此问题

docker run -d -P --name tomcat03 --link tomcat02 tomcat

此时03就能通过容器名ping通02了,但是02不能ping03,后来查看hosts文件发现是因为03的hosts文件中写入了02所以能ping通

自定义网络

查看docker中的所有网络

image-20220919202604350.png

image-20220920150414835.png

#通过命令创建一个自己的网络
[root@VM-16-10-centos ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
ed14e1ecebb9c311ddecc3670f5c6e0429e84a46181ccbf9ff997e6ec9c07441
​
#查看网络
[root@VM-16-10-centos ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
760dea8f9135   bridge    bridge    local
fa5c4ad578ff   host      host      local
ed14e1ecebb9   mynet     bridge    local
531177f2dd44   none      null      local#查看网络配置
[root@VM-16-10-centos ~]# docker network inspect mynet

image-20220920151615138.png

#使用自定义网络创建容器
[root@VM-16-10-centos ~]# docker run -d -P --name=tomcat01-net --net mynet tomcat
4af4c548f11381f6fcf736d2fa5417ca216d134bc51635fc1aa681cde8f4fc02
[root@VM-16-10-centos ~]# docker run -d -P --name=tomcat02-net --net mynet tomcat
cf59546f20cbfd9c660142f5464a95250b7aa6e0bb1b872245a88a3cc1f6636e

通过自定义网络方式,能直接实现容器间的网络连接,就不在需要通过--link,

docker exec -it tomcat01-net ping tomcat02-net

网络连通

启动之前定义的docker0网络镜像tomcat03

此时用tomcat03 ping mynet网络的容器是ping不通的,但是可以通过 connect命令进行连通

#connect连通
docker network connect mynet tomcat03
​
#ping测试
docker exec -it tomcat03 ping tomcat01-net
PING tomcat01-net (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat01-net.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.101 ms
64 bytes from tomcat01-net.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.066 ms

此时执行docker network inspect mynet,发现mynet中多了tomcat03的网络

image-20220921201303700.png