所有容器在不指定网络的情况下,都是由docker0路由的,docker会给容器分配一个默认可用的IP。
Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。
一、四类网络模式
| Docker网络模式 | 配置 | 说明 |
|---|---|---|
| host模式 | –net=host | 容器和宿主机共享Network namespace。 |
| container模式 | –net=container:NAME_or_ID | 容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。(用得少,局限大) |
| none模式 | –net=none | 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。 |
| bridge模式 | –net=bridge | (默认为该模式) |
二、容器互联,—link
#一般来说容器之间是不能互相ping通的,需要设置一定的网络#先启动一个tomcatdocker run -d -P --name tomcat01 tomcat#再通过 --link 启动另外一个容器联通到这个tomcat01docker run -d -P --name tomcat02 --link tomcat01 tomcat#这样就能够使tomcat02 ping 通到tomcat01,但是这个是单向的,tomcat01还是不能ping到tomcat02docker -exec -it tomcat02 ping tomcat01# --link的原理想当于在/etc/hosts 配置了一个ip主机名的映射# 但是在实际生产中不建议使用 --link配置网络,而是使用自定义的网络方式
三、自定义网络
#使用docker run -d -P --name tomcat01 --net bridge tomcat 等价于docker run -d -P --name tomcat01 tomcat#自定义创建一个网络,指定:桥接模式,子网,网关地址docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet#查看当前docker的网络种类dcoker network ls#启动两个容器,指定使用自定义的mynet,这样容器内部分配的IP就会根据自定义的mynet去分配docker run -d -P --name tomcat01 --net mynet tomcatdocker run -d -P --name tomcat02 --net mynet tomcat#也可以使用 --ip 指定容器的IPdocker run -d -P --name tomcat03 --ip 192.168.0.3 --net mynet tomcat#再通过如下命令可以去查看该自定义网络mynet下分配了哪些IP到哪些容器docker network inspect mynet#这样两个容器就可以通过IP/容器名 进行ping通docker exec -it tomcat01 ping 192.168.0.3docker exec -it tomcat01 ping tomcat02
