利用AWS Cloud9 開始學習使用Docker容器
前言
容器化技術(Containerization)並不是一個新的名詞,最早Linux就提出了LXC(Linux Container)的想法,只是到了Docker問世後,容器技術才又被拿出來討論。容器化技術是指將應用程式(application)、運行環境(running environment)、函式庫(library)…等,這些執行應用程式中必要的東西,全部包在一起。正如同android studio將開發環境打包成apk般。而與虛擬機技術相比,容器化技術將可以省去開發者安裝每個Guest OS的時間與空間,這表示相較於虛擬機器,你可以在指定的硬體上執行更多容器,也比較不會有效能大幅下降的詬病。
Docker是一項開源(open source)的專案,主要提供容器化應用程式的部署與自動化的管理,使開發者能夠在開發專案的同時,也能快速且方便的打包及部署服務。Docker有三大重要的基本概念,分別是 Docker 映像檔(images)、Docker 容器(Container)以及 Docker 倉庫(registries),我們將在下方一一說明:
-
Docker 映像檔(images) : Docker 映像檔為 Docker 容器被啟動時,所執行的應用程式環境。與虛擬機的映像檔相似,虛擬機透過映像檔啟動作業系統,而 Docker 則是將檔案系統的狀態儲存於映像檔中。其中 Docker 映像檔是唯讀的模板。
-
Docker 容器(Container): Docker 容器是應用程式執行的實例。開發者透過映像檔啟動容器,就可在容器上運行服務。
建議不要在同一個容器中執行過多程序。
-
Docker 倉庫(registries) : Docker 倉庫是儲存映像檔的地方,開發者可以將自己的映像檔上傳至倉庫上,供別人下載使用。也可透過 Docker 倉庫讓映像檔在不同裝置上輕鬆的搬移。
情境
在此示範中,你將學習如何使用 AWS Cloud9 在 Docker 容器上運行簡單的 “Hello World” 網頁。
步驟
設定 AWS Cloud9 環境
首先,我們可以按照以下步驟操作,用以建立 Cloud9 環境。我們便能在 AWS Cloud9 上操作 EC2 主機,進而部署 Docker 服務。
-
在服務目錄底下,選取 Cloud9,並按下 Create environment。
-
在Name Environment 頁面,你可以在 Name 欄位中為你的環境資料夾命名(你也可以在Description欄位中敘述你的環境用途),然後跳至下一步。
-
在 Configure settings 的頁面 :
Environment type : 選取 Create a new instance for environment (EC2)。
Instance type : 選取 t2.micro (1 GiB RAM + 1 vCPU)。
- 你可以選擇性的在 Configure settings 頁面中的 Cost-saving setting 選項裡,自由調整在 多少時間後 停止閒置的 EC2 主機,以防你忘記在工作結束後停止 EC2 主機,造成不必要的開銷。
-
保持其他設定為初始設定, 並跳至下一步。
-
在 Review 頁面, 按下 Create environment 按鈕以建立環境。創建環境可能需要 30 〜 60 秒的時間。
建立 Docker 映像檔
在 EC2 主機及 Cloud9 環境架設完畢後,我們需要先建立 Docker 映像檔,才能利用它啟動 Docker 容器的服務。在本環節中,我們將建立一個用來執行簡易 web 應用程序的 Docker 映像檔, 並在 EC2 主機上啟動容器以進行測試。
-
讓我們稍微介紹一下 AWS Cloud9 ,下圖是 Cloud9 的介面
- 預設的上方部分為終端機或文字編輯器。
-
預設的下方部分也是終端機或文字編輯器。
兩區塊皆能在 EC2 環境中新增新的終端機工作,並在其中下指令碼,或者在區塊中進行文字編輯的工作。
-
EC2主機環境中的檔案總管。
-
工具面板,合作者,功能插件,除錯系統。
-
在工作面板出現之後,按下 Create File 來在環境下新增一個新的檔案.
-
在新增的檔案中,貼上下方的程式碼,程式將在建構 Docker 映像檔及設置 Apache 網路伺服器時被執行。在網頁的檔案及容器建置完成後,我們將在網頁上看到 “Hello World!” 的字樣。
FROM php:7.2-apache
RUN echo “Hello World!” > /var/www/html/index.html
-
按下
CTRL+S
(Mac使用者請按CMD+S
)來儲存檔案,並將其重新命名為 Dockerfile。
你可以將 Dockerfile 想成一份清單,用於描述要新建的 Docker 映像檔是基於哪個初始映像檔,並且定義我們想要對該初始映像檔做出的安裝行為及運行內容。
-
在 Cloud9的介面中,我們可以利用下方的區域執行終端機指令。
-
透過執行
docker version
,我們可以驗證 Docker 是否已經安裝在 AWS Cloud9 環境中。 一般來說,Cloud9 環境預設是內建 Docker 的,因此我們不需要再自行安裝一次。結果應該如下方所示:若沒有安裝 Docker,下圖Server端會顯示找不到 Docker 的錯誤。此時則需在終端機指令區中,執行
$ sudo yum install -y docker
。$ docker version
Client: Version: 18.06.1-ce
API version: 1.38
Go version: go1.10.3
Git commit: e68fc7a215d7133c34aa18e3b72b4a21fd0c6136
Built: Fri Oct 26 23:38:19 2018
OS/Arch: linux/amd64
Experimental: falseServer:
Engine:
Version: 18.06.1-ce
API version: 1.38 (minimum version 1.12)
Go version: go1.10.3
Git commit: e68fc7a/18.06.1-ce
Built: Fri Oct 26 23:39:46 2018
OS/Arch: linux/amd64
Experimental: false- 透過 Dockerfile 建立 Docker 映像檔。
注意: 請將
<your-image-name>
替換為你要為 docker 映像檔REPOSITORY 加的標籤名稱 ,而最後方的.
則代表著 Dockerfile 存放的路徑可能是在任何地方。Docker 將根據你的 Dockerfile 創建映像檔。$docker build -t
.
Sending build context to Docker daemon 18.43kB
Step 1/2 : FROM php:7.2-apache
7.2-apache: Pulling from library/php
5e6ec7f28fb7: Pull complete
cf165947b5b7: Pull complete
7bd37682846d: Pull complete
99daf8e838e1: Pull complete
ae320713efba: Pull complete
ebcb99c48d8c: Pull complete
9867e71b4ab6: Pull complete
936eb418164a: Pull complete
5d9617dfb66b: Pull complete
8dd7afaae109: Pull complete
8f207844da7e: Pull complete
adb3ae5e4987: Pull complete
44d7d07029db: Pull complete
fb91064652b0: Pull complete
Digest: sha256:b840f37df10893e6dd4f722bf40032ae072e6f63352e2e6c14370a79057fa2c9
Status: Downloaded newer image for php:7.2-apache
—> e2834342b873
Step 2/2 : RUN echo “Hello World!” > /var/www/html/index.html
—> Running in 6d3f2ea3aa85
Removing intermediate container 6d3f2ea3aa85
—> bf7eda5138c7
Successfully built bf7eda5138c7
Successfully tagged:latest -
列出 docker 映像檔來檢測你新建的映像檔是否被正確的建立。我們應該要在執行下列指令碼後,看到其中一項映像檔REPOSITORY 的標籤名稱為
<your-image-name>
。$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
latest bf7eda5138c7 About a minute ago 378MB
php 7.2-apache e2834342b873 2 days ago 378MB
lambci/lambda nodejs4.3 4f521df1e2d3 7 weeks ago 940MB
lambci/lambda python3.6 4a6785b2780d 7 weeks ago 1.07GB
lambci/lambda python2.7 9e29188f3f15 7 weeks ago 946MB
lambci/lambda nodejs6.10 fec3cfdc31b4 7 weeks ago 991MB
啟動 Docker 容器
-
透過新建的映像檔啟動容器(Container),其中
-p 8080:80
會將容器上公開的連接埠80
對應至主機系統上的連接埠8080
。(連接埠8080
為 Cloud9 預設的連接埠)注意:
<your-container-name>
是你要為啟動的 Docker 容器取的名字。$docker run –name
-d -p 8080:80
2e3cdb60da3b1476ba0f7009504b0a5ed06abeabe5ca4beae27e048f437bbfbf輸出的結果為容器的ID,每一個 Docker 容器皆有屬於自己的容器ID。
-
使用
docker ps -a
列出容器的清單,一旦容器被正確的啟動,你將能在清單中找到一筆容器的 CONTAINER NAME 為自己新啟動的容器名稱。$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2e3cdb60da3b“docker-php-entrypoi…” About a minute ago Up About a minute 0.0.0.0:8080->80/tcp
觀察執行結果
- 點選頁面上方的 Preview 按鈕,然後按下 Preview Running Application,你將不用另外打開網頁,便能預覽你的執行結果。
- 執行結果應如下圖所示:
>若你按下上方的網址列:/
,你就能看到指向 Cloud9 連接阜8080 的端點位址,而不是單純的:/
,看起來會是這樣子:https://<your-container-ID>.vfs.cloud9.us-east-1.amazonaws.com/
-
最後你可以使用
docker top
,來觀察容器正在執行中的程序:$ docker top
UID PID PPID C STIME TTY TIME CMD
root 5128 5109 0 02:23 ? 00:00:00 apache2 -DFOREGROUND
33 5203 5128 0 02:23 ? 00:00:00 apache2 -DFOREGROUND
33 5204 5128 0 02:23 ? 00:00:00 apache2 -DFOREGROUND
33 5205 5128 0 02:23 ? 00:00:00 apache2 -DFOREGROUND
33 5206 5128 0 02:23 ? 00:00:00 apache2 -DFOREGROUND
33 5207 5128 0 02:23 ? 00:00:00 apache2 -DFOREGROUND
結論
現在你已經學會了如何在 Docker 容器上顯示簡單的網頁。對於想要學習 Docker 容器的初學者來說,這只是一個簡單的入門教學。然而,Docker 還能做到更多的事情,你甚至可以從 Docker hub 上面,自行下載映像檔來練習,進行更進一步的實作。
參考資料
Tag:AWS, AWS Cloud9, Container, Containerization, Docker, Ec2