您的位置:首页 > 运维架构 > Docker

Docker中的网络与数据管理(八)

2019-06-03 18:16 316 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/abandon77/article/details/90756663

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出现如下问题

解决方法:原因是网络不好,可以多试几次,或者换一个网速好的网络。
** 容器被关闭,需要启动命令

解决方法:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: