1. 程式人生 > >廬山真面目之十一微服務架構手把手教你搭建基於Jenkins的企業級CI/CD環境

廬山真面目之十一微服務架構手把手教你搭建基於Jenkins的企業級CI/CD環境

                廬山真面目之十一微服務架構手把手教你搭建基於Jenkins的企業級CI/CD環境

一、介紹
      說起微服務架構來,有一個環節是少不了的,那就是CI/CD持續整合的環境。當然,搭建CI/CD環境的工具很多,但是有一個工具它卻是出類拔萃,是搭建持續整合環境的首選,它就是Jenkins。在這裡,有關Jenkins的具體內容我就不說了,網上有很多,我在這裡只做很簡單的介紹。Jenkins 自動化部署可以解決整合、測試、部署等重複性的工作,工具整合的效率明顯高於人工操作;並且持續整合可以更早的獲取程式碼變更的資訊,從而更早的進入測試階段,更早的發現問題,這樣解決問題的成本就會顯著下降:持續整合縮短了從開發、整合、測試、部署各個環節的時間,從而也就縮短了中間出現的等待時間;持續整合也意味著開發、整合、測試、部署得以持續。我們今天就開始搭建一個企業級別的CI/CD的環境,這個內容很多,也需要有很多的基礎,比如:必須安裝Docker了,必須會使用Linux系統,必須會使用Git,對GitHub比較熟悉,當然也要對Net5.0有所認識,等等還有很多,這些基礎知識,我假定大家都是熟悉的,畢竟,文章要有主有次。

二、準備工作

          1、開發環境升級,將Net Core3.1的環境升級為 Net5.0
                   官方文件:https://docs.microsoft.com/zh-cn/aspnet/core/migration/31-to-50?view=aspnetcore-5.0&tabs=visual-studio#prerequisites
                   下載地址:https://dotnet.microsoft.com/download/dotnet/5.0

          2、安裝 Git 原始碼託管工具。
                在工作開始之前,先要檢查自己是否安裝了Git工具,如果安裝了,就可以跳過本節,如果沒有安裝,那就跟著我們開始安裝吧。當然了,安裝完成之後,我們還要配置Visual Studio 2019 的原始碼管理工具是 Git,很簡單,我就不寫了。
                  (1)、去官網下載Git的安裝檔案,地址::https://git-scm.com/downloads/
                            

                  (2)、將下載下來的 Git 安裝包,存在自己的目錄裡,檔名:Git-2.30.0-64-bit.exe,雙擊該檔案開始安裝。                  
              

                  (3)、選擇安裝的元件,保持預設就好(我的選擇)。
                            

                  (4)、選擇預設編輯器,保持預設就好(我的選擇)。
                            

                  (5)、可以修改預設分支的名稱,我選擇保持預設(我的選擇)。                   
              

                  (6)、可以設定環境變數,保持預設就可以(我的選擇)。                   
              

                  (7)、選擇Https 傳輸協議,保持預設。                   
              

                  (8)、配置終端使用 Git Bash,保持預設就好。                   
              

                  (9)、配置行未的轉換符。
              

                  (10)、選擇“git pull”的預設行為,預設選擇。                   
              

                  (11)、選擇憑據幫助程式。
                            

                  (12)、配置額外選項。
                            

                  (13)、配置實驗選項。
                            

                  (14)、開始安裝。                   
              

                  (15)、安裝成功。                   
              

                  (16)、如何判斷 Git 是否安裝成功,在空白地方(任何地方),點選右鍵,出現如圖效果表示安裝成功。
                            

          3、新建一個Net5.0的專案,然後將其上傳至 Git 伺服器。         
                 由於是測試專案,所以每個專案的程式碼都很簡單,因為程式碼不是重點。
                  
                  (1)、新建專案                   
                            【1】、PatrickLiu.CICD.Clients(Asp.Net Core WebApi),一個Core API專案。
                                       
                    程式碼如下:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Threading;
  5 using Microsoft.AspNetCore.Mvc;
  6 using Microsoft.Extensions.Configuration;
  7 using Microsoft.Extensions.Logging;
  8 using PatrickLiu.CICD.Interfaces;
  9 using PatrickLiu.CICD.Models;
 10 
 11 namespace PatrickLiu.CICD.Clients.Controllers
 12 {
 13     /// <summary>
 14     /// 使用者的 API 型別。
 15     /// </summary>
 16     [Route("api/[controller]")]
 17     [ApiController]    
 18     public class UsersController : ControllerBase
 19     {
 20         #region 私有欄位
 21 
 22         private readonly ILogger<UsersController> _logger;
 23         private readonly IUserService _userService;
 24         private IConfiguration _configuration;
 25 
 26         #endregion
 27 
 28         #region 建構函式
 29 
 30         /// <summary>
 31         /// 初始化該型別的新例項。
 32         /// </summary>
 33         /// <param name="logger">日誌記錄器。</param>
 34         /// <param name="userService">使用者服務介面。</param>
 35         /// <param name="configuration">配置服務。</param>
 36         public UsersController(ILogger<UsersController> logger, IUserService userService, IConfiguration configuration)
 37         {
 38             _logger = logger;
 39             _userService = userService;
 40             _configuration = configuration;
 41         }
 42 
 43         #endregion
 44 
 45         #region 例項方法
 46 
 47         /// <summary>
 48         /// 獲取一條記錄
 49         /// </summary>
 50         /// <param name="id"></param>
 51         /// <returns></returns>
 52         [HttpGet]
 53         [Route("Get")]
 54         public User Get(int id)
 55         {
 56             return _userService.FindUser(id);
 57         }
 58 
 59         /// <summary>
 60         /// 獲取所有記錄。
 61         /// </summary>
 62         /// <returns></returns>
 63         [HttpGet]
 64         [Route("All")]
 65         //[Authorize]
 66         public IEnumerable<User> Get()
 67         {
 68             Console.WriteLine($"This is UsersController {this._configuration["port"]} Invoke");
 69 
 70             return this._userService.UserAll().Select((user => new User
 71             {
 72                 ID = user.ID,
 73                 Name = user.Name,
 74                 Account = user.Account,
 75                 Password = user.Password,
 76                 Email = user.Email,
 77                 Role = $"{this._configuration["ip"]}:{this._configuration["port"]}",
 78                 LoginTime = user.LoginTime
 79             })); ;
 80         }
 81 
 82         /// <summary>
 83         /// 超時處理
 84         /// </summary>
 85         /// <returns></returns>
 86         [HttpGet]
 87         [Route("Timeout")]
 88         public IEnumerable<User> Timeout()
 89         {
 90             Console.WriteLine($"This is Timeout Start");
 91             //超時設定。
 92             Thread.Sleep(3000);
 93 
 94             Console.WriteLine($"This is Timeout End");
 95 
 96             return this._userService.UserAll().Select((user => new User
 97             {
 98                 ID = user.ID,
 99                 Name = user.Name,
100                 Account = user.Account,
101                 Password = user.Password,
102                 Email = user.Email,
103                 Role = $"{this._configuration["ip"]}:{this._configuration["port"]}",
104                 LoginTime = user.LoginTime
105             })); ;
106         }
107 
108         #endregion
109     }
110 }

 

 1 using Microsoft.AspNetCore.Builder;
 2 using Microsoft.AspNetCore.Hosting;
 3 using Microsoft.Extensions.Configuration;
 4 using Microsoft.Extensions.DependencyInjection;
 5 using Microsoft.Extensions.Hosting;
 6 using Microsoft.OpenApi.Models;
 7 using PatrickLiu.CICD.Interfaces;
 8 using PatrickLiu.CICD.Services;
 9 
10 namespace PatrickLiu.CICD.Clients
11 {
12     public class Startup
13     {
14 
15         /// <summary>
16         /// 
17         /// </summary>
18         /// <param name="services"></param>
19         public void ConfigureServices(IServiceCollection services)
20         {
21             services.AddSingleton<IUserService, UserService>();
22             services.AddControllers();
23             services.AddSwaggerGen(c =>
24             {
25                 c.SwaggerDoc("v1", new OpenApiInfo { Title = "PatrickLiu.CICD.Clients", Version = "v1" });
26             });
27         }        
28     }
29 }


                            【2】、PatrickLiu.CICD.Interfaces(Net Core 類庫專案),定義抽象介面。
                                       
                    程式碼如下

 1 using PatrickLiu.CICD.Models;
 2 using System.Collections.Generic;
 3 
 4 namespace PatrickLiu.CICD.Interfaces
 5 {
 6     /// <summary>
 7     /// 使用者服務的介面定義。
 8     /// </summary>
 9     public interface IUserService
10     {
11         /// <summary>
12         /// 查詢指定主鍵的使用者例項物件。
13         /// </summary>
14         /// <param name="id">使用者的主鍵。</param>
15         /// <returns>返回查詢到的使用者例項物件。</returns>
16         User FindUser(int id);
17 
18         /// <summary>
19         /// 獲取所有使用者的例項集合。
20         /// </summary>
21         /// <returns>返回所有的使用者例項。</returns>
22         IEnumerable<User> UserAll();
23     }
24 }


                            【3】、PatrickLiu.CICD.Models(Net Core 類庫專案),定義資料模型。
                                       
                    程式碼如下:

 1 using System;
 2 
 3 namespace PatrickLiu.CICD.Models
 4 {
 5     /// <summary>
 6     /// 使用者模型。
 7     /// </summary>
 8     public class User
 9     {
10         /// <summary>
11         /// 獲取或者設定使用者主鍵。
12         /// </summary>
13         public int ID { get; set; }
14 
15         /// <summary>
16         /// 獲取或者設定使用者姓名。
17         /// </summary>
18         public string Name { get; set; }
19 
20         /// <summary>
21         /// 獲取或者設定使用者賬號名稱。
22         /// </summary>
23         public string Account { get; set; }
24 
25         /// <summary>
26         /// 獲取或者設定使用者密碼。
27         /// </summary>
28         public string Password { get; set; }
29 
30         /// <summary>
31         /// 獲取或者設定使用者的電子郵箱地址。
32         /// </summary>
33         public string Email { get; set; }
34 
35         /// <summary>
36         /// 獲取或者設定使用者角色。
37         /// </summary>
38         public string Role { get; set; }
39 
40         /// <summary>
41         /// 獲取或者設定使用者的登入時間。
42         /// </summary>
43         public DateTime LoginTime { get; set; }
44     }
45 }


                            【4】、PatrickLiu.CICD.Services(Net Core 類庫專案),定義服務實現型別。
                                       
                    程式碼如下:                    

 1 using PatrickLiu.CICD.Interfaces;
 2 using PatrickLiu.CICD.Models;
 3 using System;
 4 using System.Collections.Generic;
 5 using System.Linq;
 6 
 7 namespace PatrickLiu.CICD.Services
 8 {
 9     /// <summary>
10     /// 實現使用者服務介面的實現型別。
11     /// </summary>
12     public class UserService : IUserService
13     {
14         private IList<User> dataList;
15 
16         /// <summary>
17         /// 初始化型別的例項
18         /// </summary>
19         public UserService()
20         {
21             dataList = new List<User>()
22             { new User {ID=1,Name="黃飛鴻-修改",Account="HuangFeiHong",Password="HuangFeiHong123456",Email="[email protected]", Role="Admin", LoginTime=DateTime.Now },
23             new User {ID=2,Name="洪熙官",Account="HongXiGuan",Password="HongXiGuan54667",Email="[email protected]", Role="Admin", LoginTime=DateTime.Now.AddDays(-5) },
24             new User {ID=3,Name="方世玉",Account="FangShiYu",Password="FangShiYu112233",Email="[email protected]", Role="Admin", LoginTime=DateTime.Now.AddDays(-30) },
25             new User {ID=4,Name="苗翠花",Account="MiaoCuiHua",Password="MiaoCuiHua887766",Email="[email protected]", Role="Admin", LoginTime=DateTime.Now.AddDays(-90) },
26             new User {ID=5,Name="嚴詠春2",Account="YanYongChun",Password="YanYongChun09392",Email="[email protected]", Role="Admin", LoginTime=DateTime.Now.AddMinutes(-50) }};
27         }
28 
29         /// <summary>
30         /// 查詢指定主鍵的使用者例項物件。
31         /// </summary>
32         /// <param name="id">使用者的主鍵。</param>
33         /// <returns>返回查詢到的使用者例項物件。</returns>
34         public User FindUser(int id)
35         {
36             return dataList.FirstOrDefault(user => user.ID == id);
37         }
38 
39         /// <summary>
40         /// 獲取所有使用者的例項集合。
41         /// </summary>
42         /// <returns>返回所有的使用者例項。</returns>
43         public IEnumerable<User> UserAll()
44         {
45             return dataList;
46         }
47     }
48 }


                  (2)、在Visual Studio 2019中增加Git賬號。
                            如果沒有在Visual Studio 2019種新增賬號,那就增加一下,方便進行Git相關操作。

                            【1】、點選 Visual Studio 2019 【幫助】選單,選擇【註冊產品】,開啟新增賬號視窗。
                                      
                            【2】、點選【所有賬戶】右邊的【+新增】選單,將 GitHub 賬號增加進來。
                                       

                            【3】、如果已經新增過賬號,會顯示出來。
                                    如果沒有GitHub賬號,趕緊去申請一個,畢竟,我們要使用Git作為我們的原始碼管理工具。說明:賬號的確認頁面,不要使用Microsoft Edge瀏覽器,因為這個瀏覽器總是驗證(驗證圖示總是轉圈),換個瀏覽器,我使用的是 Firefox ,很快就新增成功,具體原因我還沒找到。

                  (3)將專案推送至Git伺服器。

                             【1】、在【解決方案】上點選右鍵,選擇【Git建立遠端倉庫】,開啟建立倉庫的窗體。
                                      

                             【2】、開啟【建立GIT儲存庫】頁面,進行設定,去掉【專用】選項,很簡單就不多說了。
                                     

                             【3】、點選按鈕【建立並推送】,完成操作。
                                     完成操作,已經將我們的專案成功推送到 Github伺服器

                  (4)、檢查Github伺服器上是否存在我們的專案。
                            

三、開始搭建環境

             1、準備4臺伺服器,構建企業級別 CI/CD 環境。

        (1)、Jenkins 持續整合伺服器,地址:192.168.127.146。

        (2)、Docker Harbor 私服伺服器,地址:192.168.127.143。

        (3)、Docker 映象構建伺服器,地址:192.168.127.144。

        (4)、釋出伺服器,地址:192.168.127.145。

             2、搭建 Jenkins 持續整合伺服器,伺服器地址【192.168.127.146】。
        要想搭建持續整合的環境,Jenkins是一個繞不過的話題。這臺伺服器也是我們企業級持續整合環境的核心,它搭建好了,也就完成了60%配置的任務了,廢話不多說,我們開始吧,環節很多,大家要好好的看了。

                  (1)、開始安裝 Jenkins,這裡就省略了,如果想看安裝步驟,請看我的《如何在Linux(CentOS7)環境搭建 Jenkins 伺服器環境》。

                            網頁地址:http://192.168.127.146:8084
                            登入賬號:Administrator
                            登入密碼:***********

                  (2)、登入Jenkins伺服器,點選【Manage Jenkins】--》【Global Tool Configuration】按鈕,開啟【Global Tool Configuration】配置頁面。
              第一次登陸 Jenkins ,主要是為了兩項全域性配置,第一項是檢視 Java 的 JDK 是否安裝好,第二項是檢視 Git 是否安裝好。
                              【1】、增加JDK設定,配置JDK資訊。                             
                    

                              【2】、增加Git,配置GIT執行路徑。
                                        


                              【3】、Git 執行路徑如何獲取。
                                        命令:#whereis git
                  
                  Java 的 JDK 安裝路徑可以通過命令:#which java 檢視。
                  
                              
                  (3)、繼續配置,點選【Manage Jenkins】--》【Manage Plugins】,檢查Git是否安裝。
                              


                  (4)、配置 Jenkins 從 GitHub上拉取原始碼,這是手動拉取的。

                            【1】、點選【Dashboard】選單,【新建Item】,在右側開啟【Create a Job】頁面。
                                         

                            【2】、建立一個任務。
                                        
                                        工作列表如下
                                         
                            【3】、開始配置工作。
                                       
                            【4】、配置原始碼管理。
                                       

                            【5】、為原始碼管理配置認證。
                                       

                            【6】、開始構建,從 GitHub 伺服器上拉取原始碼。
                                       

                            【7】、我的工作任務正在拉取原始碼。
                                        

                            【8】、成功拉取原始碼。
                                       
                  

                            【9】、點選【Dashboard】--》【專案名稱】--》【工作空間】可以檢視專案原始碼。
                                       

                            【10】、我們要實現在 Visual Studio 2019 裡面,修改原始碼,自動同步到 Jenkins 伺服器。
                                         我們開始配置GitHub Server,在桌面【Dashboard】,點選【Manage Jenkins】--》【System Configuration】--》【Configure System】,開啟【Configure System】頁面。在這裡我們主要配置 GitHub,其他保持預設。

                                          1)、增加GitHub Server
                                                 

                      然後,我們點選【管理Hook】,進入配置 Hook 頁面,點選【覆蓋 Hook Url】,由於我們這個地址是內網地址,所以這個url不能直接使用(外網地址就不用穿透了),要通過內網穿透實現,下邊有實現方法。

                       
                        這個地址可以直接儲存,後面,我把這個內網地址穿透就可以。

                                          2)、增加認證。
                                                  

                                          3)、我們獲取認證 Token,我們必須登入 GitHub.com 伺服器。

                                                  1》、點選系統【Settings】選單,進入設定頁面。
                                                          

                                                  2》、點選【Developer settings】,進入設定頁面。
                                                          

                                                  3》、點選【Personal access tokens】選單,繼續點選【Generate new token】按鈕。
                                                          


                                                  4》、進入【New personal access token】頁面,進入相關設定。
                                                         

                                                  5》、回到【Personal access tokens】頁面,點選【複製】就可以獲取Token,這個 Tokens 是為了建立 GitHub Server 通訊憑據使用的,也就是步驟 2)裡面要寫的祕密文字。
                                                         


                            【11】、GitHub Server Url 不能直接用,可以通過【Nat內網穿透】實現。
                             
                                       1)、https://natapp.cn/,登入官網,註冊賬號。
                                                

                                       2)、https://natapp.cn/,官網下載客戶端工具。
                                                  

                                       3)、登入官網,購買【免費隧道】
                                                  

                      


                                       4)、點選【我的隧道】--》【配置】,配置我的隧道。
                                                
                                                  開始配置。
                                                 

                      
                   

                                       5)、執行客戶端程式,登入App,必須在APP的當前目錄。
                                              命令:#natapp -authtoken=9b25a6fb003b7a36               //每次重新執行獲取的地址都不一樣,該視窗如果長時間開啟,該地址也會重新整理,改變地址。
                                                 
                                    
                                       6)、獲取外網的地址。
                                                 

                                       7)、將 NatAPP 獲取的網址配置到 GitHub.Com 的 WebHook,這樣就可以通過外網訪問 Http://192.168.127.146:8084/github-webhook/。
                    

                  (5)、配置 WebHook 完成觸發 Jenkins 拉取新的原始碼到本地工作空間。

                             【1】、在GitHub 右側,點選使用者賬號圖示,選擇【Your Repositories】選單,開啟所有倉庫列表。
                                       

                             【2】、進入目標倉庫【PatrickLiu.CICD.Demo】後,點選該專案的【Settings】選單。
                                       
                                       進入專案,然後點選專案的【Settings】選單。
                                       

                             【3】、然後選擇左側【Webhooks】,然後點選右側【Add webhook】,增加一個 Hook。
                                                               

                                       將(12)步驟中通過內網穿透生成的Url地址增加進去。
                  

                             【4】、WebHook 增加成功,恭喜,還好成功了。
                                        

                  (6)、配置 Jenkins 裡面的專案,點選左側【My Views】,在右側點選專案名稱旁邊的下拉選單【配置】,進入配置頁面。
                               

                             我們要配置【構建觸發器】,選擇完畢,確認無誤後點擊【應用】,最後點選【儲存】。
                                

                  (7)、測試是否可以自動生成、拉取,看看是否能觸發我們 Hook。

             經過以上步驟,我們的 Hook 配置成功,當VS2019 修改程式碼,並提交到 Github 上,並觸發 Hook ,促使 Jenkins 自動拉取 Github 上的原始碼到 Jenkins 中。

                                    【1】、在 Visual Studio2019 修改我們的程式碼,然後提交,最後推到伺服器上。

                                       

                 修改完畢,然後全部提交,最後推送到GitHub伺服器。       

                         

                                    【2】、在 Jenkins 裡面,點選左側【My Views】,然後點選右側專案的名稱,進入該專案頁面。

                                      

                                    【3】、點選【Build History】或者【相關連結】第一條記錄,進入【Build】頁面詳情。

                                       

                                    【4】、點選左側【控制檯輸出】,在右側可以看到詳情。

                                        

                                    【5】、也可以點選【工作空間】,右側點選【檢視】,檢視專案原始碼。
                  

                                 【6】、最後我們來看看原始碼,是否修改了。

                  
                  原始碼如下:
                  


          3、搭建 Docker Harbor 私服伺服器,伺服器地址【192.168.127.143】。

        我們有了私服,就不用去遠端伺服器拉取有些需要的映象,當然,我們可以事先把一些有用的映象退到我們私服伺服器,以後使用更方便,速度更快。

                  (1)、檢查 Docker 是否安裝,Docker-compose 是否安裝,具體安裝步驟就不寫了,因為這個不是重點。
                              檢查 Docker 環境是否安裝,如果沒有就安裝。

              命令:#Docker --version                           

              [root@localhost143 ~]# docker --version
              Docker version 20.10.2, build 2291f61

               

              命令:yum install -y docker,執行該命令安裝 Docker,安裝完成,需要升級,因為該版本太低。如果想升級 Docker ,可以檢視我的這篇文章《如何將Docker升級到最新版本》

                  (2)、檢查 Docker-compose 是否安裝,如果沒有那就安裝。
                              命令:#Docker-compose --version

                       [root@localhost143 ~]# docker-compose --version
               docker-compose version 1.25.0, build 0a186604
                                    

               以上說明已經安裝,如果提示 -bash: docker-compose: 未找到命令,說明沒有安裝。

                  (3)、如果還沒有安裝,那就安裝 Docker-compose,執行以下命令。
                              命令:#curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
               命令:#chmod +x /usr/local/bin/docker-compose
              
              說明:Docker-compose 的安裝比較麻煩,所以在這裡就不詳說了,大家可以檢視我的《 如何安裝快速 Docker 和 Docker-Compose 服務》,裡面有具體的安裝方法。

                  (4)、下載 Harbor,開始安裝和配置私服伺服器。

                              【1】、檢查是否安裝了 Wget 命令,如果沒有安裝,要安裝可以執行以下命令。

                              命令:# yum install -y wget  
                                    

              【2】、下載 Harbor,別直接下,最好用下載工具,因為檔案太大,有 533 M(我直接儲存下載,太慢,最後才用工具下載)。

                                 檔案地址:https://github.com/goharbor/harbor/releases/download/v2.1.3/harbor-offline-installer-v2.1.3.tgz

                                 官網:https://github.com/vmware/harbor/releases

                                 wget命令下載:#wget https://github.com/goharbor/harbor/releases/download/v2.1.3/harbor-offline-installer-v2.1.3.tgz(下載太慢,不建議,檔案有533M),我是使用迅雷下載,然後在上傳到伺服器吧。
                     
                  (5)、將檔案上傳到伺服器,檔名:harbor-offline-installer-v2.1.3.tgz。
                              伺服器目錄:
                                 [root@localhost143 privatefiles]# pwd
                  /root/privatefiles

                  

              檔案儲存:
                 [root@localhost143 ~]# ls
                /root/privatefiles/harbor-offline-installer-v2.1.3.tgz                     

                

                  (6)、進入檔案儲存路徑,然後,解壓檔案。
                              命令:#tar xf harbor-offline-installer-v2.1.3.tgz
                              

                  (7)、進入 Harbor 目錄。
                              命令:# cd harbor
                              

                  (8)、修改 harbor.yml.tmpl檔名為harbor.yml檔名,並進行相關配置。

                            【1】、將 harbor.yml.tmpl 檔名改成 harbor.yml。
                                        命令:#cp harbor.yml.tmpl harbor.yml
                                        

                            【2】、修改配置檔案: 配置 hostname 0.0.0.0,沒有vim 就安裝:yum install vim -y 強制安裝。
                                        命令:#vim harbor.yml
                                                                     
                                        修改:hostname:192.168.127.143,註釋掉關於https 的配置。
                   

                            【3】、其他配置內容,可以熟悉一下。
                                        

                            【4】、儲存退出 Vim。
                                      命令:#wq
                  
                  (9)、安裝 Harbor 。

                            【1】、開始安裝,執行以下命令。
                                        命令:#./install.sh
                                        
                  中間很多過程省略了。。。。
                  
                            
                            【2】、預設埠號:80,訪問地址:http://192.168.127.143:80。
                                        

                  (10)、配置Harbor 私服。

                             【1】、登入Harbor,賬號預設:admin,密碼:Harbor12345。
                                           

                             【2】、新建專案。
                                        
                  新建專案。。。
                  
                              
                             【3】、為我們的私服伺服器增加私服地址配置。

                                       1)、檢視所有harbor 是否都執行在 docker 裡面。
                                               命令:# docker ps -a
                &nbs