使用 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 啦!
docker run
等價於docker create
+docker start
。- 更詳細的操作可以參考了解 docker run 指令一文。
進入正題
目前網路上已經有很多 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 ...