Docker中的网络与数据管理(八)
Docker中的网络与数据管理(八)
学习目标
l 掌握 Docker的网络管理
l 掌握 Docker Swarm集群的使用
l 掌握 Volumes数据卷的使用
一.Docker的网络管理
1.默认网络管理
在进行Docker安装时,Docker就会自动创建三种网络(bridge、host、none)。客户端可以通过网络管理指令进行查看,具体操作指令如下。
$ docker network ls #列举docker中所有网络
图中名为bridge的网络就是默认的bridge驱动网络,也是容器创建时默认的网络管理方式,配置后可以与宿主机通信从而实现与互联网通信功能,而host和none属于无网络,容器添加到这两个网络时不能与外界网络通信。
- 1.创建并启动容器。
$ docker run -itd --name=networktest ubuntu
上述指令在后台启动了一个镜像名称为 ubuntu 的容器,并为启动后的容器命名为networktest。 - 2.使用网络查看指令查看网络详情。
$ docker network inspect bridge
上述指令用于核查名称为bridge的网络详情,需要指明网络名称或者网络ID。
从图中可看出,执行指令后就会显示出bridge网络的所有详细信息,其中就包括了使用默认的bridge网络管理方式启动的名称为networktest的容器。
需要注意的是,这里介绍的三种网络bridge、host 和none都是在非集群环境下Docker提供的默认网络,而在Docker Swarm集群环境下,除了这三种默认网络外,Docker 还提供了docker_gwbridge和ingress两种默认网络。
2.自定义网络介绍
为了保证各种容器中应用安全性,在实际开发中更推荐使用自定义的网络进行容器管理。在Docker中可以自定义bridge网络、overlay网络,也可以创建network plugin(网络插件)或者远程网络以实现容器网络的完全定制和控制。
- 1.Bridge networks (桥接网络)这种基于bridge驱动的用户自定义网络可以较好地实现容器隔离。需说明,这种网络对于单主机的小型网络环境管理是一个不错的选择,但对大型的网络环境管理(如集群)就需要考虑使用自定义overlay集群网络.
- 2.Overlay network in swarm mode ( Swarm集群中的覆盖网络)在Docker Swarm集群环境下可以创建基于overlay 驱动的自定义网络。为了保证安全性,这种只适用于需要服务的群集中的节点,而不会对外部其他服务或者Docker主机开放。
- 3.Custom network plugins (定制网络插件)若前面几种自定义网络都无法满足需求时,就可以使用Docker提供的插件来自定义网络驱动插件。自定义网络插件会在Docker进程所在主机上作为另一个运行的进程。与其他插件遵循相同的限制和安装规则,所有插件都使用Docker提供的插件API,并且有一个包含安装、启动、停止和**的生命周期。
3.自定义bridge网络(针对非集群环境下基于bridge驱动的自定义网络)
- 1.创建自定义网络。
在Docker主机上可以使用docker network create指令来创建网络。
$ docker network create --driver bridge isolated_nw
网络的名称为isolated_nw。其中–driver(可简写为-d)用于指定网络驱动类型,isolated _nw就是新创建的网络名称。需要说明的是,–driver bridge可以省略,省略时Docker会默认使用基于bridge 驱动来创建新的网络。
创建完网络后,可用$ docker network ls指令查看创建的网络是否成功。还可以使用docker network inspect指令查看新建网络的详细信息。
- 2.使用自定义网络启动容器
自定义网络创建成功后,就可以使用该网络启动一个容器。创建的容器名为nwtest,–network参数指定该容器网络连接为自定义的isolated_nw。
$ docker run --network=isolated_nw -itd --name=nwtest busybox
使用$docker inspect nwtest查看容器详情,核查其网络管理方式。
- 3.为容器添加网络管理
为名为nwtest的容器添加默认的bridge网络管理方式。
$ docker network connect bridge nwtest
- 4.断开容器网络连接
这里以断开nwtest容器的自定义网络isolated_nw为例进行演示。
$ docker network disconnect isolated_nw nwtest
———提示:一个容器可以有以到多个网络连接,当用指令将一个容器内所有的网络连接方式断开后,虽然容器还在运行,但是容器内部应用将无法被外界访问。 - 5.移除自定义网络(在4-1步骤之后再移除)
移除名称为iolated_nw的自定义网络。(移除网络之前,一定要先将所有与该网络连接的容器断开,可用$ docker network ls指令列举所有网络确认删除)
$ docker network rm isolated_nw
4.容器之间的网络通信
- 1.创建容器
**1.*创建两个(container1和container2)使用默认的bridge网络的容器。
$ docker run -itd --name=container1 busybox
$ docker run -itd --name=container2 busybox
**2.*创建一个(container3)使用自定义的isolated_nw网络(需要预先创建)的容器。
$ docker run --network=isolated_nw -itd --name=container3 busybox
** 3.*为container2容器新增一个自定义的isolated_nw网络连接。
$ docker network connect isolated_nw container2
container1使用的是默认的bridge网络管理,container2容器同时拥有了bridge 和isolated_nw两种网络管管理方式,此时,1和2,2和3可相互通信, 在不同网络环境的1和3不可以相互通信。 - 2.容器地址查看
**1. * 进入container2容器:$ docker attach container2
**2. * 使用ifconfig查看当前容器被动态分配的IP地址
**3. * 分别进入container1、container3,并用ifconfig查看IP地址
- 3.容器通信测试
**1. *先使用$ docker attach container1指令进入container1容器,“ping -w 4 IP”,“ping -w 4 容器名称”都无法连通container3——不在同一个网络环境。
**2. * 使用$ docker attach container2指令进入container2容器,“ping -w 4 IP”可以同时连通container1、container3——在同一个网络环境。
**3. *² “ping -w 4 容器名称”
通过前面的测试,我们得出结论:不同容器之间想相互通信必须在同一个网络环境下;使用默认bridge网络管理的容器可以使用容器IP进行通信,但无法使用容器名称进行通信;而使用自定义网络管理的容器则同时可以使用容器IP和容器名称进行通信。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
二.Docker Swarm集群
1.Docker Swarm概述。
Docker Swarm是一个用于创建和管理Docker集群的工具。Docker1.12以及后续版本集成了swarmkit工具,该工具主要用于Docker集群管理和容器编排。因此开发者只需要
- 1.方便创建和管理集群
- 2.可扩展
- 3.可实现期望的状态调节
- 4.集群中多个主机网络自动扩展管理
- 5.提供服务发现功能
- 6.可实现负载均衡
- 7.安全性强
- 8.支持延迟更新和服务回滚
2.Docker Swarm使用。
- 1.环境搭建
**1. *准备3台Ubuntu主机,安装了Docker(Docker1.12及以上版本),且能连网。
**2. *集群管理节点Docker机器的IP地址要固定,使集群中的所有节点都可访问。
**3. *集群节点之间必须使用相应的协议并保证其以下端口号可用:
用于集群管理通信的TCP端口2377;
TCP和UDP端口7946,用于节点间的通信;
UDP端口4789,用于覆盖网络流量;
修改IP后,需要重启网卡:$ /etc/init.d/networking restart 或者 ifdown+网卡名称—>ifup+网卡名称,若都不成功,则使用reboot命令重启虚拟机。修改三台虚拟机主机名(修改以下两个配置文件,并重启主机)
- 2.创建Docker Swarm集群
**1. *在名为manager1的Docker机器上创建Docker Swarm集群,如果只是测试单节点的集群,直接使用$ docker swarm init指令即可。$ docker swarm init --advertise-addr 192.168.26.6
创建集群后显示了两条指令,分别是在添加工作节点和管理节点时使用的。
**2. *在管理节点上,使用$ docker node ls指令查看集群节点信息。
此时只创建了一个集群节点(默认为管理节点),而没有其他工作号点,因此只显示一条节点信息。 - 3.向Docker Swarm集群添加工作节点
*1. 启动worker1和worker2,分别打开终端窗口,向集群中加入工作节点。
worker1:
worker2:
——添加的是manager1上创建集群时返回的向集群中添加工作节点的指令。需注意,上述指令中的–token 参数表示向指定集群中加入工作节点的认证信息。
**2. * 再次在集群管理节点上使用$ docker node Is指令查看集群节点信息。
- 4.向Docker Swarm集群部署服务
**1. *² 因为没有准备好的镜像,所以拉取镜像。使用的是Docker上自带的alpine镜像为例来部署集群服务。
$ docker pull alpine
**2. *使用Docker Hub上自带的alpine镜像为例来部署集群服务。
$ docker service create --replicas 1 --name helloworld alpine ping docker.com
- 5.查看Docker Swarm集群中的服务
*1. 当服务部署完成后,在管理节点上查看当前集群中的服务列表信息。
$ docker service ls
**2. * 查看部署的服务具体详情。
$ docker service inspect helloworld
**3. * 查看指定服务在集群节点上的分配和运行情况。
$ docker service ps helloworld
- 6.更改Docker Swarm集群服务副本数量
在集群中部署的服务,若只运行一个副本,就无法体现出集群的优势,且一旦该机器或副本崩溃,该服务将无法访问,所以通常一个服务会启动多个服务副本。
**1. *在管理节点manager1上,更改服务副本数量。
$ docker service scale helloworId=5
**2. * 查看这5个服务副本在3个节点上的具体分布和运行情况。(状态都是Running)
$ docker service ps helloworld
- 7.删除服务
$ docker service rm helloworld
(副本运行的节点上,仍需要一定的时间清除,可用docker ps查看)
- 8.访问服务
前面部署的服务都没有直接向外界暴露服务端口,外界也无法正常访问服务。接下来我们通过自定义overlay驱动网络为例在集群下的网络管理与服务访问。
**1. *在集群管理节点manager1上,查看网络列表。
$ docker network Is
与非集群环境下的Docker网络对比,Docker Swarm集群网络列表中分别增加了一个以bridge和overlay为驱动的网络。在集群中发布服务时,如果没有指定网络,那么默认都是使用名为ingress 网络连接的,而在实际开发中,则会使用自定义的overlay驱动网络进行服务管理。
**2. * 在集群管理节点manager1上,创建以overlay为驱动的自定义网络(my-multi-host-network)。
$ docker network create --driver overlay my-multi-host-network
**3. * 在集群管理节点manager1上,再次部署服务。
$ docker service create --network my-multi-host-network --name my-web --publish 8080:80 --replicas 2 nginx
–network参数:指定服务使用自定义的overlay 驱动网络my-mlti-host-network 连接;
–name 参数:指定服务启动后的名称;
–publish (也可以使用-p)参数:用于映射对外服务端口;
–replicas参数用于指定该服务的副本数量;
–nginx 表示是基于nginx镜像构建的服务。
——小提示:前几步虽只是在集群管理节点创建了自定义的overly驱动网络,但当管理节点的任务分配到某个集群中的工作节点时,该工作节点会自动创建对应的自定义网络,而当该工作节点上的任务被移除后,该自定义网络也随之移除。
**4. * 在集群管理节点manager1上,查看服务的两个服务副本运行情况。
$ docker service ps my-web
**5. * 外界访问服务(IP+8080)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
三.Volumes数据卷管理
1.Volumes数据卷
- 1.创建并管理数据卷
**1. * 创建名为my-vol的数据卷
$ docker volume create my-vol
**2. * 查看数据卷
$ docker volume ls
**3. * 检查数据卷
$ docker volume inspect my-vol
**4. * 删除数据卷
$ docker volume rm my-vol
- 2.启动容器并加载数据卷
前面单独使用docker volume数据卷管理指令演示了数据卷的基本操作,接下来将结合具体的容器演示如何在容器创建时配置并管理docker volume数据卷。
**1. *查看本机容器和数据卷
$ docker ps -a
$ docker volume ls
**2. * 确认查看本机Docker文件系统中的容器和数据卷切到root用户—>进入“/var/lib/docker”—>$ ll
**3. * 启动容器并挂载数据卷使用docker run创建并启动一个容器,同时挂载一个数据卷
$ docker run -d -it --name devtest --mount source=myvol,target=/app busybox:latest
也可以使用-v参数挂载数据卷
$ docker run -d -it --name devtest2 --v myvol:/app busybox:latest
**4. * 再次查看本机容器和数据卷列表
$ docker ps -a
$ docker volume ls
**5 . *检查容器详情
$ docker inspect myvol
**6. *再次确认本机Docker文件系统中的容器和数据卷切到root用户—>进入“/var/lib/docker”—>分别进入containers容器文件目录和volumes数据卷文件目录查看内容“$ ll”
出现的问题
**一—3—2出现如下问题
解决方法:原因是网络不好,可以多试几次,或者换一个网速好的网络。
** 容器被关闭,需要启动命令
解决方法:
上一篇: 机器学习其实比你想的更简单_PHP教程