持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
Docker网络
理解Docker0
先清除所有镜像和容器
docker rmi -f $(docker images -aq)
docker ps -a -q|xargs docker rm
启动一个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在同一网段。
此时用本机ping容器,发现也是可以ping通的
再输入 ip addr 可以发现多了一对网卡和上面启动的tomcat01容器相对应
- 我们只要安装了docker,就会有一个网卡(docker0),网络模式为桥接模式,使用的是 evth-pair技术;
- 每启动一个容器docker就会为它分配一个IP地址,对应的也会多一对网卡(本机是@if92,容器内是@if93)!
- 容器和linux主机可以ping通,而且每个容器之间也可以通过ip地址ping通。
网络模型
02ping03时,相当于通过01路由器转发到了03
容器互联--link
容器之间通过ip地址能ping通,但是通过容器名是无法ping通的
所以这时就需要使用--link解决此问题
docker run -d -P --name tomcat03 --link tomcat02 tomcat
此时03就能通过容器名ping通02了,但是02不能ping03,后来查看hosts文件发现是因为03的hosts文件中写入了02所以能ping通
自定义网络
查看docker中的所有网络
#通过命令创建一个自己的网络
[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
#使用自定义网络创建容器
[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的网络