[微服務] Docker基礎(4) - 建立自己的Docker Image吧

Overview

  • Dockerfile
    • 表明我們的container要如何運作
      • 有甚麼程式要在此container運作
    • 只需要幾個簡單的command就可以製作
    • 過程
      • 標註那些是基本的Image
      • 撰寫基本command還有安裝額外的程式
      • 撰寫當container啟動時的command

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網址
  • 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最後要的東西

留言

這個網誌中的熱門文章

Java Lambda Map篇

(InterviewBit) System Design - Design Cache System

設計模式 - 享元模式 (Structural Patterns - Flyweight Design Pattern)