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

涉及技术 Spring boot + Docker + Swarm mode + docker-registry + Rancher + Jenkins

一,准备

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

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

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

二,安装docker

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

  • 卸载旧版本

若是是新机器,以前没有装过就能够忽略这一步。docker

使用如下命令卸载旧版本:json

$ 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 官方为了简化安装流程,提供了一套便捷的安装脚本,依次在三台机器上进行这套脚本安装:ubuntu

$ 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 用户组。tomcat

 创建 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项目部署在这套环境中

相关文章
相关标签/搜索