內容尚不完善,做做記錄
關鍵組成部分
- 操作系統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插件打包推送鏡像至私有鏡像倉庫
- 參考http://www.lxweimin.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
編譯運行項目