内容尚不完善,做做记录
关键组成部分
- 操作系统CentOS7
- 容器运行环境Docker
- 远端版本控制代码仓库Gitlab
- 持续集成工具Gitlab-runner
- 私有镜像仓库Harbor
- 镜像管理Rancher
- 微服务注册中心与配置中心jhipster-registry
- 微服务网关jhipster-gateway
未来默认配置
- Harbor的GUI操作地址端口:10.101.88.101:8088
- Rancher的GUI操作地址端口:10.101.88.102:8080(只能)
- Gitlab地址:10.101.88.100:8081
- registry:8761
- gateway:80
一、操作系统安装+操作
- 至centOS官网下载centOS7安装包进行安装(操作系统操作不再赘述,默认已经会一些基础的Linux系统操作)
二、Docker安装、配置、操作
2.1 说明(方便理解)
- 是什么?
- 是一个开源的应用容器引擎,简单可类比为一整个打包、开箱使用的过程
- 为什么要使用?运行原理?
- 开发者可以将自己通过各种技术开发的应用+所依赖的软件包、环境一并打包起来成一个docker镜像,然后在任何装有docker引擎的地方运行。
- 优点?
- 由于其基于LXC的轻量级虚拟化的特点(可理解为运行时只运行一套应用所需最基础的内容环境,不需要像传统部署应用一样在硬件上先运行操作系统、再运行操作系统内其他基础服务、再运行运行环境、再运行我们开发的应用),docker相比KVM之类最明显的特点就是启动快,资源占用小。类比:一次打包应用和所依赖环境配件成一个集装箱发货(而且里面没有其他无关杂货),收货开箱即用,也正如docker这个单词的意思
- 版本支持
- 在CentOS6.8是可以支持docker,但是有些特性无法使用,因此至少使用3.8的内核版本,建议是使用3.10版本以上。国内生产环境很多都是使用CentOS,所以一般使用CentOS7即可。当然如果是Ubuntu/Debian/Deepin系列的发行版本也是支持的。
- 软件源和镜像源
- 许多软件源等资源服务器在国外一般速度都很慢,这里将docker的软件源设置成阿里的,并且未来使用的一些镜像源也会设置成阿里的(速度快而且和国外服务器版本同步做的挺好)
2.2 安装(默认采用root用户权限)
-
docker依赖于系统的一些必要的工具,可以提前安装
yum install -y yum-utils device-mapper-persistent-data lvm2
设置软件源(阿里云)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
安装docker社区版
yum -y install docker-ce
-
启动docker服务
systemctl start docker
-
查看版本方式
docker version
2.3 配置
设置镜像源(阿里),下载一些公共镜像会快些
打开阿里云——>在所有功能里面进入容器镜像服务——>镜像加速器
找到专属的镜像加速器地址类似:https://------.mirror.aliyuncs.com 复制
-
修改docker的一项配置文件(这里采用vim编辑器进行编辑,使用root用户权限)
vim /etc/docker/daemon.json
-
添加如下内容(如果已经有,则将连接粘贴进去列表即可):
{ "registry-mirrors":[ "https://------.mirror.aliyuncs.com" (如果要指定自己的其他镜像仓库还可继续在这个列表添加) ] }
设置允许使用不安全的源(比如自己搭建的未使用https的),因为新版docker默认使用https,不设置会报错
-
如上在 /etc/docker/daemon.json文件内加入以下内容:
{ "insecure-registries":["ip/域名:端口"] }
-
以上两个内容操作完务必重新加载配置并重启docker
systemctl daemon-reload systemctl restart docker
新装docker可能遇到"can not connect to docker daemon at unix:///----------",解决方法:执行重新加载配置并重启docker,操作在设置镜像源中最后一步。
2.4 基本常用操作
打包镜像
-
拉取镜像
docker pull ip:port/镜像路径+名
-
保存镜像为本地压缩文件(用于手动转移)
docker save ip:port/镜像路径+名 -o /本地路径.../fileName.tar
-
加载镜像文件
docker load
运行镜像
2.5 Dockerfile
dockerfile是用于制定镜像的文本文件,内部定义了各类用于制定一个镜像所需要的命令,最后由docker build指令读取并打包定制完成这个镜像。
2.6docker-compose工具
- Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。用户可以在docker-compose.yml内预先配置整个系统需要用到的各个docker镜像容器信息、配置信息、运行环境变量等,并使用本工具的docker-compose命令创建和启动定义好的所有镜像容器服务。可以顺便也装上,后期harbor会使用
2.6.1安装和使用
-
官方文档
https://docs.docker.com/compose/install/
-
安装下载最新二进制文件到/usr/local/bin目录下(此目录是直接可运行目录放这里就不用做软连接)
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" \ -o /usr/local/bin/docker-compose
-
添加执行权限
sudo chmod +x /usr/local/bin/docker-compose
-
运行命令查看版本,测试可用性
docker-compose --version
三、GitLab安装、运行、配置
3.1 说明
- Gitlab是一个开源的远端代码托管工具平台,功能和github、gitee等,但由于开源,可以被大家自行修改、部署应用,一般被企业用来做自己内部的代码托管平台
- 这里也是看中了gitlab比较出色的持续集成工具
3.2 安装并运行(由于已经安装docker,所以可以直接拉取gitlab发布的镜像即可开箱即用、包括其需要的其他组件)
-
官网文档:
https://docs.gitlab.com/omnibus/docker/README.html
-
注释:
-d 后台运行仅返回一个容器id,这样避免终端接下来进入某个运行镜像的交互 --name 给docker运行容器名 --env 环境变量 --volume(-v) 挂载数据(为了把容器内数据持久化到宿主机不丢失) 宿主机的某个路径:容器内部的使用路径 --link 服务连接 目标服务的服务名(自己取的):默认服务名 --publish(-p) 端口映射 宿主机端口:容器内运行端口 --restart always 自动重启(看情况使用,万一存在服务连接,则关注启动的先后顺序)
-
安装Gitlab所需要的组件 postgresql、redis
docker run --name gitlab-postgresql -d \ --env 'DB_NAME=gitlabhq_production' \ --env 'DB_USER=gitlab' \ --env 'DB_PASS=password' \ --volume /home/ws/docker/volumes/gitlab/postgresql:/var/lib/postgresql \ sameersbn/postgresql:9.4-12 docker run --name gitlab-redis -d \ --volume /home/ws/docker/volumes/gitlab/redis:/var/lib/redis \ sameersbn/redis:latest
-
安装Gitlab
docker run --name gitlab -d \ --link gitlab-postgresql:postgresql \ --link gitlab-redis:redisio \ --publish 10022:22 \ --publish 8081:8081 \ --publish 4431:443 \ --volume /home/ws/docker/volumes/gitlab/gitlab/log:/var/log/gitlab \ --volume /home/ws/docker/volumes/gitlab/gitlab/opt:/var/opt/gitlab \ --volume /home/ws/docker/volumes/gitlab/gitlab/conf:/etc/gitlab \ gitlab/gitlab-ce:latest
3.3 访问和配置
-
运行后打开xx.xx.xx.xx:8081(服务器地址)发现是打不开的,因为我们只是把内部8081地址映射了出来,实际上内部运行监听的端口是默认80
-
解决办法:更改挂载目录下的girlab.rb文件,做如下修改,即可正常访问
nginx['listen_port'] = 8081
-
-
运行后发现项目的git地址是容器id,并不是正确的地址
-
解决办法:更改挂载目录下的girlab.rb文件,做如下修改,修改容器内的运行端口,由于上面已经做了映射,所以即可正常访问
external_url 'http://xx.xx.xx.xx:8081'
-
顺便加入以下配置,更改ssh访问方式端口
gitlab_rails['GITLAB_SHELL_SSH_PORT'] = 8081
-
-
重启容器
docker restart gitlab
四、GitLab-runner安装、配置
4.1 说明
- gitlab-ci持续集成功能借助于gitlab-runner执行更优
4.2 安装与运行
-
拉取并运行
docker run --name gitlab-runner -d \ --restart always \ --volume /home/ws/docker/volumes/gitlab/runner:/etc/gitlab-runner \ --volume /var/run/docker.sock:/var/run/docker.sock \ gitlab/gitlab-runner:latest
-
此处的挂载十分重要!!--volume /var/run/docker.sock:/var/run/docker.sock!!由于采用了docker作为执行器,runner在执行时会运行docker命令。然而我们采用了docker环境下安装runner,runner在自己的容器内没有docker环境从而不能运行docker,会进行报错Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
解决:让runner通过某种方式在宿主机运行docker命令。由于docker命令实质上是访问本地/var/run/docker.sock路径进行的一次请求(可以参考官方文档),那么我们只需要吧宿主机的/var/run/docker.sock路径和runner容器内/var/run/docker.sock路径挂载就可以巧妙解决这个问题
-
由此引发!!!runner采用docker安装时会配置默认镜像,然而,这个默认镜像在运行时也会用到docker命令,但是它的内部没有,所以比如在runner运行打包docker镜像的时候常常会报错:I/O exception (java.io.IOException) caught when processing request to {}->unix://localhost:80: No such file or directory
解决:配置runner的配置文件config.toml中的默认镜像挂载:/var/run/docker.sock:/var/run/docker.sock
-
4.3 配置(这里使用全局配置一个共享的runner)
打开gitlab用root用户登录->设置->Overview->Runners
关闭系统防火墙、注意gitlab和gitlab-runner的版本匹配问题(全部安装最新的一般没问题),以避免注册失败
-
注册成为gitlab所使用的runner
docker exec -it gitlab-runner gitlab-ci-multi-runner register
-
这里将产生交互式操作,以进行配置,按照提问填入相应内容即可,部分内容来自之前打开的页面
**Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):-------填gitlab的访问地址** http://10.101.80.101:8081/ **Please enter the gitlab-ci token for this runner:-------填页面上第三点的token** B9jx_m2wGzyzTz****之类 **Please enter the gitlab-ci description for this runner::-------填描述** 随便填 **Please enter the gitlab-ci tags for this runner (comma separated):-------填标签(注意这个tag需要在以后项目的.gitlab-ci.yml文件中指定,以便指定使用哪一个runner)** 随便填 **Please enter the executor: kubernetes, custom, docker, shell, virtualbox, docker-ssh+machine, docker-ssh, parallels, ssh, docker+machine::-------执行方式,这里一般使用docker,其支持功能更强大,具体参考官方文档表格中的列举** docker **please enter the default Docker image (e.g. ruby:2.6)::-------默认镜像,这里可以随便填一个docker镜像比如openjdk:8,这是防止在未来的gitlab-ci.yml文件里面漏填了image参数** openjdk:8
至此一个共享的runner创建完成
注意:在设置中runner的tag选项,如果在gitlab-ci.yml中没有指定tag,则需要把tag选项允许无标记的作业,才能被使用
4.4 Maven的优化配置
- 因为我们使用了docker作为执行器,在使用gitlab-runner自动执行maven相关操作时,会启动一个新容器进行执行,因为容器内没有maven和一些依赖包,所以每次流水线都会自动下载maven-wrapper.properties内部定义的对应版本的maven和各种所需依赖。而新下载的maven因为没有配置国内镜像因而下载依赖也很慢,导致流水线严重缓慢。
- 解决:把容器内存放maven相关内容的文件夹挂载到宿主机中,持久化,并且手动改setting配置国内或者内部镜像仓库
-
为了方便管理,首先单独指定容器内的maven相关文件夹目录(默认情况下都会放在缓存文件夹/cache)
在流水线gitlab.ci文件中的编译部分加入参数: -Dmaven.repo.local = /root/.m2
-
打开之前已经持久化到宿主机的gitlab-runner的目录,修改config.toml文件
把执行器内目录挂载出来,这里要赋予读写权限即:rw volumes = [ "宿主机目录自己定:/root/.m2:rw" "/home/ws/docker/volumes/gitlab/runner-m2:/root/.m2:rw"]
然后就可以打开宿主机目录内的下载好的maven修改setting,同时其他依赖包也会被下载到这里
此方式适用于其他任何需要做执行器内部数据持久化的操作,不仅仅是maven
-
- 解决:把容器内存放maven相关内容的文件夹挂载到宿主机中,持久化,并且手动改setting配置国内或者内部镜像仓库
五、私有镜像仓库Harbor的使用
5.1说明
- 一些我们自己打包的镜像不需要传到公共镜像仓库中,而且公共镜像仓库管理不便,安全性和效率也得不到保证,这时候就需要一个私有镜像仓库,harbor是vmware公司开发的一款开源企业级Docker Registry,综合了作为镜像仓库的管理、权限等强大功能。
5.2安装使用
harbor将采用本地安装而非docker安装
-
官方文档:
https://goharbor.io/docs/2.1.0/install-config/
-
准备环境
docker、docker-compose环境,已安装
-
获取离线安装包(-P 下载到指定目录)
wget -P /home/ws/horbor https://github.com/goharbor/harbor/releases/download/v2.1.0/harbor-offline-installer-v2.1.0.tgz
-
解压压缩包到/home/ws/harbor目录
cd /home/ws/harbor tar -zxvf ./harbor-offline-installer-v2.1.0.tgz
下载速度慢的话可以通过其他方式下载下来然后挪到自己定义的目录进行解压
-
进入解压完的目录,复制一份默认配置文件harbor.yml.tmpl命名为harbor.yml(此文件harbor安装启动后默认会读取,如果不复制,则会以默认配置文件.tmpl为准。早期版本的harbor配置文件是harbor.cfg)
cp ./harbor.yml.tmpl ./harbor.yml
-
修改配置信息,更改admin密码、运行端口、数据持久路径
vim ./harbor.yml
-
在vim编辑器内修改:
http.port为自己的端口 harbor_admin_password为自己的密码 data_volume为自己定义的路径 https及其子参数全部注释(这里我们采用http方式,所以务必将https部分注释掉, 同时注意其他任何使用本机器上的harbor做镜像仓库的,一定要把docker的daemon.json中加入本机ip地址可信)
-
安装并运行
./install.sh
浏览器内打开配置的地址登录即可访问
5.3maven使用dockerfile-maven-plugin插件打包推送镜像至私有镜像仓库
- 参考https://www.jianshu.com/p/3929099711ec
- 在pom.xml内引入插件
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>${dockerfile-maven-plugin.version}</version>
<executions>
<execution>
<id>default</id>
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
<configuration>
<!--未来的镜像地址,同时也是镜像名,这里的ip端口就是我们自己部署的IP端口-->
<repository>10.101.80.157/platform/${project.artifactId}</repository>
<!--标签,一般是镜像:后面的版本号-->
<tag>${project.version}</tag>
<contextDirectory>${project.build.directory}</contextDirectory>
<useMavenSettingsForAuth>true</useMavenSettingsForAuth>
</configuration>
</plugin>
- 编写一份dockerfile运用指令:
mvn package dockerfile:build
- 遇到unauthorized: unauthorized to access repository: 。。。。。。没有登录
- 如果是手动推送的话,手动登录即可,但是当我们使用maven插件时我们需要吧账号密码交给maven,即我们需要在maven的setting.conf中配置server
<servers>
<server>
<id>镜像仓库地址IP端口</id>
<username>账号</username>
<password>密码</password>
</server>
</servers>
- 当使用gitlab-runner并采用docker方式流水线打包推送时,我们需要把之前挂载出来的.m2中的maven进行配置,以便于在容器中的maven知道账号密码进行登录推送。
六、Rancher容器管理平台
6.1说明
- 这里使用rancher1.x版本,相比2.x版本,1.x定位为各类容器编排工具的上层管理平台,而2.x移除了其他编排工具,只剩下k8s并进行了拓展,2.x的模式实质上就是阿里云等云厂商整合后的k8s服务等等。
- 1和2的区别:https://www.zhihu.com/question/309076492/answer/579260940
6.2安装使用
-
官方文档:
https://docs.rancher.cn/docs
-
使用docker拉取、配置并运行rancher
docker run --name rancher -d \ --restart=always \ -p 8080:8080 \ -v /home/ws/docker/volumes/rancher-server/mysql:/var/lib/mysql \ rancher/server
浏览器打开地址进行访问测试
-
操作说明:
-
分级:环境-应用-服务/容器
环境:rancher上面可以管理多个环境,每个环境内可以管理多个“基础架构”标签内的环境, 比如主机、存储等等。抽象理解为你管理着一个机房,里面有好多台服务器,即整个环境。 应用:每一个环境下,可以部署多个应用,应用即我们具体话的一套系统、软件、平台等。 抽象理解为我们在这几台服务器上装一些软件总合成一套可以为用户提供服务的系统 服务/容器:微服务架构下,一个应用由多个服务共同配合完成,每个服务又可以跑多份, 每一份即一个独立docker容器。抽象理解为部署分布式应用。
-
七、微服务注册中心与配置中心jhipster-registry
7.1说明
- jhipster-registry由jhipster团队开发并开源,他是一个综合了注册中心和配置中心等功能的应用。他内部集成了Eureka用于服务发现和注册、并且集成了对springcloud项目的配置和管理等功能。所以与其使用传统的注册中心不如直接使用它来完成这些一条龙服务。
7.2使用
-
克隆原始项目,从github下载(git各类操作默认已熟悉)
git clone https://github.com/jhipster/jhipster-registry.git
编译运行项目