在之前的几篇文章中,小山向大家介绍了 Docker,以及如何安装并且使用它。
我们使用 Docker 大多数的目的是用来搭建网络服务,比如搭建网站系统,而这些服务我们是要对外公开访问的,这就涉及到一个容器的网络问题,容器的网络是如何工作的,如何让容器里的服务可以对外访问。
这篇教程我们就来讲讲 Docker 几种网络驱动,以及它们是如何工作的,该如何使用它们。
Docker 的网络驱动默认情况下有四个:bridge、host、overlay 和 macvlan,还有一个特殊的网络驱动 none 用于禁止容器访问网络。
其中 bridge 和 host 在 Docker 安装后会默认创建一个网络,注意,这些都是驱动,你可以利用这些驱动创建自定义的网络。
下面我就来给大家分别介绍一下这四个网络驱动。
bridge
这是 Docker 默认的网络驱动,如果在创建的时候没有指定网络驱动,则默认使用 bridge,也就是桥接网络。
跟虚拟机的网络地址转换差不多,通过一个内部的子网向容器提供 IP 和网络。默认情况下,处于桥接网络下的容器,端口不会对外暴漏,如果需要让容器内部的端口对外暴漏,很简单,创建容器的时候加上-p
参数做端口转发。
我以 Nginx 镜像为基础创建一个容器进行演示
创建 Nginx 容器并对外暴露 80 端口:sudo docker run -d -p 8080:80 --name mivm nginx
,这个命令添加了-p
参数,分号前面的是对外暴露的端口,后面的是容器内部的端口。
我将容器内 Nginx 占用的 80 端口转发到了外部的 8080 端口,所以我现在只需要在浏览器输入宿主系统的 IP + 8080 端口就可以访问容器里的 Nginx 了。
端口转发之前请先确保宿主系统没有占用转发端口
这就是容器对外提供服务最简单的方法,当然,桥接网络的作用不止这些,它的另一个作用留到下一篇教程再讲。
host
这是 Docker 最直接的一种网络驱动:主机模式,在这个模式下,容器会直接与宿主系统共享 IP 地址和网络。
主机模式小山觉得最有用的场景就是,Docker 的网络默认不支持 IPv6,配置起来很复杂,但是用主机模式,容器会直接与宿主系统共享 IP 地址,包括 IPv6。
主机模式下容器如果想对外提供服务,不需要任何的端口转发,直接运行,然后用宿主系统的 IP 进行访问就行了,端口会自动绑定,前提是宿主系统没有占用端口。
创建 Nginx 容器:sudo docker run -d --network host --name mivm nginx
,这次取消了端口转发,新增了--network
参数来指定网络,注意,--network
后面不是网络驱动的名称,而是网络的名称,如果想查看 Docker 可用的网络,可以运行sudo docker network ls
查看。
创建完成后,直接在浏览器输入宿主系统的 IP 就可以访问容器内的 Nginx,因为容器内 Nginx 的 80 端口已经默认绑定在了宿主系统的 IP 上。
主机模式一般情况下并不推荐使用,最好在需要的情况下再使用。
overlay
这个网络驱动小山觉得并不常用,也没用过,它貌似跟 Docker 集群有关,所以小山在这就不多做介绍了,有兴趣的小伙伴可以看下官方文档;https://docs.docker.com/network/overlay/
macvlan
这个网络驱动有点像虚拟机的桥接模式,注意这个桥接是指像 VMware 这类虚拟机的桥接网络模式,并不是指上面所说的 Docker 的桥接网络模式。
它可以让你的容器直接连接到你的物理网络,比如连接到你的路由器,让物理网络来提供 IP 地址和网络。
比如你可以给每个容器分配一个你的物理局域网的 IP 地址,这样方便管理,也可以用来做一些其他的事情,比如在 Docker 里运行 OpenWrt 做旁路由。
不过 Docker 默认并没有使用这个驱动创建网络,如果想使用它,需要自己创建一个基于 macvlan 的网络,很简单,一条命令就好。
创建一个名为 mvlan 基于 macvlan 的网络:sudo docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 mvlan
,--subnet
表示你物理网络可用的 IP 地址范围,如果你的局域网 IP 是 192.168.123.x,那就改成 192.168.123.0/24 就行,--gateway=
表示你的物理网络网关,一般是你的路由器 IP,parent=
表示你的物理网卡,大多数情况下都是eth0。
创建好以后,来测试下这个网络是否可用。
创建 Nginx 容器:sudo docker run -d --network mvlan --ip=192.168.1.66 --name mivm nginx
,这次将容器的网络改为了刚刚创建的 mvlan,并且指定了 IP 地址为 192.168.1.66。
如果一切正常,打开浏览器输入分配给容器的 IP 地址就可以访问容器内的 Nginx。
如果想删除创建的网络,使用命令sudo docker network rm <name>
,例如:sudo docker network rm mvlan
PS:这个模式小山没有在基于 Hyper-V 的虚拟机(桥接网络)上测试成功,但是在 N1 上是测试成功的。
以上就是 Docker 几种网络驱动的介绍,相信看了这篇文章,你已经可以在生产或测试环境里使用 Docker 了,下一篇文章我会教大家容器之间的连接。
微信扫描二维码关注我们
如果觉得文章有帮助到你,可以点击下方的打赏按钮赞助下服务器费用。
文章评论