简介:Docker是一个基于虚拟化技术的容器,基于Go语言开发。Docker可以将应用程序打包封装到一个容器中,该容器包含了应用程序的代码、依赖库、运行环境、配置文件等必需的资源,通过容器就可以实现方便快速自动化部署,无论你部署时的环境如何,容器中的应用程序都会运行在同一种环境下。目前大量的互联网应用服务包含多个服务组件,这些组件都可以部署在Docker容器中,需要多个容器之间通过网络通信进行相互配合。Docker 目前提供了映射容器端口到宿主主机和容器互联机制来为容器提供网络服务。
本文将介绍Docker的网络功能,包括使用端口映射机制来将容器内应用服务提供给外部网络,以及通过容器互联系统让多个容器之间进行快捷的网络通信。
详细内容请参考下文。
一、Docker的四种网络模式
说明:在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式:
· host模式,使用--net=host指定;
· container模式,使用--net=container:NAME_or_ID指定;
· none模式,使用--net=none指定;
· bridge模式,使用--net=bridge指定,默认设置。
1、host模式
Docker使用了Linux的Namespaces技术来进行资源隔离,如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
2、host模式
这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
3、none模式
在这种模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
4、bridge模式
网桥模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。
二、Bridge网桥模式
说明:当Docker 服务启动时,会在主机上创建一个名为docker0的虚拟网桥,该主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配IP了,Docker会从RFC1918所定义的私有IP网段中,选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从这个子网中选择一个未占用的IP使用。如一般Docker会使用172.17.0.0/16这个网段,并将172.17.42.1/16分配给docker0网桥(在主机上使用ifconfig命令是可以看到docker0的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)。
1、Docker单机环境下的网络拓扑如下
说明:单机模式的主机地址为172.16.*.*/24
2、Docker容器的bridge模式原理图如下
三、Bridge模式下容器的网络通讯
说明:在正常情况下, bridge模式中连在同一网桥上的容器可以相互通信(若出于安全考虑,也可以禁止它们之间通信,方法是在DOCKER_OPTS变量中设置--icc=false,这样只有使用--link才能使两个容器通信)。
注意:默认情况下,/etc/default/docker配置了不会生效的,需要手动添加到docker的环境设定中,需要配置的文件是/usr/lib/systemd/system/docker.service,需要添加EnvironmentFile=-/etc/default/docker,让后在ExecStart这个配置中,添加引用的参数$DOCKER_OPTS。
1、执行指令# route查看主机上的路由
2、修改容器的IP地址
说明:Docker容器启动后,默认是的IP地址是172.17.0.0/24,这个地址跟局域网有冲突,因此需要修改才能正常访问。
Docker的ip地址文件所在位置/var/lib/docker/containers/容器ID/hostconfig.json
执行指令# vim hostconfig.jason修改ip地址
修改HostIp和HostPort,若绑定0.0.0.0,则HostIp改为空就行。例:{"HostIp":"","HostPort":"445"}
修改后重启Docker服务器和相应的容器samba
执行指令# docker stop samba停止samba容器
执行指令# systemctl stop docker停止Docker
执行指令# systemctl start docker启动Docker
执行指令# docker start samba启动samba容器
执行指令# docker port samba查看端口映射情况
注意:顺序,先停止samba容器,再停止docker服务。修改完,先启动docker服务,再启动samba容器。