iT邦幫忙

2021 iThome 鐵人賽

DAY 12
0
自我挑戰組

DevOps的下克上之旅( ° ∀ ° )ノ゙系列 第 12

Day12 : Docker基本操作 Dockerfile篇

應用Docker化

Docker的核心思想就是將應用給整合進Container內運行,讓這個Container可以部屬在任何機器上,這個過程被稱是Docker化 (Dockerizing)。應用Docker化分成下面幾個步驟:

  1. 編寫應用程式Code
  2. 編寫Dockerfile,Dockerfile內會包含這個應用程式該如何構建、運行
  3. 對Dockerfile運行build,產生屬於你的image
  4. 執行這個image成為一個可運行的Container

運行Dockerfile

在項目的根目錄撰寫Dockerfile,配合我們之前的文章,我們先來建立一個簡單的Dockerfile吧。

https://ithelp.ithome.com.tw/upload/images/20210914/20119044TP5vhme2oq.png

FROM httpd:2.4
LABEL maintainer="Lufor"

ENV Apple="Good Apple"

RUN echo ${Apple}

COPY . /usr/local/apache2/htdocs/
  • docker build -t web:latest .
  • docker run -d -p 8083:80 --name Web_dockerfile web:latest

寫好Dockerfile後運行docker build,-t <ImageName>:<tag>代表tag新建立出來的imagea名稱,後面的.代表當前目錄下的Dockerfile。照上述執行完後會出現一個新的images叫做web:lastest,隨後運行這個images就能使用這個Container應用了。

撰寫Dockerfile

具體Dockerfile該如何寫呢? 有很多指令,以建立一個Flask Server為例子:

# use Python Image
FROM python:3.7-slim

#Set working dir (切換目錄)
WORKDIR /app

# Copy current direction into container /app
COPY . .

#install the need of package in requirement
RUN pip install -r requirements.txt

#Make port 3000 available to the world outside
EXPOSE 3000

#Define environment (Name變數內容為World)
ENV NAME World

#RUN app.py when launch
CMD ["python","app.py"]

以下容我慢慢詳解一些常用的指令,方便你未來閱讀後可以撰寫出Dockerfile

  • FROM FROM是起手式,指定我們的基礎Image由什麼構成,本地端沒找到就會去遠端找
  • LABEL <key>=<Value> <key>=<Value> ... LABEL代表了建構出來的image的MetaData,宣示了這個專案的負責人,可以透過docker image inspect <ImageName>查看
  • WORKDIR <path> 切換目錄,未來進入Container內默認就是進入該WORKDIR
  • COPY <SRC> <TGT> 複製檔案,將你的專案複製進Image內,未來RUN時就能直接使用。如上面Flask Server的例子,由於我們已經切換WORKDIR,所以目標目錄為.
  • ENV <key>=<Value> <key>=<Value> ... 訂定系統環境變數,方便未來專案可以抓取,dockerfile的ENV可以在run container時被-e <key> <value>取代。
  • ARG <key>=<Value> <key>=<Value> ... 一樣是環境變數,注意!!,只存在於Build階段,在Container內不會出現。
  • RUN <指令1> && <指令2> && ... 在初始化時會執行的指令
  • VOLUME <TGT_PATH> or VOLUME <SRC_PATH> <TGT_PATH>指定內部持久層,Container刪除後資料不刪除,詳細可以見前幾天的文章
  • EXPOSE <PROT> Container要對外開的PORT
  • CMD ["executable","param1","param2"] 一樣是執行,但是通常用於阻塞式指令,放在最後一個指令。

以上大致就是常用的Dockerfile寫法,Dockerfile可以說是Docker的精華,未來幾天會模擬建立前後端專案,讓看到的人能更熟悉Dockerfile。


上一篇
Day11 : Docker基本操作 Docker Net篇
下一篇
Day13: DockerFile實作Node前後端(上)
系列文
DevOps的下克上之旅( ° ∀ ° )ノ゙30

尚未有邦友留言

立即登入留言