Docker中的网络管理和数据配置
一、Docker网络管理:
1.Docker默认网络管理
(1)在进行的docker安装时,docker就会自动创建三种网络。客户端可以通过网络管理执行进行查看。
#docker network ls。
其中名为bridge的网络就是默认的bridge驱动网络,也是容器创建时默认的网络管理方式,配置后可以与宿主机通信从而实现与互联网通信功能。
(2)默认的bridge网络管理方式实例演示
#创建并启动容器
#docker run -itd --name=networktest ubuntu
#使用网络查看指令查看网络详情
#docker network inspect bridge
上述指令用于核查名称为bridge的网络详情,需要指明网络名称或者网络ID。
2.自定义网络介绍
虽然docker提供的默认网络的使用比较简单,但是为了保证各容器中应用的安全性,在实际开发中庚推荐使用自定义的网络进行容器管理。
在docker中,可以自定义bridge网络,overlay网络,也可以创建network plugin(网络插件)或者远程网络以实现容器网络的安全定制和控制。接下来将分别针对这几种自定义网络进行讲解。
(1)Bridge networks(桥接网络)
为了保证容器的安全性,我们可以使用基于bridge的驱动创建新的bridge网络,这种基于bridge驱动的自定义网络乐意较好的实现容器隔离。
需要说明的是,这种用户自定义的基于bridge的驱动的网络对于单主机的小型网络环境管理是一个不错的选择,但是对于大型的网络坏境管理(如集群)就需要考虑使用自定义overlay集群网络。
(2)Overlay network in swarm mode(Swarm集群中的覆盖网络):
在docker swarm集群环境下可以创建基于overlay驱动的自定义网络。未来网保证安全性,swarm集群使自定义的overlay网络只适合需要服务的集群中的节点,而不会对外部其他服务或者docker主机开放。
(3)Custom network plugins(定制网络查件):
如果前面集中自定义网络都无法满足需求时,就可以使用docker提供的插件来自定义网络驱动插件。自定义网络查件会在docker进程所在主机上作为另一个运行的进程。
3.自定义bridge网络
(1)创建自定义网络:
#docker network create --driver bridge isolated_nw
说明:上述指令用于创建一个基于bridge驱动的名称为isolated_nw的网络。其中–driver用于指定网络驱动类型,isolated_nw就是新创建的网络名称。需要说明的是,–driver bridge可以省略,省略时docker会默认使用基于bridge驱动来创建新的网络。
(2)接下来通过docker inspect nwtest命令查看启动后的容器网络详情
提示:除docker network ls指令外,还可以使用docker network inspect指令查看新建网络的详细信息。
(3)使用自定义网络启动容器:
#docker run --network=isolated_nw -itd --name=nwtest busybox
说名:上述指令后,会创建一个名为nwtest的容器,指令中的–network参数指定了该容器的网络连接子弟定义的isolated_nw。
(4)查看启动后的容器情况:
#docker inspect nwtest
(5)为容器添加网络管理:
#docker network connect bridge nwtest
执行上述命令后,会为容器nwtest另添加一种默认的bridge网络管理方式。再次使用docker inspect nwtest指令查看该容器网络详情:
执行完为容器添加网络管理的指令后,容器nwtest就拥有了两种网络管理方式,分别为默认的bridge网络和自定义的is0lated_nw网络。
(6)断开容器网络连接:
#docker network disconnect isolated_nw nwtest
提示:一个容器可以有一到多个网络连接,当使用断开网络连接的指令将一个容器内的所有的网络连接方式全部断开后,虽然容器还在运行,但是容器内部的应用将无法被外界访问。
通过查看只剩余后来添加的bridge网络
(7)移除自定义网络:
#docker network rm isolated_nw
说明:执行上述命令后,就可以移除名称为isolated_nw的自定义网络。当网络移除成功后,会返回网络名称。
为了验证网络是否移除成功,可以使用docker network ls指令举例所有网络进一步确认:
4.容器之间的网络通信
docker容器之间网络通信演示查看
(1)创建容器:
创建两个使用默认的bridge网络的容器:
#docker run -itd --name=container1 busybox
#docker run -itd --name=container2 busybox
创建一个使用自定义的isolated_nw 网络(需要预先创建)的容器:
#docker run --network=isolated_nw -itd --name=container3 busybox
为container2容器新增一个自定义的isolated_nw 网络连接:
#docker network connect isolated_nw container2
说明:执行完前面3个步骤后,container1使用的是默认的bridge网络管理,container3使用的是自定义的isolated_nw网络管理,而container2使用的是默认的bridge网络管理和自定义的isolated_nw网络管理。
*container1和container2在同一个默认的bridge网络管理下,可以互相通信;
*container2和container3在同一个自定义的isolated_nw网络管理下,这两个容器也可以互相通信;
*container1和container3属于不同的网络环境,这两个容器无法进行通信。
(2)容器地址查
进入container2容器查看:
提示:使用docker attach指令进入容器内部后,可以在终端使用exit命令或者使用快捷键ctrl+q+p组合键退出当前容器,只不过在使用exit退出容器后,该容器就会停止运行,而使用ctrl+p+q组合键退出当前容器后,该容器会持续运行。
接下来进入容器container1,并通过ifconfig指令查看对应容器的IP地址:(container的IP地址为172.17.0.2)
进入容器container3,并通过ifconfig指令查看对应容器的IP地址:(container的IP地址为172.18.0.2)
(3)容器通信测试:
使用docker attach container1指令进入container1容器内部,使用ping指令连接container3来查看是否通信:
结果:在container1内部不管是用“ping -w 4 ip(-w限制响应四次),还是“ping -w 4容器名称”的指令都无法连通container3。这也就验证了两个容器不在同一个网络环境下,无法通信的判断。
使用docker attach container2指令进入container2容器内部,使用ping指令连接container3和container1来查看是否通信:
结果:在container2内部使用“ping -w 4 ip”的指令可以同时连通container1和container3,这也说明同一网络中容器可以通过IP进行通信。
使用docker attach container2指令进入container2容器内部,使用容器名称连接container3和container1来查看是否通信:
结果:在container2内部使用“ping -w 4 容器名称”的指令可以连通container3,而连接container1却显示“bad address ‘container1’”错误。
容器通信之间的结论:
*不同容器之间想要互相通信必须在同一个网络环境下;
*使用默认bridge网络管理的容器可以使用容器IP进行通信,但无法使用容器名称进行通信;
*使用自定义网络管理的容器则同时可以使用容器IP和容器名称进行通信。
二、Docker Swarm集群
1.Docker Swarm概述
(1)Docker swarm是一个用于创建和管理docker集群的工具。Docker1.12以及后续版本集成了swarmkit工具,该工具主要用于docker集群管理和容器编排,开发者可以不用安装额外的软件包,只需要使用简单的命令就可以创建并管理docker swarm集群。
(2)Docker swarm集群主要特点:
*方便创建和管理集群:docker swarm是docker源生的集群管理工具,可以直接使用docker客户端来创建并管理一个docker swarm集群,然后在其中部署应用程序服务,而不需要额外的编配软件来创建或管理集群。
*可扩展:对于集群中的每个服务,都可以声明要运行的副本任务数量,当向上或乡下进行扩展时,集群管理器将通过添加或删除副本任务来自动适应所需的状态。
*可实现期望的状态调节:集群管理节点不断监视集群状态,并协调实际状态和所期望状态之间的任何差异。例如,如果启动一个服务的10个副本服务,当一个docker节点承载其中两个副本奔溃时,那么管理器将创建两个新的副本来替换奔溃的副本。
*集群中多主机网络自动扩展管理:docker swarm为集群服务提供了一个覆盖网络,当它初始化或更新应用程序时,集群管理器会自动将在工作节点创建或更新网络来管理服务。
*提供服务发现功能:集群管理器节点为集群中的每个服务分配一个唯一的DNS名称,通过docker swarm集群提供的负载均衡功能,可以通过嵌入在集群中的DNS服务器来查询集群中运行的每个容器。
*可实现负载均衡:可以将容易中服务的端口暴露给外部负载均衡器,而在内部,集群允许指定如何在节点之间分配服务容器。
*安全性强:集群中的每个节点强制使用TLS相互认证和加密,以确保自身和其他节点之间的安全通信。除此之外,集群还支持使用自定义的自签名证书来保证安全。
*支持延迟更新和服务回滚:在进行服务更新时,可以将服务器更新逐步延伸到每个节点上,集群管理器允许服务部部署到不同节点组之间时出现延迟,如果某个节点出现问题,还可以将服务回滚带以前的版本。
2.Docker Swarm使用
Docker swarm集群实例演示:
(1)环境搭建:
准备3台Ubuntu系统主机(即可用与搭建间的3个docker机器),每台机器上都需要安装docker并且可以连接网络,同时要求docker版本都必须是1.12以上,因为老版本不支持docker swarm。
集群管理节点docker机器的IP地址必须固定,集群中的虽偶有节点都能够访问该管理节点。
集群节点之间必须使用相应的协议并保证其以下端口号可用。
Manager1:192.168.197.143(管理节点)
Worker1:192.168.197.144(工作节点)
Worker2:192.168.197.145(工作节点)
*用于集群管理通信的TCP端口2377;
*TCP和UDP端口7946,用于节点间的通信;
*UDP端口4799,用于覆盖网络流量。
(3)创建docker swarm集群:
在名为manager1的docker机器上创建docker swarm集群
#docker swarm init --advertise-addr 192,168.197.143
说明:执行上述指令后,docker就会自动在IP为192.168.197.143的机器上(也就是manager1机器上)创建一个swarm集群,并将该IP地址的机器设置为集群管理节点。需要说明的是,如果只是测试单节点的集群,直接使用docker swarm init指令即可。
在管理节点上,使用docker node ls指令查看集群节点信息
说明:此时只创建一个集群节点(默认为管理节点),而没有其他工作节点,因此只显示一条节点信息。
(4)向docker swarm集群添加工作节点:
启动另外两台docker机器worker1和worker2,分别打开终端窗口,执行向集群中加入工作节点的指令。
注意:上述指令中的–token参数表示向指定集群中加入工作节点的认证信息。读者在进行学习时,一定要使用自己在前面创建docker swarm集群时返回的向集群中添加工作节点的指令,而不是直接使用本书中的指令。如果已忘记添加到docker swarm集群的指令,可以在集群管理节点上执行“docker swarm join-token worker”指令进行查看。
再次在集群管理节点上使用docker node ls指令查看集群节点信息。
说明:从上图可以看出,集群节点列表中显示出了1个管理节点和2个工作节点,这说明swarm集群搭建成功。
在Docker Swarm上部署服务时,既可以使用DockerHub上自带的镜像来启动服务,也可以使用自己通过Dockerfile构建的镜像来启动服务(前提是自己的镜像必须先被推送到Docker Hub中心仓库),为读者方便学习,本例使用Docker Hub上自带的alpine镜像来部署服务,具体指令如下。
(5)查看docker swarm集群中的服务:
在管理节点上通过docker service ls指令查看当前集群中的服务信息
#docker service ls
使用docker service inspect指令,查看部署的服务具体详情
#docker service inspect helloworld
使用docker service ps指令查看指定服务在集群节点上的分配和运行情况
#docker service ps helloworld
(6)更改docker swarm集群服务副本数量:
说明:在集群中部署的服务,如果只运行一个副本,就无法体现出集群的优势,并且一旦该机器或副本奔溃,该服务将无法访问,所以通常一个服务会启动多个服务副本。
在管理节点manager1上,更改服务副本数量
#docker service scale helloworld=5
更改完成后,使用docker service ps查看这五个副本在3个节点上具体分布和运行情况
(7)删除服务:
对于不需要的服务,可以通过以下指令进行删除,在管理节点manager1上执行以下指令,该服务则会在集群中彻底被删除。
执行以上指令后,可以通过指令查看
(8)访问服务:
在集群管理节点manager1上,执行docker network ls指令查看网络列表:
#docker network ls
说明:与非集群环境下的docker网络对比,docker swarm集群网络列表中分别增加了一个以bridge和overlay为驱动的网络。在集群中发布服务时,如果没有指定网络,那么默认都是使用名为ingress网络连接的,而在实际开发中,则会使用自定义的overlay驱动网络进行服务管理。
在集群管理节点manager1上,创建以overlay为驱动的自定义网络:
#docker netwk create
–driver overlay
My-multi-host-network
在集群管理节点manager1上,再次部署服务:
在集群管理节点manager1上,使用docker service ps my-web指令查看服务的两个服务副本运行情况。
说明:从上图可以发现,该服务的两个副本任务呗随机分配到了manager1和worker2两台节点机器上,并已正常运行。
外界访问服务。打开浏览器,使用任意一台节点机器的“IP+8080”端口进行服务访问。都可以正常显示。
Manager1:
Worker1:
Worker2:
说明:从图可以看出,挡在任意节点上访问服务时,都可以正常访问部署的服务。这是由于集群负载均衡将请求路由到一个活动容器,从而实现容器内部服务的正常访问,这也体现出了docker swarm负载均衡这一特点。