前言
這篇筆記整理如何用 Docker Compose 建立 Jupyter 與 TensorBoard 環境,並透過 local forwarding 在本機瀏覽器使用遠端服務。
範例 repo 放在 ThreeMonth03/Docker_example。
專案結構
這個 repository 裡有幾個重點:
jupyter/:Jupyter 服務的 Dockerfile。tensorboard/:TensorBoard 服務的 Dockerfile。docker-compose.yml:管理兩個 image 與 container。main.ipynb、logs/:用來驗證 Jupyter 與 TensorBoard 是否正常。
執行流程
如果服務跑在遠端機器上,可以先透過 SSH local forwarding 把 port 轉回本機。假設要轉兩個服務:
1 | ssh -L localhost:8323:localhost:8323 [Account]@[Server IP] |
接著在遠端機器 clone repo,並啟動服務:
1 | git clone https://github.com/ThreeMonth03/Docker_example.git |
啟動後,在本機瀏覽器打開:
1 | http://localhost:8323/ |
使用完後關閉服務:
1 | docker-compose down |
如果曾經修改過 docker-compose.yml,導致出現 orphan container,可以改用:
1 | docker-compose down --remove-orphans |
Local Forwarding
有時候遠端 server 的特定 port 不會直接對外開放。這時可以透過 SSH local forwarding,讓本機 port 對應到遠端 server 的 port。
基本格式如下:
1 | ssh -L localhost:[your_computer_port]:localhost:[server_port] [Account]@[Server IP] |
例如帳號是 threemonth,server IP 是 123.456.78.901,要把本機 9090 對到遠端 8080:
1 | ssh -L localhost:9090:localhost:8080 threemonth@123.456.78.901 |
Jupyter 與 TensorBoard 指令
Jupyter 可以用以下指令啟動:
1 | jupyter notebook \ |
幾個參數用途:
--no-browser:避免 server 嘗試打開瀏覽器。--ip=0.0.0.0:讓外部位址可以連到 Jupyter 服務。--port:指定 container 內服務 port。--allow-root:允許 root 身分執行 Jupyter。--NotebookApp.token=''與--NotebookApp.password='':關閉 token 與 password 驗證,適合搭配受控環境或 tunnel 使用。
TensorBoard 可以用以下指令啟動:
1 | tensorboard --logdir ./logs --host=0.0.0.0 --port=8081 |
幾個參數用途:
--logdir:指定 log 路徑。--host=0.0.0.0:讓外部位址可以連到 TensorBoard。--port:指定服務 port。
Image 與 Container
Docker 裡最常遇到兩個概念:image 與 container。
- Image:環境模板,描述要安裝哪些套件、預設執行什麼指令。
- Container:根據 image 開出來的執行實例,真正提供服務。
Image 可以保留並重複使用;container 用完後通常可以刪掉,下次再用同一個 image 開新的 container。
常用 Image 指令
根據 Dockerfile 建立 image:
1 | docker build -t [image_name] [path] |
例如 Dockerfile 在目前資料夾,要建立 jupyter_image:
1 | docker build -t jupyter_image . |
如果想忽略 cache 重新 build:
1 | docker build -t [image_name] [path] --no-cache |
查看 image:
1 | docker images |
刪除 image:
1 | docker image rm [image_name] |
Dockerfile 範例
以下是一個 TensorBoard image 的 Dockerfile:
1 | FROM pytorch/pytorch:1.13.0-cuda11.6-cudnn8-devel |
重點如下:
FROM:指定 base image。RUN:安裝套件或執行建置指令。CMD:container 啟動後預設執行的 command。
常用 Container 指令
建好 image 後,就可以用 docker run 建立並執行 container:
1 | docker run [options] [image_name] [command] |
常見 options:
-it:開啟互動式 terminal,常搭配bash使用。--name:指定 container 名稱,建議加上,方便管理。-p:做 port mapping,例如8080:8080。-v:mount 本機資料夾到 container 內。--gpus all:讓 container 使用 GPU。command:覆蓋 image 中的預設CMD。
只執行 jupyter_image,並命名為 jupyter_container:
1 | docker run --name jupyter_container jupyter_image |
如果想開 terminal、轉 port、掛載目前資料夾、並使用 GPU:
1 | docker run -it --name jupyter_container -p 8080:8080 -v ./:/workspace --gpus all jupyter_image bash |
離開 container:
1 | exit |
重新啟動並 attach:
1 | docker start [container_name] |
查看 container:
1 | docker ps |
刪除 container:
1 | docker rm [CONTAINER ID] |
Docker Compose
如果一次要管理多個服務,例如 Jupyter 與 TensorBoard,就適合使用 Docker Compose。它可以用一份 docker-compose.yml 管理多個 image、container、port 與 volume。
啟動服務:
1 | docker-compose up |
讓服務在背景執行:
1 | docker-compose up -d |
停用服務:
1 | docker-compose down |
清掉 orphan container:
1 | docker-compose down --remove-orphans |
docker-compose.yml 範例
1 | version: "3" |
幾個欄位對應到 docker run 的概念:
build:指定 Dockerfile 所在目錄。image:image 名稱。container_name:container 名稱。ports:對應docker run -p。volumes:對應docker run -v。restart: unless-stopped:除非手動停止,否則 container 掛掉後會自動重啟。depends_on:控制服務啟動順序。command:覆蓋 Dockerfile 中的預設CMD。
小結
Docker Compose 很適合用來管理多個彼此相關的開發服務。這個範例把 Jupyter 與 TensorBoard 分成兩個 container,再透過 volume 共用工作目錄,最後用 local forwarding 讓本機可以安全地連到遠端服務。