[Note] Docker 使用

Jacky | Feb 5, 2024 min read

自己目前的理解 (隨時會改寫)

Docker 與虛擬機 VM 最大差異在於 docker container 執行時可視作一個程序在前台執行,沒有後台的概念,也因此不需要包入作業系統去控制後台服務。

docker build flow

Flowchart

上圖理解,由dockerfile定義image內容,並依以下流程進行控制:

  1. 建構 映像"image" (拉取"pull" Dokcer Hub 提供 base image)
  2. 啟動 容器"container"
  3. 控制 容器狀態 (開始/停止/重啟)
  4. 提交"commit" 容器內容修改,並生成新的 image
  5. 推送"push" 新的 image到 Docker hub

PS. docker image 生成如同一個黑箱,開發盡量不要依靠 commit 修改,避免 image 膨脹。

Python Dockerfile Example

FROM python:3

WORKDIR /usr/src/app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD [ "python", "./your-daemon-or-script.py" ]

python - Official Image | Docker Hub

Dockerfile 常用命令

FROM

設定 Base image 來做為基礎環境,在由此堆疊自己的功能

基礎環境可從 Docker Hub 拉取,也可以設定 scratch 來建構空白 image

WORKDIR

設定工作路徑

RUN

用來執行Command,可視為單純跑指令

shell格式 RUN <command>
exec格式 RUN ["execfile", "arg1", "arg2"]

CMD

用來指定容器啟動程式及參數,可執行Command,也能用來運行可執行文件

shell格式 CMD <command>
exec格式 CMD ["execfile", "arg1", "arg2"]

ENTRYPOINT

CMD 一樣都是用來指定容器啟動程式及參數,但是可讓 docker run 附加參數

shell格式 ENTRYPOINT <command>
exec格式 ENTRYPOINT ["execfile", "arg1", "arg2"]

ENV

設定環境變數

格式(1) ENV <key> <value>
格式(2) ENV <key1>=<value1> <key2>=<value2>

ARG

設定建構參數,效果類似 ENV,但僅限建構時使用,容器運行時即消失,但似乎會被 docker history 所記錄

格式 ARG <key>=<value>

Docker 常用命令

查看 docker 裡有哪些 Image

docker images

查看當下正在運作的 Container

docker ps

從 Dockerfile 生成 Image

docker build -t tag_name .

build 中 . 代表讀取現在目錄的 Dockerfile

從 Image 準備 Container

docker create

從 Image 啟動 Container 並運行

docker run
docker run --name [container_name] -p 8080:8080 -d [image_name]

參考

重新啟動 Container

docker start [id]

從 detach 進入 attach

docker exec -it [id] bash
docker exec -it [name] /bin/bash

從 attach 進入 detach (Windows)

先按 Ctrl + P 再按 Ctrl + Q,讓 Container 回到背景運作,不要直接關閉

中止 Container 運作

docker stop [id]

刪除 Container

docker rm [id]

刪除 Image

docker rmi [id]

Container 存為 Image

docker commit [CONTAINER_ID] [IMAGE_NAME]
docker save -o [IMAGE_NAME].tar [IMAGE_NAME]
docker load --input [IMAGE_NAME].tar

django dockerfile

FROM python:3.10.9-slim

LABEL maintainer="Jacky"

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD [ "python", "src/manage.py", "runserver" ]

Reference

comments powered by Disqus