Docker 的學習主要可分為容器操作及 Image 建置兩部分,今天透過一些簡單的 Lab 來學習容器操作的基本方式以及一些實用技巧。
若想要在自己的環境下安裝 Docker,可以參考 Install Docker Engine 指南,本次 Lab 中,我們會使用在Day5 中介紹的 Cloud Shell,裡面已經安裝好 Docker 的環境,只要透過瀏覽器就能直接使用。
進入 Cloud Shell 網站
確認右上角編輯器與終端機皆已開啟
點擊終端機輸入指令
檢查docker版本,確認是否已安裝
docker -v
(輸出結果)
Docker version 20.10.8, build 3967b7d
來試著使用 Container 建立出 Nginx 的應用,分為兩個步驟
首先需要找到包含 Nginx 應用的 Image ,可以到 Docker Hub 上搜尋。
找到 Image 之後,就可以透過docker run <image>
建立容器,並下參數 -p <主機port>:<容器port>
,當對主機的8080連接埠發出請求,就轉送到容器的80連接埠。
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
來查看容器狀況。
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 代表成功運行,可以透過瀏覽器實際驗證一下。
網頁預覽->透過以下通訊預覽 : 8080
在瀏覽器上可以看到 Nginx 服務成功運行。
建好 container 之後,可以試著對它進行更多操作。
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) 就可以順利執行。
<container id>
改成你的容器 iddocker 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
。
exec
指令執行容器的 shell,將<container id>
改成你的容器 iddocker exec -it <container id> /bin/sh
ls
來檢查是否已進入到容器ls
進入到容器內部,把index.html
檔案置換掉。
index.html
檔案位置cd /usr/share/nginx/html && ls
(輸出結果)
50x.html index.html
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
exit
網頁預覽->透過以下通訊預覽 : 8080
在瀏覽器上可以看到新的 html 檔案。
若將剛建立的容器刪除掉,裡面新建的index.html
也會一併消失,所以如果遇到容器內部檔案會有修改的情形(如資料庫資料、網頁檔案),就可以使用 Docker Volume,透過存儲卷,就能夠將本地的路徑 Mount 到容器裡的路徑,當容器消失後,檔案還是能保留在主機裡。以下就透過實際 Lab 來練習如何建立 Docker Volume 來保留index.html
檔案。
<container id>
改成你的容器 iddocker stop <container id>
<container id>
改成你的容器 iddocker rm <container id>
docker ps -a
(輸出結果)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
刪除完容器後,我們先在本地建立資料夾作為存儲卷,並放入 index.html 檔案。
nginx
資料夾cd && mkdir nginx
index.html
檔案cd nginx && touch index.html
接著來試著使用 Cloud Shell Editor 來編輯index.html
檔案
左上 Explorer -> Open Folder -> 選擇nginx資料夾 -> Open
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>
設定完成之後,就可以來啟動容器了,這次我們多新增了-v <主機path>:<容器path>
來建立存儲卷。
docker run -d -p 8080:80 -v ~/nginx:/usr/share/nginx/html nginx
(輸出結果)
56a2f5c01c580f6c4c3bc53905176cddd48dcac950955c5509319325755eac0e
因為本地端已經有 Nginx 的 Image 了,所以這次啟動就不會下載 Image了。
網頁預覽->透過以下通訊預覽 : 8080
在瀏覽器上可以看到新的 html 檔案。
可以嘗試修改index.html
檔案,或是把剛剛的容器給刪除,來確認看看與你設想的情況是否吻合。
今天透過 Docker Lab 來熟悉容器操作的基本技巧,明天將著重在如何建置 Image 並上傳到 Container Registry上。