所有容器在不指定网络的情况下,都是由docker0路由的,docker会给容器分配一个默认可用的IP。
7、Docker 网络 - 图1

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

  1. #一般来说容器之间是不能互相ping通的,需要设置一定的网络
  2. #先启动一个tomcat
  3. docker run -d -P --name tomcat01 tomcat
  4. #再通过 --link 启动另外一个容器联通到这个tomcat01
  5. docker run -d -P --name tomcat02 --link tomcat01 tomcat
  6. #这样就能够使tomcat02 ping 通到tomcat01,但是这个是单向的,tomcat01还是不能ping到tomcat02
  7. docker -exec -it tomcat02 ping tomcat01
  8. # --link的原理想当于在/etc/hosts 配置了一个ip主机名的映射
  9. # 但是在实际生产中不建议使用 --link配置网络,而是使用自定义的网络方式

三、自定义网络

  1. #使用
  2. docker run -d -P --name tomcat01 --net bridge tomcat 等价于
  3. docker run -d -P --name tomcat01 tomcat
  4. #自定义创建一个网络,指定:桥接模式,子网,网关地址
  5. docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
  6. #查看当前docker的网络种类
  7. dcoker network ls
  8. #启动两个容器,指定使用自定义的mynet,这样容器内部分配的IP就会根据自定义的mynet去分配
  9. docker run -d -P --name tomcat01 --net mynet tomcat
  10. docker run -d -P --name tomcat02 --net mynet tomcat
  11. #也可以使用 --ip 指定容器的IP
  12. docker run -d -P --name tomcat03 --ip 192.168.0.3 --net mynet tomcat
  13. #再通过如下命令可以去查看该自定义网络mynet下分配了哪些IP到哪些容器
  14. docker network inspect mynet
  15. #这样两个容器就可以通过IP/容器名 进行ping通
  16. docker exec -it tomcat01 ping 192.168.0.3
  17. docker exec -it tomcat01 ping tomcat02