Docker的四中网络模式

avatar 2019年10月21日19:22:20 评论 1,139 次浏览

Docker的网络主要为宿主机连接容器的方式,网络方式不一样,实现的方式也不一样,不过最终目的就是实现docker容器可以访问宿主机,宿主机也可以直接访问到容器。下面看一下docker的各种网络模式:

[root@wulaoer ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
ebbf5a231803        bridge              bridge              local
236f251326a7        host                host                local
4725c3c74568        none                null                local

这是Docker安装时,自动创建的三种网络模式,下面对这四种网络模式做一下解释:

  • bridge 默认网络模式,会为容器分配和设置IP,并通过docker的虚拟网桥以及iptables nat表配置与宿主机进行通信。
  • host 不会创建自己的网卡和配置IP,而是和一个指定的容器共享端口IP,端口范围。
  • none 关闭了容器的网络功能。
  • Container 不会创建这种网络模式也不会创建自己的网卡,配置IP,而是一个指定的容器共享IP、端口范围。

下面对这四种网络模式做一下解释,我们可以参考一下两个不通的镜像使用方法上做区别理解:

1、bridge模式

桥接模式,有自己的IP,自己的网络环境,独立的操作模式,和node的区别就是自动获取不需要手动匹配。在使用中相对安全一些,创建容器时,模式就是bridge模式,其他模式需要使用--net参数:

[root@wulaoer ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
cf1342b89393        nginx               "nginx -g 'daemon of…"   31 minutes ago      Up 31 minutes       0.0.0.0:80->80/tcp        nginx-logs
9cc75fd9a4a7        tomcat              "catalina.sh run"        About an hour ago   Up About an hour    0.0.0.0:38080->8080/tcp   tomcat-dev
072973cdf516        nginx               "nginx -g 'daemon of…"   About an hour ago   Up About an hour    0.0.0.0:30080->80/tcp     nginx-dev

这都是bridge模式的,宿主机端口和容器端口可以一样也可以不一样,通过端口映射的方式访问到容器的内容,下面画了一个图看一下:

注:服务器的一个端口只能对应容器的一个端口,一旦映射,端口不能在用在其他容器上。例如:30080映射到docker1的80端口,其他容器不可在映射到30080端口。

2、host模式

host模式,容器不在拥有IP信息,和宿主机公用一个网络,我们创建一个容器查看一下和bridge模式有何不一样。

[root@wulaoer ~]# docker run -it --name nginx-host --net=host -p 8081:80 -d nginx
e8948a69430557dde31a1e3f3b5d7ae2607f6807018c4b2bc9a86e52159e5788

为了区别我们修改一下配置文件,修改一下访问内容:

[root@wulaoer ~]# docker exec -it nginx-host /bin/bash
root@wulaoer:/# cd /usr/share/nginx/html/
root@wulaoer:/usr/share/nginx/html# echo "this is host" > index.html 
root@wulaoer:/usr/share/nginx/html# exit
exit
[root@wulaoer ~]# curl http://10.211.55.41
this is host

我们映射的宿主机的端口8081,但是访问的时候使用80端口也可以访问到容器的内容,然而容器创建完成后映射的8081端口没有创建。说明host模式不存在端口映射,这就说明docker和宿主机公用一个网络,下面看一下host模式图:

宿主机和docker容器公用宿主机的网络,一个容器一个端口同样适用后不能在使用在其他容器上。

3、none模式

none模式不推荐使用,主要是网络需要自己手动设置,而且容器中没有安装一些基本工具所以设置的时候需要安装很多工具,所以太麻烦,不建议使用。

[root@wulaoer ~]# docker run -it --name nginx-none --net=none -p 8081:80 -d nginx
f10873577d22221fdc8a5d9f15c57e28f9dc0e22a6434ddd55b4d0d3c82fdcfc

这只是创建方法,下面看一下画的图。

4、Container模式

Container:创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。使用 --net=container:NAME_or_ID 指定,这中模式和集群的模式比较相识,可以看看k8s的网络模式就会明白了。下面看一下图:

这种模式只有在集群中才会比较常见,学习的时候了解即可。

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: