Docker (8) dockerfile 範例

本文示範一個簡單的 dockerfile 並說明常用的指令。

1. Dockerfile:

Dockerfile 是一個構築 Doker image 的腳本,執行 docker build 的時候會依照指定流程建構 image。


2. 建立專案:

考慮一個 Flask 專案,結構長得像下面這樣:

.
├── app.py     # flask application
└── dockerfile # image 腳本

Flask 是一個 Python 的 web 框架,可以快速建立 web service。

Flask 預設使用 127.0.0.1:5000,下面在 IP:5000/hello 新增一個服務。

from flask import Flask

app = Flask(__name__)

@app.route('/hello')
def hello_world():
    return 'Hello, World!'

if __name__ == "__main__":
    app.run(host="0.0.0.0")

開啟終端機,啟動 Flask:

$ pip3 install flask # 安裝 flask
$ python3 app.py

然後可以開啟瀏覽器,驗證 127.0.0.1:5000/hello。

3. 打包服務:

編輯 dockerfile:

# FROM 設定基礎 image
FROM python:3.7-stretch

# RUN 執行指令,安裝套件或是建立資料夾
RUN apt-get update -y && \
    apt-get install -y vim && \
    apt-get install -y less && \
    apt-get install -y net-tools && \
    pip install -U pip && \
    pip3 install flask && \
    mkdir /home/flask_demo
    
# COPY 將檔案如 app.py 拷貝到 image 的指定資料夾
COPY . /home/flask_demo

# WORKDIR 指定 image 運行時的資料夾
WORKDIR /home/flask_demo

# EXPOSE 說明服務需要的 port
EXPOSE 5000

# CMD 執行指令
CMD ["python3", "app.py"]

需要注意的是 Dockerfile 每個指令都會建立一個鏡像層 (像洋蔥一樣),所以即便有多個命令也會寫在同一個 RUN 裡面。

打包 image 並啟動服務。 EXPOSE 不會自己設定 port,所以要自己指定。

$ docker build -t flask_hello . # . 設定 COPY 時的 source 目錄
$ docker run -it --rm -p5000:5000 flask_hello
透過 docker ps -a 指令可以觀察到 0.0.0.0:5000->5000/tcp,代表主機 5000 有連接到容器。

留言

熱門文章