自上一篇「[Docker] 從零開始的指令基礎操作」針對 Docker 核心的操作進行說明之後,莫名其妙又多寫了一篇,主要是針對 Container 的 Volume 操作做了一些研究,基本上整個 Docker 並不難理解,而且也具備系統性,至是檔案系統部分需要花一些時間理解與吸收,並且隨手筆記。
前言
某些時候使用 Docker 不是為了執行一項服務,而是當作工具包來使用,故不需要將 Container 先跑起來就可以直接操作 Container 內的工具或套件來使用,這也是為什麼 Docker 受到青睞的原因之一,既不用擔心環境相容性的問題,也不必擔心原本的環境受到汙染。
docker run <Image> <Command>
Docker Volume
如果執行過上方的 /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
以外,還有 always
、unless-stopped
、on-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>