Swarm安装与应用

一、Docker简介

1.1、什么是docker

docker的英文意思是 码头工人,意思就是搬运东西的意思,这和docker的特点是一样的,docker提供的就是一种容器化搬运东西(我们的软件、程序)的过程。docker自己本来是运行在操作系统上一个程序软件,它会提供一个容器环境,使我们的程序独立地运行在容器中。

当我们把我们的web网站做成分布式的时候,就需要加服务器,然后在各个服务器配置web所需要的配置,比如:数据库、web服务器。这样的我们的网站才能跑起来,但是每当我们加服务器的时候,我们都要再重新配置一下,很繁琐,有了docker,我们就可以把我们的网站和所需要的环境配置好,打成一个包(docker镜像),然后在服务器上安装docker,用docker拉取打包好的镜像,直接运行容器就行了,更加的便于管理,镜像中修改配置,重新更新,所有的容器就也能修改了,我们的网站也就修改更新了。

1.2、docker和虚拟机

docker是和虚拟机是类似的东西,我们应该知道虚拟机就是在我们的操作系统上虚拟出来一个电脑,然后里边可以安装、运行各种各样的软件,和我们真的电脑是差不多的,我们可以拿着这个虚拟好的电脑(其实是一个文件)在按了虚拟机的其他电脑上可以直接运行,里边的东西就不用我们来回安装和配置了,也是很方便的。docker其实提供的也是这么一种的技术,只不过它比虚拟机效率更加的高,启动快,占用资源小等一系列的优点,而且虚拟机比较笨重,这是因为虚拟机和docker来实现思想上有本质的区别,我们可以通过下边的两张图可以对比一下:

虚拟机的运作原理:是虚拟电脑的硬件资源,把硬件资源分配出来,然后虚拟出来多个操作系统,虚拟出来的是一个完整的电脑。

docker的运作原理:虚拟的软件资源,把电脑中的网络、存储啥的分成几份虚拟成容器,我们的软件运行在容器中,每个容易只占用电脑的部分所需要的资源,并不是一个完整的电脑。

二、Docker的安装

从网络上下载Docker的依赖库,使得docker可以在虚拟机上运行:

 下载docker的镜像,这里采用的是阿里云镜像:

在虚拟机上安装docker镜像:

启动docker,准备进行操作: 

三、Swarm试用 

3.1、创建集群

使用 Docker Machine 创建一个虚拟机作为 manger 节点:

[root@ZhaiXin ~]docker-machine create --driver virtualbox manager1                                    
Running pre-create checks...
(manager1) Unable to get the latest Boot2Docker ISO release version:  Get https://api.github.com/repos/boot2docker/boot2docker/releases/latest: dial tcp: lookup api.github.com on [::1]:53: server misbehaving
Creating machine...
(manager1) Unable to get the latest Boot2Docker ISO release version:  Get https://api.github.com/repos/boot2docker/boot2docker/releases/latest: dial tcp: lookup api.github.com on [::1]:53: server misbehaving
(manager1) Copying /home/zuolan/.docker/machine/cache/boot2docker.iso to /home/zuolan/.docker/machine/machines/manager1/boot2docker.iso...
(manager1) Creating VirtualBox VM...
(manager1) Creating SSH key...
(manager1) Starting the VM...
(manager1) Check network to re-create if needed...
(manager1) Found a new host-only adapter: "vboxnet0"
(manager1) Waiting for an IP...
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env manager1

查看虚拟机的环境变量等信息,包括虚拟机的 IP 地址:

[root@ZhaiXin ~]docker-machine env manager1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/home/zuolan/.docker/machine/machines/manager1"
export DOCKER_MACHINE_NAME="manager1"
# Run this command to configure your shell: 
# eval $(docker-machine env manager1)

然后再创建一个节点作为 work 节点:

[root@ZhaiXin ~]docker-machine create --driver virtualbox worker1

现在我们有了两个虚拟主机,但是目前这两台虚拟主机并没有什么联系,为了把它们联系起来,这时需要 使用Swarm 。执行 docker swarm 即可操作虚拟机。

把 manager1 加入集群:

[root@ZhaiXin ~]docker-machine ssh manager1 docker swarm init --listen-addr 192.168.99.100:2377 --advertise-addr 192.168.99.100
Swarm initialized: current node (23lkbq7uovqsg550qfzup59t6) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-3z5rzoey0u6onkvvm58f7vgkser5d7z8sfshlu7s4oz2gztlvj-c036gwrakjejql06klrfc585r \
    192.168.99.100:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

用 --listen-addr 指定监听的 ip 与端口:

[root@ZhaiXin ~]docker swarm init --listen-addr <MANAGER-IP>:<PORT>

再把 work1 加入集群中:

[root@ZhaiXin ~]docker-machine ssh worker1 docker swarm join --token \
    SWMTKN-1-3z5rzoey0u6onkvvm58f7vgkser5d7z8sfshlu7s4oz2gztlvj-c036gwrakjejql06klrfc585r \
    192.168.99.100:2377
This node joined a swarm as a worker.

集群初始化成功,我们新建了一个有两个节点的“集群”,现在进入其中一个管理节点使用 docker node 命令来查看节点信息:

[root@ZhaiXin ~]docker-machine ssh manager1 docker node ls
ID                       HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
23lkbq7uovqsg550qfzup59t6 *  manager1    Ready      Active         Leader
dqb3fim8zvcob8sycri3hy98a    worker1     Ready      Active

继续新建虚拟机 manger2、worker2、worker3,总共得到五个虚拟机,并把剩余的虚拟机也加到集群中。

查看集群信息:

[root@ZhaiXin ~]docker-machine ssh manager2 docker node ls
ID                            HOSTNAME   STATUS   AVAILABILITY   MANAGER STATUS
16w80jnqy2k30yez4wbbaz1l8     worker1     Ready     Active        
2gkwhzakejj72n5xoxruet71z     worker2     Ready     Active        
35kutfyn1ratch55fn7j3fs4x     worker3     Ready     Active        
a9r21g5iq1u6h31myprfwl8ln *   manager2    Ready     Active        Reachable
dpo7snxbz2a0dxvx6mf19p35z     manager1    Ready     Active        Leader

3.2、建立跨主机网络

将宿主机加入集群得到六个虚拟机以便更加清晰地使用命令。

查看网络状态:

[root@ZhaiXin ~]docker network ls
NETWORK ID         NAME            DRIVER          SCOPE
764ff31881e5        bridge          bridge          local                  
fbd9a977aa03        host            host            local               
6p6xlousvsy2        ingress         overlay         swarm            
e81af24d643d        none            null            local

可以看到在 swarm 上默认已有一个名为 ingress 的 overlay 网络, 默认在 swarm 里使用,本例子中会创建一个新的 overlay 网络。

[root@ZhaiXin ~]docker network create --driver overlay swarm_test
4dm8cy9y5delvs5vd0ghdd89s
$ docker network ls
NETWORK ID         NAME                DRIVER              SCOPE
764ff31881e5        bridge              bridge              local
fbd9a977aa03        host                host                local
6p6xlousvsy2        ingress             overlay             swarm
e81af24d643d        none                null                local
4dm8cy9y5del        swarm_test          overlay             swarm

这个网络只是处于待机状态,下一小节我们会在这个网络上部署应用。

3.3、在跨主机网络上部署应用

在五个节点部署一组 Nginx 服务,部署的服务使用 swarm_test 跨主机网络:

[root@ZhaiXin ~]docker service create --replicas 2 --name helloworld --network=swarm_test nginx:alpine
5gz0h2s5agh2d2libvzq6bhgs

查看服务状态:

[root@ZhaiXin ~]docker service ls
ID            NAME        REPLICAS  IMAGE         COMMAND
5gz0h2s5agh2  helloworld  0/2       nginx:alpine  

查看 helloworld 服务详情:

[root@ZhaiXin ~]docker service ps helloworld
ID          NAME          IMAGE         NODE      DESIRED STATE   CURRENT STATE              ERROR
ay081uome3   helloworld.1  nginx:alpine  manager1  Running         Preparing 2 seconds ago  
16cvore0c96  helloworld.2  nginx:alpine  worker2   Running         Preparing 2 seconds ago

进入两个节点,查看服务状态:

[root@ZhaiXin ~]docker-machine ssh manager1 docker ps -a
CONTAINER ID   IMAGE         COMMAND         CREATED        STATUS         PORTS            NAMES
119f787622c2   nginx:alpine  "nginx -g ..."   4 minutes ago  Up 4 minutes   80/tcp, 443/tcp  hello ...
$ docker-machine ssh worker2 docker ps -a
CONTAINER ID   IMAGE         COMMAND         CREATED         STATUS        PORTS             NAMES
5db707401a06   nginx:alpine  "nginx -g ..."   4 minutes ago   Up 4 minutes  80/tcp, 443/tcp   hello ...

首先使用 Machine 进入 manager1 节点,然后使用 docker exec -i 命令进入 helloworld.1 容器中 ping 运行在 worker2 节点的 helloworld.2 容器。

[root@ZhaiXin ~]docker-machine ssh manager1 docker exec -i helloworld.1.ay081uome3eejeg4mspa8pdlx \
    ping helloworld.2.16cvore0c96rby1vp0sny3mvt
PING helloworld.2.16cvore0c96rby1vp0sny3mvt (10.0.0.4): 56 data bytes
64 bytes from 10.0.0.4: seq=0 ttl=64 time=0.591 ms
64 bytes from 10.0.0.4: seq=1 ttl=64 time=0.594 ms
64 bytes from 10.0.0.4: seq=2 ttl=64 time=0.624 ms
64 bytes from 10.0.0.4: seq=3 ttl=64 time=0.612 ms
^C

然后使用 Machine 进入 worker2 节点,然后使用 docker exec -i 命令进入 helloworld.2 容器中 ping 运行在 manager1 节点的 helloworld.1 容器。

[root@ZhaiXin ~]docker-machine ssh worker2 docker exec -i helloworld.2.16cvore0c96rby1vp0sny3mvt \
    ping helloworld.1.ay081uome3eejeg4mspa8pdlx 
PING helloworld.1.ay081uome3eejeg4mspa8pdlx (10.0.0.3): 56 data bytes
64 bytes from 10.0.0.3: seq=0 ttl=64 time=0.466 ms
64 bytes from 10.0.0.3: seq=1 ttl=64 time=0.465 ms
64 bytes from 10.0.0.3: seq=2 ttl=64 time=0.548 ms
64 bytes from 10.0.0.3: seq=3 ttl=64 time=0.689 ms
^C

可以看到这两个跨主机的服务集群里面各个容器是可以互相连接的。

四、Docker Swarm优点总结

通过以上操作,可以看到Docker Swarm有六大优点。

4.1、更高效的利用系统资源

docker对系统资源的利用率更高,无论是应用执行速度,内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机往往可以运行更多数量的应用。

4.2、更快速的启动时间

传统的虚拟机技术启动应用服务往往需要数分钟,而docker容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级,甚至毫秒级的启动时间,大大的节约了开发测试,部署的时间。

4.3、一致的运行环境

开发过程中常见的一个问题是环境一致问题,由于开发环境,测试环境,生产环境不一致,导致有些bug并未在开发过程中发现。而docker的镜像提供了除内核外完整的运行时环境,确保环境一致性,从而不会在出现“这段代码在我机器上没问题”这类问题。

4.4、持续支付和部署

对开发和运维人员来说,最希望就是一次创建和部署,可以在任意的地方运行。(定制应用镜像来实现集成、持续支付、部署。开发人员可以通过dockerfile来进行镜像构建,并结合持续集成系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署系统进行自动部署)。而且使用dockerfile使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。

4.5、更轻松的迁移

由于docker确保了执行环境的一致性,使得应用的迁移更加的容易。docker可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云、甚至是笔记本、其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。

4.6、更轻松的维护和拓展

docker使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得十分简单。此外,docker团队同各个开源项目团队一起维护了一大批高质量的官网镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值