iT邦幫忙

2021 iThome 鐵人賽

DAY 7
0
DevOps

DevOps 好想學!新手也能打造雲端 Study Lab系列 第 7

Day07 - Docker 101 容器操作篇

前言

Docker 的學習主要可分為容器操作及 Image 建置兩部分,今天透過一些簡單的 Lab 來學習容器操作的基本方式以及一些實用技巧。

重點整理

環境建置

若想要在自己的環境下安裝 Docker,可以參考 Install Docker Engine 指南,本次 Lab 中,我們會使用在Day5 中介紹的 Cloud Shell,裡面已經安裝好 Docker 的環境,只要透過瀏覽器就能直接使用。

  1. 進入 Cloud Shell 網站

  2. 確認右上角編輯器與終端機皆已開啟

  1. 點擊終端機輸入指令

  2. 檢查docker版本,確認是否已安裝

docker -v

(輸出結果)

Docker version 20.10.8, build 3967b7d

使用 Docker 建立 Nginx 服務

來試著使用 Container 建立出 Nginx 的應用,分為兩個步驟

  • 找到需要使用的 Image
  • 帶正確的參數啟動 Container

首先需要找到包含 Nginx 應用的 Image ,可以到 Docker Hub 上搜尋。

找到 Image 之後,就可以透過docker run <image>建立容器,並下參數 -p <主機port>:<容器port>,當對主機的8080連接埠發出請求,就轉送到容器的80連接埠。

  1. 建立 Nginx 容器
  • Image: nginx
  • 將本機 8080 Port 轉送到容器 80 Port : -p 8080:80
  • 需要在背景執行: -d
docker run -p 8080:80 -d nginx

(輸出結果)

Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
a330b6cecb98: Pull complete
5ef80e6f29b5: Pull complete
f699b0db74e3: Pull complete
0f701a34c55e: Pull complete
3229dce7b89c: Pull complete
ddb78cb2d047: Pull complete
Digest: sha256:a05b0cdd4fc1be3b224ba9662ebdf98fe44c09c0c9215b45f84344c12867002e
Status: Downloaded newer image for nginx:latest
dc761dce1ebbfe59d55c01b84d49536ca9aa19ded5d94c520adcb16d032334ad

建立過程中,Docker 會先到本地端尋找有無名稱叫 nginx 的 Image ,發現沒有後就會從 Docker Hub 尋找,並將其下載至本地端。接著就會將 Image 放入容器裡執行,可以使用docker ps來查看容器狀況。

  1. 查看所有容器
docker ps

(輸出結果)

CONTAINER ID  IMAGE  COMMAND                CREATED       STATUS        PORTS         
dc761dce1ebb  nginx  "/docker-entrypoint.…" 2 minutes ago Up 45 seconds 0.0.0.0:8080->80/tcp

Status 顯示 Up 代表成功運行,可以透過瀏覽器實際驗證一下。

  1. 在 Cloud Shell 點擊網頁預覽->透過以下通訊預覽 : 8080

在瀏覽器上可以看到 Nginx 服務成功運行。

編輯 Nginx 服務

建好 container 之後,可以試著對它進行更多操作。

  1. 查看所有容器
docker ps

(輸出結果)

CONTAINER ID  IMAGE  COMMAND                CREATED        STATUS         PORTS         
14941dce1ebb  nginx  "/docker-entrypoint.…" 2 minutes ago  Up 45 seconds  0.0.0.0:8080->80/tcp

接著使用docker exec <container id> <command>來對容器下指令,其中的<container id>可以從docker ps的顯示結果得知,在輸入時只要輸入前4-5碼 (如 1494) 就可以順利執行。

  1. 使用 curl 來檢查首頁回傳內容,將<container id>改成你的容器 id
docker exec <container id> curl http://localhost

(輸出結果)

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

若一次要輸入多個指令,可以直接進入到容器裡面操作,方法就是利用exec的指令執行/bin/sh,並且帶入參數-it

  1. 使用exec指令執行容器的 shell,將<container id>改成你的容器 id
docker exec -it <container id> /bin/sh
  1. 使用 ls 來檢查是否已進入到容器
ls

進入到容器內部,把index.html檔案置換掉。

  1. 移動到 nginx 放置 index.html 檔案位置
cd /usr/share/nginx/html && ls

(輸出結果)

50x.html  index.html
  1. 取代index.html檔案
cat > index.html <<EOF
<!DOCTYPE html>
<html>
<head>
<title>Welcome to Container</title>
<style>
    h1 {
        text-align:center;
        font-weight: 300;
        font-size: 60px;
        font-family: monospace;
    }
</style>
</head>
<body>
<h1>This is my first container project</h1>
</body>
</html>
EOF
  1. 完成操作以後,就可以退出 shell 了
exit
  1. 在 Cloud Shell 點擊網頁預覽->透過以下通訊預覽 : 8080

在瀏覽器上可以看到新的 html 檔案。

使用 Docker 存儲卷

若將剛建立的容器刪除掉,裡面新建的index.html也會一併消失,所以如果遇到容器內部檔案會有修改的情形(如資料庫資料、網頁檔案),就可以使用 Docker Volume,透過存儲卷,就能夠將本地的路徑 Mount 到容器裡的路徑,當容器消失後,檔案還是能保留在主機裡。以下就透過實際 Lab 來練習如何建立 Docker Volume 來保留index.html檔案。

  1. 停止 container,將<container id>改成你的容器 id
docker stop <container id>
  1. 刪除 container,將<container id>改成你的容器 id
docker rm <container id>
  1. 確認是否已成功刪除
docker ps -a

(輸出結果)

CONTAINER ID  IMAGE  COMMAND                CREATED       STATUS        PORTS   

刪除完容器後,我們先在本地建立資料夾作為存儲卷,並放入 index.html 檔案。

  1. 建立nginx資料夾
cd && mkdir nginx
  1. 建立index.html檔案
cd nginx && touch index.html

接著來試著使用 Cloud Shell Editor 來編輯index.html檔案

  1. 點擊左上 Explorer -> Open Folder -> 選擇nginx資料夾 -> Open

  1. 點擊index.html檔案並貼上以下內容

  • index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to Cloud Shell</title>
<style>
    h1 {
        text-align:center;
        font-weight: 300;
        font-size: 60px;
        font-family: monospace;
    }
</style>
</head>
<body>
<h1>From Docker volume</h1>
</body>
</html>
  1. 按 Ctrl + s 儲存

設定完成之後,就可以來啟動容器了,這次我們多新增了-v <主機path>:<容器path>來建立存儲卷。

  1. 建立 Nginx 容器
  • Image: nginx
  • 將本機 8080 Port 轉送到容器 80 Port : -p 8080:80
  • 需要在背景執行: -d
  • 存储卷: ~/nginx:/usr/share/nginx/html
docker run -d -p 8080:80 -v ~/nginx:/usr/share/nginx/html nginx

(輸出結果)

56a2f5c01c580f6c4c3bc53905176cddd48dcac950955c5509319325755eac0e

因為本地端已經有 Nginx 的 Image 了,所以這次啟動就不會下載 Image了。

  1. 在 Cloud Shell 點擊網頁預覽->透過以下通訊預覽 : 8080

在瀏覽器上可以看到新的 html 檔案。

可以嘗試修改index.html檔案,或是把剛剛的容器給刪除,來確認看看與你設想的情況是否吻合。

總結

今天透過 Docker Lab 來熟悉容器操作的基本技巧,明天將著重在如何建置 Image 並上傳到 Container Registry上。


上一篇
Day06 - Docker 簡介,Container是什麼 ?
下一篇
Day08 - Docker 101 Image 建置篇
系列文
DevOps 好想學!新手也能打造雲端 Study Lab30

尚未有邦友留言

立即登入留言