出现:Error response from daemon: Conflict.
exec failed: exec failed… exec: “ip“(Docker容器没有ip addr命令:ex(Docker容器没有ip addr命令:exec ip addr 报错)
容器内部执行ip addr
容器外部执行ip addr
ping 172.17.0.2
# linux 可以ping通 docker 容器内部
原理
1、我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡,docker0桥接模式,使用的技术是veth-pair技术!
再次测试 ip addr
2 、再启动一个容器测试,发现又多了一对网络
tomcat02的ip addr
# 我们发现这个容器带来网卡,都是一对对的 6-7 8-9 # veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连 # 正因为有这个特性 veth-pair 充当一个桥梁,连接各种虚拟网络设备的 # OpenStac,Docker容器之间的连接,OVS的连接,都是使用evth-pair技术
3、我们来测试下tomcat01和tomcat02是否可以ping通
可以
网络模型图
结论:tomcat01和tomcat02公用一个路由器,docker0。
所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip。
小结
Docker使用的是Linux的桥接,宿主机是一个Docker容器的网桥 docker0
Docker中所有网络接口都是虚拟的,虚拟的转发效率高(内网传递文件)
只要容器删除,对应的网桥一对就没了!
思考一个场景:我们编写了一个微服务,database url=ip: 项目不重启,数据ip换了,我们希望可以处理这个问题,可以通过名字来进行访问容器?
–-link
$ docker exec -it tomcat02 ping tomca01 # ping不通 ping: tomca01: Name or service not known # 运行一个tomcat03 --link tomcat02 docker run -d -P --name tomcat03 --link tomcat02 tomcat 5c593586aab4f5717e373d669ef6c4dafdc35241af58cfa98fc960c255bdf1ed # 3连接2 # 用tomcat03 ping tomcat02 可以ping通 $ docker exec -it tomcat03 ping tomcat02 PING tomcat02 (172.17.0.3) 56(84) bytes of data. 64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.115 ms 64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.080 ms # 2连接3 # 用tomcat02 ping tomcat03 ping不通
探究:
docker network inspect 网络id 网段相同
[root@centos-7 kuangstudy]# docker network ls NETWORK ID NAME DRIVER SCOPE 9e74954fab96 bridge bridge local d1866eada5a8 host host local 633cff0390b9 none null local [root@centos-7 kuangstudy]#
docker inspect tomcat03
查看tomcat03里面的/etc/hosts发现有tomcat02的配置
–link 本质就是在hosts配置中添加映射
现在使用Docker已经不建议使用–link了!
自定义网络,不适用docker0!
docker0问题:不支持容器名连接访问!
自定义网络
[root@centos-7 kuangstudy]# docker network --help Usage: docker network COMMAND Manage networks Commands: connect Connect a container to a network 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. [root@centos-7 kuangstudy]#
查看所有的docker网络
bridge :桥接 docker(默认,自己创建也是用bridge模式)
none :不配置网络,一般不用
host :和所主机共享网络
container :容器网络连通(用得少!局限很大)
# 我们直接启动的命令 --net bridge,而这个就是我们得docker0 # bridge就是docker0 $ docker run -d -P --name tomcat01 tomcat 等价于 => docker run -d -P --name tomcat01 --net bridge tomcat # docker0,特点:默认,域名不能访问。 --link可以打通连接,但是很麻烦!
# 我们可以 自定义一个网络 $ docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
$ docker network inspect mynet;
我们自己的网络就创建好了
[root@centos-7 kuangstudy]# docker run -d -P --name tomcat-net-01 --net mynet tomcat d9695c285a054d3620c41980041af10b0cb14c36d78b549349405c15e73f05fb [root@centos-7 kuangstudy]# docker run -d -P --name tomcat-net-02 --net mynet tomcat 71cae31a62f3dcabb030c268e98e25ae84df07ba26af21ee5863189ee8d5a01b
[root@centos-7 kuangstudy]# docker network inspect mynet
在自定义的网络下,服务可以互相ping通,不用使用–link