本文目的:試著通過docker啟動一個鏡像 (以Nginx為例)
- 鏡像是什麼
- 啟用Nginx鏡像
- 常用指令
1.鏡像是什麼
是一個獨立的軟件包,包含程式碼、運行的庫、環境變量跟配置文件。可以從遠程倉庫下載,或者自行製作。
提到Docker鏡像,要先了解UnionFS,UnionFS是Docker鏡像的基礎。
UnionFS (聯合文件系統)
可以極大節省內存空間。舉例來說:要下載tomcat跟mysql的鏡像,假設tomcat跟mysql都需要一個centos的系統。因此在下載tomcat時會連同centos一起下載,而下次mysql可以直接拿從tomcat下載過的centos來用,不需要再下載一次。

1.Base Image
之後加載的image都是從Base Image去構建出來的,是每個Image的地基,因此base image通常都是作業系統的鏡像(centOS , Ubuntu …等)
2.BootFS
因為一個Linux系統需要包含的有 BootFS 以及 RootFS 。BootFS負責加載Kernal,結束後則會被卸載,而之後只剩下RootFS,RootFS包含我們熟悉的 /dev, /proc, /bin 等目錄,以及一些指令 ( ls 、 cd …等)。
這也解釋為什麼centOS的鏡像才200多MB,因為他只提供RootFS,Kernal的部分直接與Host共用。
黑屏 → 開機進入系統 中間這段過程就是BootFS負責。
3.Image
了解完底層的運作架構,再來是鏡像的加載原理。可以透過上面那張圖發現中間那張圖以及最右邊那張圖的Image都建立在HOST的BootFS以及Base Image上。這種一層一層的文件系統,就稱為UnionFS。
每個Image都是read only (ex. 透過遠程pull過來的Image層是無法改變的,所有操作都屬於容器層)
分層的理解
以下載redis為例,因為第一層已經存在了(Already exists),所以只需要下載還沒載過的就行。

2.啟用Nginx
搜索鏡像
可以直接透過Docker Hub搜尋,用Docker Hub搜尋的好處是上面可以看到下載的幫助文檔跟詳細訊息(版本資訊),可以根據上面有列出的版本進行安裝。也可直接透過cli跑docker search進行搜尋
下載鏡像
docker pull nginx // 下載鏡像
docker images // 查看是否下載成功
透過鏡像啟動容器
docker run -d --name nginx01 -p 3344:80 nginx// 以後台模式啟動 nginx 產生的容器,並命名為nginx01。
// 因nginx默認端口是80,因此將主機的 3344 port(不一定要是3344) 映射到 容器的 80 port
到這邊正常就可以透過 主機http://${ip}:3344去訪問到nginx服務了。

如果虛擬機是建在AWS EC2上的話,因為EC2有自己的安全群組,除了設定過的 port 之外是不允許傳入傳出的。因此這邊要再建立一個傳入規則,才能正常訪問

Docker run 如何工作
Docker 是一個 Client — Server 的架構,Docker的守護進程在主機上運行,可以通過 Socket 從客戶端訪問,因此 Docker-Server 收到 Docker-Client 的命令時就會執行。

3.常用指令
docker run [可選參數] image
--name="Name" // 替容器取名。當一個鏡像run出多個容器時可以方便區分
-d // 後臺方式運行
-it // 以交互方式運行,並進入容器內
-p // 指定容器端口 (注意是小寫的p,如果是大寫的P則表示隨機指定端口) ex. -p 主機端口:容器端口 範例
docker run -it centos /bin/bash
// 這行指定的意思是 透過 centos的鏡像 建出一個容器,並使用交互模式進入該容器
// bin/bash 意思是當使用 -it 啟用交互運行時,需要指定一個控制台來負責輸入及輸出的工作 exit // 停止容器,退出容器回到主機
Ctrl + P + Q // 不停止容器,退出容器回到主機 docker ps // 列出當前運行中的容器
-a // + 歷史運行過的容器
-n // 最近創建的容器 ex. docker ps -n=1
-q // 只顯示容器的編號 docker rm <容器名稱/容器id>
// 刪除指定容器 ( 無法刪除運行中的容器,除非加上 -f ) docker rm -f $(docker ps -aq)
// 刪除所有容器 docker start <容器id> // 啟動容器
docker restart <容id> // 重啟容器
docker stop <容器id> // 停止運行中的容器
docker kill <容器id> // 強制停止運行中的容器
docker top <容器id> // 查看容器內的進程訊息 ( 方便終止容器內某個進程用 ) docker inspect <容器id> // 查看鏡像的元數據 // 通常容器都是後臺運行,有時候會需要進入容器做一些配置,此時有兩種進入容器的方式 1.docker exec -it <容器id> /bin/bash // 進入容器並開啟一個新的終端(常用) 2.docker attach <容器id> // 進入容器但會到正在運行腳本的終端,不會開啟新的
docker 從容器內把檔案copy出來到主機
docker ps // 先列出當前執行中的容器
docker attach <執行中的容器id> // 進到該容器
cd /home // 回到home頁
ls // 查看當前home頁的資料
touch test.java // 創建一個test.java的檔案
ls // 查看test.java是否建立成功
exit // 建立成功後回到主機 cd /home // 到主機的home頁
ls // 查看當前主機home頁檔案
docker cp <容器id>:<要從容器複製出來的檔案路徑> <主機路徑>
// ex. docker cp 581c24048a57:/home/test.java /home
ls // 查看是否複製成功 ** 目前這個拷貝過程是手動的,之後可以透過數據卷的方式實現自動同步 **