自己目前的理解 (隨時會改寫)
Docker 與虛擬機 VM 最大差異在於 docker container 執行時可視作一個程序在前台執行,沒有後台的概念,也因此不需要包入作業系統去控制後台服務。
docker build flow
上圖理解,由dockerfile定義image內容,並依以下流程進行控制:
- 建構 映像"image" (拉取"pull" Dokcer Hub 提供 base image)
- 啟動 容器"container"
- 控制 容器狀態 (開始/停止/重啟)
- 提交"commit" 容器內容修改,並生成新的 image
- 推送"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" ]