微服务容器化构建改造(2)--环境搭建

882 阅读7分钟
涉及技术 Spring boot + Docker + Swarm mode + docker-registry + Rancher + Jenkins

一,准备

在安装之前,建议先多看下docker的相关文档,理解它的结构原理

(推荐一本书,Docker-从入门到实践)

3台centOS机器,内核版本不低于3.10(docker运行环境要求内核版本不低于3.10),3台机器先都分别叫test01(安装相关工具),test02(部署应用容器),test03(镜像私服仓库,如果使用公共仓库,可以忽略这台机器)。

二,安装docker

因为博主这边的机器都是基于centOS,所以今天就讲centOS安装docker的步骤,其它的另请百度。

  • 卸载旧版本

如果是新机器,之前没有装过就可以忽略这一步。

使用以下命令卸载旧版本:

$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engines
  • 使用脚本自动安装

在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,依次在三台机器上进行这套脚本安装:

$ curl -fsSL get.docker.com -o get-docker.sh 

$ sudo sh get-docker.sh --mirror Aliyun 

  • 启动Docker CE
$ sudo systemctl enable docker
$ sudo systemctl start docker
  • 建立docker用户组

默认情况下, docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。

 建立 docker 组:

$ sudo groupadd docker

将当前用户加入 docker 组:

$ sudo usermod -aG docker $USER

退出当前终端并重新登录 

  • 测试docker是否安装正确

$ docker run hello-world
Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world ca4f61b1923c: Pull complete Digest: sha256:be0cd392e45be79ffeffa6b05338b98ebb16c87b255f48e297ec7f98e123905c Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/
For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

若能正常输出以上信息,则说明安装成功 

  • 镜像加速

国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器

Docker 官方提供的中国 registry mirror https://registry.docker-cn.com

七牛云加速器 https://reg-mirror.qiniu.com/

DaoCloud加速 https://www.daocloud.io/mirror

 

三,安装Swarm mode 

Docker 1.12 Swarm mode 已经内嵌入 Docker 引擎,成为了 docker 子命令 docker swarm 。请注意与旧的 Docker Swarm 区分开来。 

Swarm mode 内置 kv 存储功能,提供了众多的新特性,比如:具有容错能力的去中心化设 计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。使得 Docker 原生的 Swarm 集群具备与 Mesos、Kubernetes 竞 的实力。 

  • 基本概念

Swarm 是使用 SwarmKit 构建的 Docker 引擎内置(原生)的集群管理和编排工具。使用 Swarm 集群之前需要了解以下几个概念。 

  • 节点

运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群, 这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 ( node ) 。节点分为管理 ( manager ) 节点和工作 ( worker ) 节点。

管理节点用于 Swarm 集群的管理, docker swarm 命令基本只能在管理节点执行(节点退出 集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节 点,但只有一个管理节点可以成为 leader , leader 通过 raft 协议实现。

工作节点是任务执行节点,管理节点将服务 ( service ) 下发至工作节点执行。管理节点默认 也作为工作节点。你也可以通过配置让服务只运行在管理节点。

来自 Docker 官网的这张图片形象的展示了集群中管理节点与工作节点的关系。 


  • 服务和任务

任务 ( Task )是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。
服务 ( Services ) 是指一组任务的集合,服务定义了任务的属性。服务有两种模式:

replicated services 按照一定规则在各个工作节点上运行指定个数的任务。

global services 每个工作节点上运行一个任务

两种模式通过 docker service create 的 --mode 参数指定。

来自 Docker 官网的这张图片形象的展示了容器、任务、服务的关系。

 

  • 创建Swarm集群

创建一个包含一个管理节点和两个工作节点的最小 Swarm 集群。 

我们准备把test01机器当作集群的管理节点,首先在test01上使用 docker swarm init 初始化一个 Swarm 集群。

$ docker swarm init --advertise-addr 192.*.*.*

然后输入以下内容

Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.To add a worker to this swarm, run the following command:
   docker swarm join \					--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743o
jnwacrr2e7c \    192.*.*.*:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the i
nstructions.

执行 docker swarm init 命令的节点自动成为管理节点。 

  • 增加工作节点

上一步我们初始化了一个 Swarm 集群,拥有了一个管理节点,下面我们继续分别在test02,test03两个 Docker 主机作为工作节点,并加入到集群中。 

docker swarm join \

--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743o					jnwacrr2e7c \
    192.168.99.100:2377

  • 查看集群 

经过上边的两步,我们已经拥有了一个最小的 Swarm 集群,包含一个管理节点和两个工作节 点。

使用 docker node ls 查看集群。 

$ docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
03g1y59jwfg7cf99w4lt0f662    worker2   Ready   Active
9j68exjopxe7wfl6yuxml7a7j    worker1   Ready   Active
dxn1zf6l61qsb1josjja83ngz *  manager   Ready   Active        Leader


四,安装私有镜像仓库docker-registry

如果没有需要使用私有镜像仓库的需求,可以忽略此步骤。

  • 启动docker-registry

前面讲到我这边有3台机器,这次我准备把镜像安装在test03机器上,执行以下命令,会启动一个registry容器,该容器用于提供私有仓库的服务

docker run --name docker-registry -d -p 5000:5000 registry

  • 执行docker ps命令看一下容器是否正常启动,对外提供服务通过5000端口映射到docker-registry的5000端口;
  • 在当前机器上执行命令curl -X GET http://127.0.0.1:5000/v2/_catalog,收到的响应如下,是个json对象,其中repositories对应的值是空的json数组,表示目前仓库里还没有镜像:

{"repositories":[]}

  • 支持http协议推送

此时镜像仓库已经安装完成,不过如果在其它机器test01,test02机器上进行把镜像往私服上推的时候就会提示https的错误,因为正常情况下,应用服务器推送镜像到仓库用的是https,此处我们通过命令行来测试推送用的是普通的http,所以需要修改docker的启动参数,使之允许以http协议工作;

然后此时你在网上搜镜像仓库支持http协议会搜出很多种解决方式,大多数都是讲先改/etc/default/docker文件,增加一行

DOCKER_OPTS="--secure-registry 192.*.*.*:5000"

然后再修改/lib/systemd/system/docker.service文件,增加

EnvironmentFile=-/etc/default/docker    
ExecStart=/usr/bin/dockerd -H

经过测试,这种方法没有用,具体原因应该和docker版本有关系。

后找到另一种方法,在test01,test02上修改/etc/docker/daemon.json文件,增加

"insecure-registries":["10.*.*.206:5000"]

然后执行下面的命令重启docker服务生效配置

systemctl daemon-reload;service docker restart

  • 测试

执行命令docker pull tomcat,从docker hub上下载最新版本的tomcat镜像,下载之后用命令docker images找到该镜像的id;然后执行下面命令给该镜像添加一个带私有仓库ip的TAG:

docker tag 3dcfe809147d 192.168.119.148:5000/tomcat

再执行docker images查看镜像的信息,会出现一个新的镜像,REPOSITORY是10.*.*.*:5000/tomcat

然后执行下面命令推送镜像:

docker push 10.*.*.*:5000/tomcat

推送成功之后,再返回到test03(镜像私服机器)执行curl -X GET http://127.0.0.1:5000/v2/_catalog,看能不能看到刚才推送上来的镜像,如果能看到就代表整个docker镜像私服就安装配置完成。


五,安装Rancher

Rancher是一个开源的企业级容器管理平台,这里就先不多做介绍,官网地https://www.cnrancher.com/

安装方式:官网有个快速入门文档,安装起来也比较简单,参考地址https://www.cnrancher.com/docs/rancher/v2.x/cn/overview/quick-start-guide/。

照着这个文档安装,执行到第4步登录rancher就可以。我这边在test01机器上安装的rancher,版本是v1.6.22,然后test01机器端口只放开了80端口,然后就在test01的nginx上配置了代理,域名是http://rancher.ngmm001.com

下面主要讲下rancher配置的步骤:

  • 创建环境

访问http://rancher.ngmm001.com,登录进来之后找到环境管理,点击添加环境:


环境模版选择Swarm,然后点击创建。

  • 添加主机

环境创建号之后,切换到刚才的环境,然后找到基础架构--->主机--->添加主机




然后把下面生成出来的脚本拷出来,这里有个前提,因为我这边rancher安装的机器只开放了80端口,然后通过nginx做的代理,域名是http://rancher.ngmm001.com,然后它自己生成出来的脚本是通过ip加端口,所以就对了这段脚本做了修改,修改如下(加黑部分为修改地方):

sudo docker run --rm --privileged --add-host rancher.ngmm001.com:10.171.173.20 -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/rancher:/var/lib/rancher rancher/agent:v1.2.11 http://rancher.ngmm001.com/v1/scripts/783A8F43B494C806F646:1514678400000:XosZa0a4FVTAwaS0WdRTV52i7U

然后把这个脚本,分别在需要test02,test03机器上执行,执行成功之后就可以在主机列表中看到对应的机器,以及机器运行的一些情况监控,和docker容器的状态



这一步成功之后,环境搭建这部就算完成了80%,后面的几篇文章会持续更新安装jenkins,和以及怎么把spring boot项目部署在这套环境中