DockerNotes

Docker 入門筆記


1. Docker 使用流程與說明

使用流程

  1. 撰寫或下載鏡像(Image)
    • 從官方倉庫(如 Docker Hub)下載現有鏡像,或者基於自己的需求撰寫 Dockerfile
  2. 構建鏡像(Build Image)
    • 使用 docker build 指令,從 Dockerfile 中構建自定義鏡像。
  3. 運行容器(Run Container)
    • 基於鏡像啟動容器,並配置端口、卷等。
  4. 操作容器(Manage Container)
    • 通過指令啟動、停止、刪除容器,或進行調試。
  5. 跨裝置遷移與部署
    • 使用 Docker Compose 或導出鏡像,快速在其他設備上配置環境。
      這樣做的好處是運行環境是完全一致的,無論是在本地、測試還是生產環境。

主要指令與說明

  • docker pull [OPTIONS] [IMAGE:TAG]

    • 從 Docker Hub 或其他註冊表下載指定的鏡像。
    • [OPTIONS]
      • --all-tags:下載指定鏡像的所有標籤。
    • 範例
      1
      docker pull python:3.9
  • docker build [OPTIONS] [CONTEXT]

    • 根據 Dockerfile 構建鏡像。
    • [OPTIONS]
      • -t [NAME:TAG]:給鏡像命名並指定標籤。
      • --no-cache:不使用緩存,強制重新構建。
    • 範例
      1
      docker build -t my-python-app .
  • docker run [OPTIONS] [IMAGE] [COMMAND]

    • 基於指定的鏡像啟動容器。
    • [OPTIONS]
      • -d:後台運行容器。
      • -p [HOST_PORT]:[CONTAINER_PORT]:映射主機和容器端口。
      • --name [NAME]:指定容器名稱。
      • -v [HOST_PATH]:[CONTAINER_PATH]:掛載本地文件或目錄到容器。
      • --rm:容器運行結束後自動刪除。
    • 範例
      1
      docker run -d -p 5000:5000 --name my-python-container python:3.9

從 Docker Hub 下載現有鏡像範例

  • 下載 Python 鏡像並運行交互模式
    1
    2
    docker pull python:3.9
    docker run -it python:3.9 python
    執行後你會進入 Python 交互環境,可以直接輸入程式碼測試。
    1
    2
    print("Hello from Docker!")
    exit()

使用 Dockerfile 構建與運行 Python 專案的完整流程


1. 撰寫 Dockerfile

在專案目錄下建立 Dockerfile,內容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 使用基礎映像
FROM python:3.9-slim

# 設置工作目錄
WORKDIR /app

# 複製依賴文件並安裝依賴
COPY requirements.txt requirements.txt
RUN pip install --no-cache-dir -r requirements.txt

# 複製程式碼
COPY . .

# 暴露應用運行的端口
EXPOSE 5000

# 啟動指令
CMD ["python", "app.py"]

2. 構建鏡像

運行以下指令,將 Dockerfile 轉換為鏡像:

1
docker build -t my-python-app .
  • -t my-python-app:給鏡像取名為 my-python-app
  • .:表示 Dockerfile 所在的目錄。

完成後,Docker 會生成一個新的鏡像,你可以使用以下指令查看:

1
docker images

3. 運行容器

基於剛剛構建的鏡像,啟動一個容器來執行代碼:

1
docker run -d -p 5000:5000 --name my-container my-python-app
  • -d:後台運行容器。
  • -p 5000:5000:將容器內的 5000 端口映射到主機的 5000 端口。
  • --name my-container:給容器取名為 my-container
  • my-python-app:基於剛剛構建的鏡像運行。

此時,容器已經啟動並執行程式,打開瀏覽器訪問 http://localhost:5000,應該能看到你的應用在運行。

4. 調試和修改代碼

進入容器:

1
docker exec -it my-container /bin/bash

在容器內執行 Python 腳本或進行調試:

1
python app.py

5. 停止或刪除容器

停止容器:

1
docker stop my-container

刪除容器:

1
docker rm my-container

小結

  • Dockerfile 是用來構建鏡像的,包含了應用的運行環境和依賴。
  • 鏡像(Image) 是一個靜態模板,用於創建容器。
  • 容器(Container) 是鏡像運行後的動態實例,在裡面執行你的代碼。

2. Dockerfile 撰寫與範例

Flask 範例程式碼

Flask 應用程式 (app.py)

1
2
3
4
5
6
7
8
9
from flask import Flask
app = Flask(__name__)

@app.route("/")
def home():
return "Hello, Docker!"

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

requirements.txt

1
flask

Dockerfile 的結構與範例

Dockerfile 範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 使用基礎鏡像
FROM python:3.9-slim

# 設定工作目錄
WORKDIR /app

# 安裝依賴
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 複製應用代碼
COPY . .

# 暴露端口
EXPOSE 5000

# 容器啟動時執行的指令
CMD ["python", "app.py"]
  • 構建與運行
    1
    2
    docker build -t flask-app .
    docker run -d -p 5000:5000 flask-app

3. 多裝置間的環境配置與多運行環境

使用 Docker Compose 快速配置多運行環境

docker-compose.yml 範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
version: '3.8'
services:
nodejs:
image: node:16
container_name: nodejs-container
volumes:
- ./node-app:/app
command: ["node"]
ports:
- "3000:3000"

python:
image: python:3.9
container_name: python-container
volumes:
- ./python-app:/app
command: ["python"]
ports:
- "5000:5000"

mysql:
image: mysql:8
container_name: mysql-container
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: mydb
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql

volumes:
mysql-data:

運行指令

  1. 在專案目錄下運行:
    1
    docker-compose up -d
  2. 檢查服務:
    1
    docker ps

4. Docker 運作流程圖

以下是 Docker 在 Client-Server 模式下的運作示意:

Docker
Docker

5. 重點整理

  • Docker 核心流程

    1. 撰寫 Dockerfile
    2. 使用 docker build 構建鏡像。
    3. 使用 docker run 啟動容器。
    4. 使用 docker-compose.yml 定義多服務環境。
  • 常用指令

    • docker build:構建鏡像。
    • docker run:運行容器。
    • docker-compose up:運行多服務環境。
  • 高效管理技巧

    • 使用 Dockerfile 定義環境,確保可重現性。
    • 使用 docker-compose.yml 快速配置多運行環境。
  • Q&A

    • Q:docker run只讓容器執行一次並退出,但仍然存在,而start是讓容器持續運行嗎
      A:
      1. docker run 的行為
        docker run 是基於鏡像創建並啟動一個新的容器,執行 CMD 或 ENTRYPOINT 中定義的指令。
        如果是一次性任務(如腳本執行完畢),容器會執行完畢後自動退出,但仍然存在於 docker ps -a 中。
        若程式是持續運行(如 Web 伺服器),則會一直保持運行狀態,直到手動停止。
      2. docker start 的行為
        docker start 只能用於已經創建過的、處於停止狀態的容器。
        它會重新啟動該容器,但不會重新執行 CMD 指令(如果上次執行完畢,容器會馬上退出)。
        如果是持續運行的程式,docker start 會讓它繼續運行。
    • Q:build鏡像假設名稱重複會怎麼辦?
      A:會 覆蓋掉原本相同名稱和標籤的鏡像,不會出錯。
    • Q:run 容器名稱重複會怎麼辦?
      A:會報錯,提示容器名稱已存在。