Last Updated on 2021-08-28 by Clay
介紹
Docker 是一種輕量級的『虛擬化』技術,讓我們可以自由搭建適合自己程式開發的環境,也能打包整個配置的環境(也就是的所謂 Container,容器),讓程式即使再轉移到其他裝置上時,仍然能啟動同樣的 Docker 環境正常執行程式。
這是個很棒的技術,讓我們可以不必煩惱不同平台上需要依照不同情境做出相應配置。
既然提到 Docker,自然也不能免俗地得提一下和 Virtual Machine(VM,虛擬機器)的差異了。
大家一定都對 VM 比較熟悉:我們可以透過在電腦中安裝像是 VirtualBox 等等的軟體,在我們本機端的作業系統中完整地模擬另外一個作業系統。但是在號稱輕量化的 Docker 中,Container 是直接共用了主要的 Host OS(本機端的作業系統),所以並不像 VM 一般需要等待開機,對系統(比方說記憶體)的負擔也較小。
不過 Docker 不能沒有 Host OS,因為 Docker 仍然需要作業系統的檔案系統。
如果要建立一個 Docker 的環境,我們可以透過以下流程建立:
- 建立映像檔(Image):可以自己撰寫 Dockerfile 或 從 DockerHub 上取得
- 使用映像檔建立容器(Container)
- 開始開發(我們可以隨時退出、重新連接、關閉)
映像檔就像是我們環境的設定檔案,容器則是我們利用映像檔建立起的虛擬環境。
以下就逐步介紹如何安裝 Docker、建立 Dockerfile、啟動容器,以及如何進行這個容器的操作。
(註:僅安裝 docker 是無法直接使用 GPU 環境的,要使用 nvidia-docker 比較方便。關於 nvidia-docker 的安裝介紹會在其他文章中提及。)
安裝 Docker
Step 1. 更新系統
sudo apt-get update
Step 2. 移除舊的版本(良好的習慣)
sudo apt-get remove docker docker-engine docker.io
Step 3. 安裝 Docker
sudo apt install docker.io
Step 4. 設定讓 Docker 在系統中自動執行
sudo systemctl start docker
sudo systemctl enable docker
Output:
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /lib/systemd/system/docker.service.
如果有看到以上資訊,那 Docker 應該就安裝成功了。
製作 Dockerfile
你可以像我一樣,在工作目錄底下建立屬於自己的 Dockerfile。
在 Dockerfile 中寫下:
# Initial
FROM tensorflow/tensorflow:2.2.1-gpu-py3
# Work dir
WORKDIR /workspace
# Command
RUN pip3 install -U numpy torch torchvision transformers
RUN apt-get update
FROM 是使用到的映像檔名稱,可以上 DockerHub 查找(資源來自於 https://hub.docker.com/r/tensorflow/tensorflow/tags)
WORKDIR 是虛擬環境的工作路徑。
RUN 後頭則是直接接終端機指令,這裡我是拿來安裝 Python 的一些深度學習套件。
寫好之後,在同樣的目錄底下執行(clay/test 是我自訂的名稱,你也可以改成你的):
docker build -t clay/test .
Output:
應該會看到這樣的下載、安裝畫面。
等到配置完成後,就要啟動容器了。
docker run \
-e NVIDIA_VISBLE_DEVICES=0 \
--rm \
-it \
-p "8899" \
--name clay_test \
-v /home/ccs96307/workspace/:/workspace/Projects clay/test
這裡我要先聲明,我這樣的配置仍然無法使用 GPU 做深度學習,應該去安裝 nvidia-docker。
最重要的就是 -v
參數了,後面是將系統中真正的資料夾映射至虛擬環境中的資料夾,最後頭的 clay/test 就是剛才建立的自定義名稱了。(如果你有更改,就應該改成你的)
執行之後應該會看到進入虛擬環境中了。
Docker 的基本操作
1. 暫時退出
如果只是要暫時退出,而希望容器仍在後台運行不必關閉,直接使用:
- Ctrl + q
- Ctrl + p
- 直接關閉終端機
即可。
2. 重新連接
那既然我們退出了,那該如何連接回容器、恢復當前的工作內容呢?
docker attach clay_test
3. 徹底關閉容器
沒有比這個更簡單的了,直接:
- Ctrl + D
- 輸入 exit
即可。
References
- https://phoenixnap.com/kb/how-to-install-docker-on-ubuntu-18-04
- https://github.com/NVIDIA/nvidia-docker/wiki
- https://hub.docker.com/