作者按:尽管很多公司已经都使用k8s方便管理了各种容器应用,但作为一个容器管理者,需要了解其中网络如何运作,前面已经介绍了K8s中的网络,这里就来研究下docker容器中的网络配置。
1、查看默认网络模式
首先假定已经安装好docker了,不会安装的可以看我其他文章,很简单。docker安装好后默认是提供三种网络模式,可以使用命令docker network ls查看网络状态
docker底层使用LXC实现,LCX就是一种轻量级虚拟化,将linux进程沙盒化。使用的是linux中的namespace技术进行资源隔离,pid namespace隔离了进程,mount namespace隔离了文件系统,network namespace隔离了网络。而网络方面,宿主机中虚拟一个docker容器网桥,docker启动一个容器时会根据docker网桥的网段分配给容器一个ip地址,叫container-ip,这个虚拟的docker网桥也是每个容器的默认网关,因为在同一宿主机中的容器都接入的是同一个虚拟网桥,这样就达到了容器之间通过container-ip进行互相通信。
2、docker的网络模式
host:相当于玩虚拟机时,网络为桥接模式,就是和宿主机在一个网络中,没有独立的ip。就是容器和宿主机共享网络命名空间,network namespace,直接使用宿主机的ip和端口。
none: 容器有独立的network namespace,但没有任何网络设置,比如网桥连接、ip配置等
bridge:这种也是docker默认的网络模式
container:指定新容器和其他已经存在的容器共享一个网络命名空间,不是和宿主机共享。
3、关于bridge模式
相当于虚拟机中的NAT模式,容器有独立的命名空间。docker进程启动后,主机上会创建一个名为docker0的虚拟网桥,然后主机上启动的docker容器会连接到这个虚拟网桥上。虚拟网桥工作方式和物理交换机类似,这样主机上的所有容器通过这个交换机连在了一个二层网络中,容器间就可以互相通信。
docker0子网中分配一个ip给容器使用,设置docker0的ip地址为容器默认网关,主机上创建一堆虚拟网卡配对设备vteh pair,一端在新创建的容器中,命名为eth0,,另一端在主机中,以veth类似的名字命名,将这个网络设备放到docker0网桥中,可以通过ip ad查看
如图所示,(图来自网络,仅供学习)
注意:
docker0网桥是宿主机虚拟出来,不是真实存在的网络设备,外网无法寻址访问,就是说没有办法直接通过continer-ip访问到容器,那么怎么办,就是需要将容器的端口映射到宿主机,在docker run 创建容器的时候通过-p参数启用,向外部暴露容器服务,这样就可以通过宿主机ip:容器端口访问容器应用
通过命令查看bridge网络详细信息
docker network inspect bridge
查看容器网络命令可以进容器看,也可以用如下命令
docker inspect containerid
4、关于host模式
host模式,就是容器不会有一个独立网络命名空间,直接和宿主机共用一个网络命名空间,不会虚拟出自己的网卡,配置ip等。但是容器内的进程以及文件系统还是和宿主机隔离的。
直接使用宿主的IP地址和外界通信,容器内部端口可以使用宿主端口,不需要进行NAT,优势就是网络性能好,但是网络隔离性不好,容器使用的端口就不能再用了。
图来自网络
5、关于none模式
这种模式,就是容器有自己的网络命名空间,但是容器没有任何网络设置,docker容器没有网卡、ip、路由等信息,需要自己添加网络配置,这种模式下只有lo会换网络,可以在创建时添加参数—network none指定,这种模式没法联网,优势就是能保证容器的安全性。
6、docker一般网络设置
docker run –name cillian –network 参数
一般默认会使用bridge模式,但也可以通过命令参数在创建时指定—network host/none
设置主机名 –hostname cillian
设置DNS –dns 8.8.8.8
设置解析 –add-host cillian.sapce:127.0.01
设置端口映射:-p 80 容器80端口映射到宿主机随机端口 -p 80:80 宿主机80端口映射到容器80
-p 宿主机ip::80 容器80端口映射到指定ip的动态端口
自定义网桥:编辑/etc/docker/daemon,json文件
核心配置bip ,就是bridge ip的意思,指定docker0虚拟网桥自身的IP地址
至此,对于docker网络有了初步的了解,赶快去实践吧,祝学习顺利!