[Docker] Container 進階操作

Photo by Magne Roed on Unsplash

自上一篇「[Docker] 從零開始的指令基礎操作」針對 Docker 核心的操作進行說明之後,莫名其妙又多寫了一篇,主要是針對 Container 的 Volume 操作做了一些研究,基本上整個 Docker 並不難理解,而且也具備系統性,至是檔案系統部分需要花一些時間理解與吸收,並且隨手筆記。

前言

某些時候使用 Docker 不是為了執行一項服務,而是當作工具包來使用,故不需要將 Container 先跑起來就可以直接操作 Container 內的工具或套件來使用,這也是為什麼 Docker 受到青睞的原因之一,既不用擔心環境相容性的問題,也不必擔心原本的環境受到汙染。

docker run <Image> <Command>

Docker Volume

Image by Docker docs

如果執行過上方的 /bin/cat 指令,就會成功讀取 /etc/passwd 的結果,但這分明是 Ubuntu 下的執行結果,如果要藉由 Ubuntu 底下的 cat 讀取原系統下的文件可以運用 -v 將路徑掛載至 Conatiner 中,再藉由工具去讀取。

docker run -v <Host File/Folder>:<Mapping File/Folder> <Image> <Command>

Ex:

docker run -v D:\Test.txt:/tmp/Test.txt ubuntu /bin/cat /tmp/Test.txt
  • 跟 Host 溝通需要注意權限問題

Volume Crate

若是 Docker 間要共用 Volume 可以先建立一個 Volume 並且在啟用 Container 時指定並 mapping。

docker volume create web-server-data

創建後可以使用 ls 來查看

docker volume ls

共用 Volume 使用範例

docker run -v web-server-data:/var/www/html --name web-server1 -p "8001:80" -d httpd 
docker run -v web-server-data:/var/www/html --name web-server2 -p "8002:80" -d httpd
docker run -v web-server-data:/var/www/html --name web-server3 -p "8003:80" -d httpd

執行完畢自動移除 Container

當執行的次數越多,使用 docker ps -a 就會發現滿滿的 Container 被建立出來,原因是在每次執行 docker run 後,都會自動建立一個新的 Container,並且在執行完指令之後自動關閉,而不是重複使用同一個 Container 執行不同指令,為了解決這個問題,可以使用 -rm 參數,可以執行完畢之後自動移除執行完的 Container。

docker run -rm -v D:\Test.txt:/tmp/Test.txt ubuntu /bin/cat /tmp/Test.txt

Container Restart

自動重啟可以透過指令 --restert 來完成,該指令除了預設值 on 以外,還有 alwaysunless-stoppedon-failure 三種模式。

docker run --restart=<Mode>:<Attempts> <Image>
  • on 預設不啟用
  • always 當 Docker 啟動,該 Container 就跟著啟動(開機自動啟動),並且發生錯誤時自動重啟。
  • unless-stopped 發生錯誤時自動重啟。
  • on-failure 當 Exit Code != 0(作意外結束)時自動重新啟動。

進入 Container 操作

如果想把 Contianer 當成虛擬機使用,就像是 Windows 底下的 WSL(https://mks.tw/3343/windows-為什麼選擇從-wsl2-降回-wsl1)一樣,其實就只是去執行 Container 底下的 /bin/bash 而已,相當簡單。

docker run ubuntu /bin/bash

另外也可以使用指令 exec 來進行操作,但僅限於「執行中」的 Container。

docker exec -it <Container> <Command>

Ex

docker run --name nginx-server -p "8001:80" -d nginx
docker exec -it nginx-server /bin/bash
  • –name 可以幫創建的 Container 取名子

Docker Network

使用 Docker 架設服務不像是一般 VPS 或 Server,把服務跟資料庫都放在同一台主機上面,依 Docker 的應用來說,通常是一個服務跑一個 Container,故 Container 間的溝通就變得相當重要,Docker Network 指令可以建立一個虛擬區域網路,讓 Container 間進行溝通。

建立 Docker Network

Docker network create <Network Name>

Container 並加入 Dockert Network

這邊設置 Container Name 相當重要,操作時可以使用 Container Name 來呼叫彼此,藉此就不需要先知道目標 IP 也可以完成連線。

Docker --name <Contain Name> --net <Network Name>

Demo

Docker network create web-net
Docker run --name web-server --net web-net -p "8001:80" -d nginx
Docker run --name db-server --net web-net -e MYSQL_ROOT_PASSWORD=test1234 -p "8002:3306" -d mysql
Docker exec -it web-server /bin/bash
# apt update
# apt install iputils-ping
# ping db-server
  • -e 指定環境變數

Kill Container

如果遇到 Stop 無法關閉的情況,可以使用 Kill 強制關閉 Container,但就有點像是直接拔除電源那樣,程式並不會進入到關機程序,可能會導致資料受損或遺失。

Docker kill <Container>

MksYi

透過網路分享知識的學習者。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料