[微服務] Docker基礎(4) - 建立自己的Docker Image吧
Overview
- Dockerfile
- 表明我們的container要如何運作
- 有甚麼程式要在此container運作
- 只需要幾個簡單的command就可以製作
- 過程
- 標註那些是基本的Image
- 撰寫基本command還有安裝額外的程式
- 撰寫當container啟動時的command
- 表明我們的container要如何運作
Dockerfile
Dockerfile是甚麼?
Docker Server會讀取Dockerfile根據內容打包屬於你的Image
Example
自己組裝一個redis資料庫Dockerfile
- 建立一個Dockerfile
# Use an exisiting docker image as a base
FROM alpine
# Download and install a dependency
RUN apk add --update redis
# Tell the image what to do when it starts
# as a container
CMD ["redis-server"]
- 在Dockerfile的資料夾下呼叫docker build .
- 使用docker images查看自己創建的image
Instruction
告訴Docker Server要做甚麼的指令
- FROM
- 我們要設定甚麼Image當作基底
- RUN
- 要在上面跑甚麼 (如同設定Dependency)
- CMD
- 要跑甚麼指令作為start-up
概念
如果今天要你在一台全新的電腦安裝Chorme瀏覽器(此電腦沒有安裝OS)那你會如何做呢?
而Dockerfile的功用其實就如上圖
範例
- FROM alpine
- 為什麼alpine?
- 這就如同上圖說的,你想選擇甚麼OS,今天為什麼選擇Window?Mac OS? Linux?一樣的道理,單純這個比較適合
- Alpine Docker Hub網址
- 為什麼alpine?
- RUN apk add --update redis
- apk 就是Linux Apache package (他已預先安裝於alpine image中)
運作
docker build .
- 讓docker根據dockerfile製作image
讓我們根據Docker output的訊息分析Docker收到dockfile後做了甚麼事情
- 接收到build訊號開始運作
- Step1: 根據From alpine下載alpine作為os基底
- Step2: 根據Run apk add --update redis透過alpine提供的指令包Apache Package下載redis
- 會以alpine的Image作為基底創建FS(File Snapshot)
- 創建Container並且執行Run中的Dependency(下載Redis)
- 拿出此Container的FS作為目標Image的FS基底
- 關閉此Container,並且佔存此Container產出的FS
- Steo3: 讀取Step2的FS並且客製化Image,然後解析此Image redis-server指令作為未來Container啟動時的Startup command
- 拿取Step2暫存的Image
- 並且根據此Image創建Container
- 執行CMD中的redis-server指令
- 關閉此Container
- 拿取此Container產出的Image檔案作為我們整個build的目標產物
為你的Image命名
當我們在執行上面的範例時docker build產出的Image不會有任何命名與標籤
如過要客製化名稱的話指令如下
而tag的格式如下,
- 你要命名的DockrId/此Docker專案的名稱版本號
所以假設今天,我要創建 stephengrider專屬的redis image那指令就會是
docker build -t stephengrider/redis:latest .
-t指令是告訴Docker你接下來要使用Docker制定的格式宣告Image
總結
我們再次回顧,Docker Server會如何解析你的Dockerfile
- 根據From抓取你的基底OS
- 根據RUN在此OS上執行指令並且產出暫存的Image
- 目的要使用此Image的FS(File Snapshot)
- 再跑此Image時會同時啟動一個暫時的Container
- 目的在於要真實啟動此OS
- 根據此上一步的Image啟動Container並且執行CMD中的指令
- 產出的Image為我們目標Image
- 也是我們整個Dockerfile最後要的東西
留言
張貼留言