docker 网络模式 和 端口映射
docker 的 网络模式
docker 自带 3 种 网络模式:分别是bridge网络,host网络,none网络,可以使用 docker network ls 命令查看。
1.none网络
这种网络模式下容器只有lo回环网络,没有其他网卡。none网络可以在容器创建时通过 --network=none 来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。
2.host网络
通过命令--network=host指定,使用host模式的容器可以直接使用docker host的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。
3.bridge网络
容器的默认网络模式,docker在安装时会创建一个名为docker0的Linux bridge,在不指定--network的情况下,创建的容器都会默认挂到docker0上面。
创建多个容器,都不指定 net 情况下 , docker network inspect bridge, 查看 bridge 网络情况。
查看 主机网桥情况 ,brctl show, 在 docker0 网桥下有3个接口,对应前面容器的各自的虚拟网卡。创建一个容器之后一个新的网络接口被挂载到了docker0上,这个就是容器创建时创建的虚拟网卡。bridge模式为容器创建独立的网络栈,保证容器内的进程使用独立的网络环境,使容器之间,容器和docker host之间实现网络隔离。
这里可以看出 docker0 网桥 上对应有3个容器挂靠的虚拟网卡, 此 3 个容器之间可以互相通信,因为在同一个网桥下。
思考?? 不同网桥下的容器间 能通信吗?
1. 先手动建立一个 bridge 模式的新 网桥, docker network create --driver bridge --subnet=172.18.0.0/16 --gateway=172.18.0.1 new_bridge
2. docker network ls 可以查看 docker 下现在的网络模式(新加的那个)
3. docker run -name test1 -ti --net=new_bridge 镜像名 (用新网桥的一个容器 test1)
4. docker run -name test2 -ti --net=bridge 镜像名 (用 docker 默认网桥的一个容器test2)
5. 进入到其中一个容器 ,ip a 查看网卡,ping 另一个容器IP
6. 进另一个容器,同上。 两个容器IP段不一样。 不同网桥,会创建不同网段的虚拟网卡给容器 。
7. 不同网桥下的容器间 不能ping通, 在于docker 设计时候就隔离了不同网桥
8. docker network connect new_bridge test2 // 为 test2 容器添加一块 new_bridge的 虚拟网卡,这样test2 上会 创建一个新的虚拟网卡,网段就是 新网桥设置的。
9. 如此就能互相ping通。
4.container模式
创建容器时使用--network=container:NAME_or_ID这个模式在创建新的容器的时候指定容器的网络和一个已经存在的容器共享一个Network Namespace,
但是并不为docker容器进行任何网络配置,这个docker容器没有网卡、IP、路由等信息,需要手动的去为docker容器添加网卡、配置IP等。(这个后面在验证)
参考 https://www.cnblogs.com/CloudMan6/p/7096731.html
5.user-defined模式
用户自定义模式主要可选的有三种网络驱动:bridge、overlay、macvlan。bridge驱动用于创建类似于前面提到的bridge网络;overlay和macvlan驱动用于创建跨主机的网络。
前面自定义的网络模式 new_bridge 就是新网络模式。另外两个后面在验证。
docker的端口映射
docker的端口映射,能保证在外部网络 访问 同一设备上不同容器时候 不会因为端口问题产生冲突。
docker 可将容器对外提供服务的端口映射到 host 的某个端口,外网通过该端口访问容器。容器启动时通过-p
参数映射端口:
可以使用-p
参数显式将一个或者一组端口从容器里绑定到宿主机上,而不仅仅是提供一个端口。注意这里是小写的p,不是大写。
因为该配置依赖于宿主机器,所以Dockerfile里没有对应的指令,这是运行时才可用的配置。-p
参数有几种不同的格式:
ip:hostPort:containerPort| ip::containerPort | hostPort:containerPort | containerPort