1. 程式人生 > 實用技巧 >華為云云容器快速搭建網站實踐隨記—利用私有映象搭建GuestBook

華為云云容器快速搭建網站實踐隨記—利用私有映象搭建GuestBook

一、華為云云容器簡單介紹:

雲容器引擎 CCE 是基於 K8S 和 Docker 的企業級容器服務,為企業應用提供快速部署、自動化運維、彈性伸縮等容器生命週期管理能力。


這個實踐是通過 docker 容器以及雲容器引擎 CCE 平臺快速實現了網站搭建,體驗到容器為企業應用所帶來的極大的便利性。

而網站建站是一個IT從業人員的基本功,所以通過本篇文章,利用私有映象搭建GuestBook說明藉助華為雲等雲生態資源,進行快速、高效的實踐,大家可以對比體會下,如果是採用CES單購、自建容器或採用自有伺服器搭建的價效比之分,個人覺得,差別還是很大的,如果我們能把原本需要2天的時間縮短到2個小時,那麼即使付出幾百塊錢的成本也是值得的。

二、下面對具體實踐步驟進行分享說明:

實踐的大致內容說明如下:

在安裝好 docker 環境的虛擬機器中製作 Guestbook 的三個映象:frontend, redis 和 redisslave,並
上傳到雲容器引擎 CCE 的映象倉庫中,通過私有映象釋出容器服務,搭建 Guestbook 留言簿。

1、建立彈性雲伺服器 ECS

註冊登入後,在頁面的左上方點選【服務列表】,從顯示的服務中選擇【計算】-【彈性雲伺服器ECS】

點選後進入彈性雲伺服器購買頁面:

按需計費,華北-北京一,可用區1,通用計算型1核1G,公共映象 ubantu 16.04,頻寬1G,確定後點擊【立即購買】

勾選同意,然後點選提交,等待建立,然後返回雲伺服器控制檯,等待片刻後,可檢視到已建立好的彈性雲伺服器。記錄下彈性 IP 地址,以作後續登陸使用。此處如我的是114.xx.xxx.7

2、安裝 docker 客戶端

開啟 putty,輸入彈性雲伺服器 ECS 的彈性 IP 地址,單擊“open”。如下圖所示:

最好是儲存會話,再次開啟的話,就可以直接雙擊,點選【開啟】後會進入DOC命令框,輸入root和購買時設定的密碼,出現如下畫面,則表示已經登入成功:

使用如下命令快速安裝 Docker。
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh

安裝後,使用dockerversion或dockerinfo檢視版本及安裝資訊,如下圖所示:

dockerinfo可自行嘗試

3、製作 Guestbook 映象

製作 Guestbook 映象中,需要製作三個映象:frontend 作為前端網頁服務映象,程式碼邏輯全在
Frontend 元件內,redis 和 redisslave 負責儲存,互為主備

(1)製作 Frontend 元件映象

《1》執行如下命令,新建用於存放 frontend 元件檔案的目錄。
mkdir guestbook
cd guestbook
mkdir frontend
cd frontend

如下圖所示:

《2》執行如下命令,新建 guestbook.php 檔案。並複製程式碼到 guestbook.php 檔案中。
vi guestbook.php
guestbook.php 檔案 的 程式碼內容如下:

<?php
set_include_path('.:/usr/local/lib/php');
error_reporting(E_ALL);
ini_set('display_errors',1);
require 'Predis/Autoloader.php';
Predis\Autoloader::register();
if (isset($_GET['cmd'])===true){
$host = 'redis-master';
header('Content-Type: application/json');
if ($_GET['cmd']=='set'){
$client = new Predis\Client([
'scheme' => 'tcp',
'host' => $host,
'port' => 6379,
]);
$client->set($_GET['key'],$_GET['value']);
print('{"message": "Updated"}');
}
else {
$host = 'redis-slave';
$client = new Predis\Client ([
'scheme' => 'tcp',
'host' => $host,
'port' => 6379,
]);
$value = $client->get($_GET['key']);
print('{"data": "' . $value . '"}');
}
} else {
phpinfo();
} ?>

注意:複製上述程式碼的時候,檢查頭和尾,以確保完整,如若缺失頭的部分,則把游標先移動至最頭部第一個字元,然後複製缺失的部分,貼上

複製完成後,檢查無誤,則ESC退出輸入,SHIFT+冒號,然後輸入 wq,儲存後退出文件

《3》執行如下命令,新建 controllers.js 檔案。並複製程式碼到 controllers.js 檔案中。
vi controllers.js
controllers.js 檔案 的 程式碼 內容如下 :

var redisApp = angular.module('redis',['ui.bootstrap']);
/**
*Constructor
*/
function RedisController() {}
RedisController.prototype.onRedis = function() {
this.scope_.messages.push(this.scope_.msg);
this.scope_.msg = "";
var value = this.scope_.messages.join();
this.http_.get("guestbook.php?cmd=set&key=messages&value=" + value)
.success(angular.bind(this, function(data) {
this.scope_.redisResponse = "Updated.";
}));
};
redisApp.controller('RedisCtrl',function($scope, $http, $location) {
$scope.controller = new RedisController();
$scope.controller.scope_= $scope;
$scope.controller.location_= $location;
$scope.controller.http_= $http;
$scope.controller.http_.get("guestbook.php?cmd=get&key=messages")
.success(function(data) {
console.log(data);
$scope.messages =data.data.split(",");
});
});

複製完成後,檢查無誤,則ESC退出輸入,SHIFT+冒號,然後輸入 wq,儲存後退出文件

《4》執行如下命令,新建 index.html 檔案。並複製程式碼到 index.html 檔案中。
vi index.html
index.html 檔案 的 程式碼 內容如下

<html ng-app="redis" >
<head>
<title>Guestbook</title>
<link rel="stylesheet"
href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css?t=1023">
<script
src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.12/angular.min.js"></scr
ipt>
<script src="controllers.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-
bootstrap/0.13.0/ui-bootstrap-tpls.js"></script>
</head>
<body ng-controller="RedisCtrl">
<div style="width: 50%; margin-left: 20px">
<h2>Guestbook</h2>
<form>
<fieldset>
<input ng-model="msg" placeholder="Messages" class="form-control"
type="text" name="input"><br>
<button type="button" class="btn btn-primary" ng-
click="controller.onRedis()">Submit</button>
</fieldset>
</form>
<div>
<div ng-repeat="msg in mesages track by $index">
{{msg}}
</div>
</div>
</div>
</body>
</html>

複製完成後,檢查無誤,則ESC退出輸入,SHIFT+冒號,然後輸入 wq,儲存後退出文件

《5》通過 ls 命令可以查詢到“frontend”目錄下已建立好的三個檔案。

《6》在當前 frontend 目錄下,編寫 Dockerfile 檔案構建 frontend 映象。
vi Dockerfile

Dockerfile 檔案 程式碼內容如下:


FROM php:5-apache
RUN apt-get update
RUN pear channel-discover pear.nrk.io
RUN pear install nrk/Predis
ADD guestbook.php /var/www/html/guestbook.php
ADD controllers.js /var/www/html/controllers.js
ADD index.html /var/www/html/index.html


其中
FROM 語句:表示使用 php:5-apache 映象作為基礎。
RUN語句:表示使用 apt-get 命令來更新軟體包列表和安裝 Predis。
ADD語句:將原生代碼檔案新增到映象中。

《7》執行如下命令製作 frontend 映象。
docker build -tfrontend . (不要漏了最後有個點)

《8》驗證成功與否:

螢幕回顯資訊如下,當出現“successfully built”的時候表示映象製作成功,如下圖所示:

(2)製作 redis 和 redisslave 映象

《1》redis 映象通過如下命令直接從映象倉庫中獲取
docker pull redis:3.0

如下圖所示:

《2》返回 guestbook 目錄下,建立 redisslave 資料夾

cd ..
mkdir redisslave
cd redisslave

如下圖所示:

《3》編寫 run.sh 檔案。
vi run.sh
run.sh 檔案 內容 如下 :
redis-server --slaveof redis-master 6379

如下圖所示:

ESC,使用SHIFT+冒號,然後輸入wq 儲存並退出文件。

《4》在當前 redisslave 目錄下,編寫 redisslave 映象的 Dockerfile 檔案。
vi Dockerfile
Dockerfile 檔案內容如下:
FROM redis:3.0
ADD run.sh /run.sh
RUN chmod a+x /run.sh
CMD /run.sh

ESC,使用SHIFT+冒號,然後輸入wq 儲存並退出文件。

其中:
FROM 語句:表示基於 redis 映象。
ADD 語句:表示將本地的 run.sh 檔案放到映象中。
RUN 語句:表示給所有使用者寫的 run.sh 賦予可執行許可權。
CMD 語句:表示容器啟動後自動執行 run.sh 指令碼。

《5》執行如下命令,製作 redisslave 的映象。
docker build -tredisslave . (不要漏了最後有個點)

螢幕回顯資訊如下,當出現“successfully built”的時候表示映象製作成功

如下圖所示:

《6》執行 docker images 命令,可以檢視到已經制作好的 guestbook 的三個映象。如下圖所示:

4、連線華為雲私有映象倉庫並上傳映象

(1)頁面左上角,點選【服務列表】,從服務頁面中,選擇“雲容器引擎 CCE”服務,進入雲容器引擎頁面

(2)進入到雲容器引擎控制檯後,進入【映象倉庫】。

(3)在容器映象服務中,選擇【組織管理】 建立組織。
為組織定義一個名稱,注意此處名稱全域性唯一,名稱可能已被他人佔用,請設定一個唯一的名
稱。(此處以rongzhen為例)

(4)組織建立成功後,進入“我的映象”,單擊“客戶端上傳”。點選彈出對話方塊中的“生成
臨時 docker login 指令”

(5)用 putty 開啟 ECS,貼上 docker login 指令。回顯如下:

當顯示“Login Succeeded”時,已成功連線到映象倉庫。

(6)成功連線映象倉庫後,執行 docker images 命令,檢視到已製作好的三個映象以及映象的版
本(TAG),現在需要對這三個映象打上新的標籤,然後推送到映象倉庫中。

(7)首先為 frontend 映象打上標籤並推送 frontend 映象到映象倉庫。

docker tag [{映象名稱}:{版本名稱}] swr.cn-north-1.myhuaweicloud.com/{組織名稱}/{映象名稱}:{版本
名稱}
docker push swr.cn-north-1.myhuaweicloud.com/{組織名稱}/{映象名稱}:{版本名稱}
{映象名稱}:frontend
{版本名稱}:latest
{組織名稱}:rongzhen(上述步驟中建立的組織名稱)
此處示例為:
docker tag frontend:latest swr.cn-north-1.myhuaweicloud.com/rongzhen/frontend:latest
docker push swr.cn-north-1.myhuaweicloud.com/rongzhen/frontend:latest
回顯如下:

(8)按照同樣的方式,為 redis 和 redisslave 映象打上標籤並推送到映象倉庫。

redis:

docker tag redis:3.0 swr.cn-north-1.myhuaweicloud.com/rongzhen/redis:3.0
docker push swr.cn-north-1.myhuaweicloud.com/rongzhen/redis:3.0

redisslave:

docker tag redisslave:latest swr.cn-north-1.myhuaweicloud.com/rongzhen/redisslave:latest
docker push swr.cn-north-1.myhuaweicloud.com/rongzhen/redisslave:latest

在執行redis:3.0時,如果複製不行,就直接照著手打一遍,應該就可以,複製的過程中會有一些字元出現非正常顯示

全部執行完畢後,到【容器映象服務】-【我的映象】中檢視是否上傳成功

5、建立 guestbook 容器工作負載

為已經上傳的 guestbook 三個映象建立容器工作負載,因為三個工作負載有相關性,需要按照
順序進行建立:1.redis;2.redisslave;3.frontend。

叢集的建立可檢視另外一篇文章:

https://blog.csdn.net/weixin_37896608/article/details/91881053

作為操作的參照

此處直接使用之前的叢集test,並使用我的映象進行私有映象建立無狀態工作負載

(1)進入到雲容器引擎控制檯,開啟【工作負載】介面,點選【建立無狀態工作負載】。如下圖所示:

(2)建立 redis 工作負載,填寫工作負載基本資訊,引數參考如下:
工作負載名稱:redis
叢集名稱:選擇已建立的叢集,如 test
名稱空間:default
例項數量:1

點選【下一步】後,進入如下頁面,新增容器,並選擇映象,此處選擇【我的映象】,此處有兩個redis,選擇3.0的,因為這個是我們上述步驟中生成的,選擇後,點選【確定】

容器配置頁面,使用預設,點選【下一步】,進入新增服務頁面

新增 redis-master 服務,設定引數參考如下:
服務名稱:redis-master(此處名稱與 guestbook.php 中服務名稱保持一致)
訪問方式:叢集內訪問
埠對映:協議-TCP;容器埠-6379;訪問埠-6379(此處埠號與 guestbook.php
中埠號保持一致)

如下圖所示:


單擊【確定】後,點選 【下一步】,高階設定頁面保持預設,點選【建立】,返回無狀態工作負載列表

(3)以同樣的方式建立 redisslave 工作負載,新增容器中選擇 redisslave 映象。新增服務中
設定服務名稱為“redis-slave”,容器埠與訪問埠均為“6379”

注意修改工作負載名稱和例項數量,選擇映象時,注意區分,其他的均可採用預設

(4)返回雲容器引擎介面,繼續建立 guestbook 無狀態工作負載。

需要特別注意的是,在新增服務時,按以下步驟操作:

新增 guestbook 服務,設定引數如下:
服務名稱:guestbook
訪問型別:負載均衡
服務親和:叢集級別
埠對映:協議-TCP,容器埠-80,訪問埠-80

如下圖所示:點選【確定】,然後點選【下一步】

其他的配置通其他操作,以上操作完畢後,返回工作負載列表,進行檢視,如下圖所示:

6、訪問 guestbook 應用

通過guestbook工作負載的外部訪問地址,開啟瀏覽器進行訪問,如下圖所示:

至此 Guestbook 網站搭建完畢。

有興趣的可以註冊華為雲賬號,然後到華為雲學院的微認證中進行學習和實踐,相信能收穫不少,以下是相關連結:

https://edu.huaweicloud.com/certifications/