使用 Docker 建構容器 - ianchen0119/Introduce-to-5GC GitHub Wiki

前言

在這之前,我們必須了解到: 在 Docker 的世界中會有許多的 image file,而這些 image file 都是其開發者撰寫 dockerfile 後使用 docker build 將專案原始碼打包而成的。

將 dockerfile 放置在需要打包的專案資料夾後,輸入:

docker build .

就可以將它打包成 docker image 啦! 此外,我們也可以使用以下命令檢查電腦中存放了哪些 docker image:

docker image ls

image 與 container 的關係

就好比作業系統中 program 與 process 的關係,當 image 被 docker 運作起來實體化後,就是一個 docker container 啦!

進入正題

目前網路上已經有很多 NF 容器化的範例可以參考,這邊以 free5gc/free5gc-compose 為例:

FROM free5gc/base:latest AS builder
FROM alpine:3.15

LABEL description="Free5GC open source 5G Core Network" \
    version="Stage 3"

ENV F5GC_MODULE amf
ARG DEBUG_TOOLS

# Install debug tools ~ 100MB (if DEBUG_TOOLS is set to true)
RUN if [ "$DEBUG_TOOLS" = "true" ] ; then apk add -U vim strace net-tools curl netcat-openbsd ; fi

# Set working dir
WORKDIR /free5gc
RUN mkdir -p config/ log/ support/TLS/ ${F5GC_MODULE}/

# Copy executable and default certs
COPY --from=builder /free5gc/${F5GC_MODULE} ./${F5GC_MODULE}
COPY --from=builder /free5gc/support/TLS/${F5GC_MODULE}.pem ./support/TLS/
COPY --from=builder /free5gc/support/TLS/${F5GC_MODULE}.key ./support/TLS/

# Move to the binary path
WORKDIR /free5gc/${F5GC_MODULE}

# Config files volume
VOLUME [ "/free5gc/config" ]

# Certificates (if not using default) volume
VOLUME [ "/free5gc/support/TLS" ]

# Exposed ports
EXPOSE 8000
  • FROM 關鍵字會載入該容器所需的執行環境,以 amf 的環境來看,就需要 alpine (一個輕量化的 Linux 作業系統)以及 free5gc/base
  • LABEL 關鍵字可以讓開發者新增該容器的資訊。
  • ENV 關鍵字可以幫助我們定義一些變數,讓 Docker 執行剩餘指令時可以參考該變數的內容。
  • ARG 關鍵字可以供我們定義 docker build 時需要傳入的參數。
docker build -t NF_AMF --no-cache --build-arg DEBUG_TOOLS=true .
  • WORKDIR 關鍵字可以讓 Docker 知道需要移動到哪一個 Path 作為當前的工作目錄。
  • VOLUME 關鍵字可以供我們建立一個 Docker volume,每一個 Docker volume 都會 mapping 到電腦中的實體檔案系統上,所以資料是可以永久保存的,不怕 container 停止運作以後遺失資料。
  • EXPOSE 關鍵字可以告訴 Docker 要讓 Container 的哪一個 PORT 提供對外服務。

補充資訊[1]: Docker volume

除了像是剛剛那樣在 dockerfile 內使用 VOLUME 關鍵字,還可以在 docker run 時使用 -v 參數建立 volume:

docker run -it -v /Users/ianchen/storage:/storage ...
  • 前者 /Users/ianchen/storage 為電腦的實體位址,後者為 container 的 path。
  • -it 參數可以讓 container 運作以後進入互動模式。

此外,使用 docker volume ls 可以列出目前已經存在的 volume:

補充資訊[2]: 檢查 volume 的掛載位址

如果將情境換成在沒有指定實體路徑的情況下就建立 volume:

docker run -it -v /storage ...

可以透過以下方式檢查 volume 的實體位址:

docker inspect -f '{{.Mounts}}' CONTAINER_ID

補充資訊[3]: Container 之間共享 volume

假設已經有一個運作中並帶有 volume 的 Container: container1,若我們希望 container2 可以與 container1 共享 volume,可以使用以下指令:

docker run -it --volumes-from container1 --name=container2 ...

References