前言
Docker 是一個開源專案,誕生於 2013 年初,最初是 dotCloud 公司內部的一個業餘專案。它基於 Google 公司推出的 Go 語言實作。 專案後來加入了 Linux 基金會,遵從了 Apache 2.0 協議,原始碼在 GitHub 上進行維護。
Docker 自開源後受到廣泛的關注和討論,以至於 dotCloud 公司後來都改名為 Docker Inc。Redhat 已經在其 RHEL6.5 中集中支援 Docker;Google 也在其 PaaS 產品中廣泛應用。
Docker 專案的目標是實作輕量級的作業系統虛擬化解決方案。 Docker 的基礎是 Linux 容器(LXC)等技術。
在 LXC 的基礎上 Docker 進行了進一步的封裝,讓使用者不需要去關心容器的管理,使得操作更為簡便。使用者操作 Docker 的容器就像操作一個快速輕量級的虛擬機一樣簡單。
Docker 基本概念
映像檔 (Image)
- Docker 映像檔就是一個唯讀的模板。
- 映像檔可以用來建立 Docker 容器。
- Docker 提供了一個很簡單的機制來建立映像檔或者更新現有的映像檔,使用者甚至可以直接從Docker Hub下載一個已經做好的映像檔來直接使用。
容器 (Container)
- 容器是從映像檔建立的執行實例。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平台。
- 可以把容器看做是一個簡易版的 Linux 環境(包括root使用者權限、程式空間、使用者空間和網路空間等)和在其中執行的應用程式。
倉庫 (Repository)
- 倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。
- 最大的公開倉庫是 Docker Hub,存放了數量龐大的映像檔供使用者下載。
- NVIDIA AI 倉庫為 NGC,存放了 AI 常用框架的映像檔供使用者下載。
安裝
系統環境
- OS:Ubuntu 18.04
- Docker:19.03
- NVIDIA Container Toolkit:1.2.0
步驟
安裝相依性套件
1 2
| sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
|
添加 Docker GPG key
1 2
| curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo apt-key fingerprint 0EBFCD88
|
添加 Docker 套件庫 (穩定版)
1
| sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
|
安裝 docker-ce
docker-ce-cli
containerd.io
1 2
| sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io
|
添加 NVIDIA Docker 套件庫
1 2 3
| distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
|
1 2
| sudo apt-get update sudo apt-get install nvidia-container-toolkit
|
重啟 Docker
1
| sudo systemctl restart docker
|
執行 Docker 不加 Sudo (選)
1 2 3
| sudo groupadd docker sudo gpasswd -a ${USER} docker sudo service docker restart
|
Docker 基本操作
搜尋映像檔 search
在 Docker Hub 上尋找,會顯示熱度前幾名的映像檔。
1
| sudo docker search <Image Name>
|
取得映像檔 pull
將映像檔從倉庫下載到本機。
1
| sudo docker pull <Image Name>
|
全部映像檔 images
顯示本機已下載的映像檔。
建立容器 run
建立容器並啟用。
Tag |
Description |
-it |
配置一個虛擬的終端機以及讓標準輸入維持在打開的狀態 |
-d |
背景執行 |
–rm |
Container 執行結束後自動刪除 |
–name |
為 Container 命名 |
-p : |
將主機的 Port 綁定到 Container 的Port |
-v : |
將主機的資料夾掛載到 Container 資料夾 |
–gpus ‘“device=“‘ |
指定使用 GPU 編號 |
–gpus 2 |
指定使用前幾個 GPU |
–gpus all |
使用全部的 GPU |
1
| sudo docker run -it --name test --gpus all -p 20000:8888 -v /raid:/data nvcr.io/nvidia/tensorflow:20.06-tf2-py3 bash
|
可透過 exit
中回到本機系統,但第一次離開會停止容器的運行。
全部容器 ps -a
顯示本機已建立的容器。
進入運行中的容器
使用 exec
1
| sudo docker exec -it <Container ID or Name> bash
|
使用 attach
1
| sudo docker attach <Container ID or Name>
|
啟用容器 start
啟動停止的容器。
1
| sudo docker start <Container ID or Name>
|
停止容器 stop
停止啟用的容器。
1
| sudo docker stop <Container ID or Name>
|
打包容器 commit
將容器包成映像檔。
1
| sudo docker commit <Container ID or Name> <Image Name>
|
打包映像檔 save
將映像檔打包成檔案。
1
| sudo docker save -o <File Name>.tar <Image Name>
|
載入映像檔 load
將打包的映像檔檔案載入本機。
1
| sudo docker load -i <File Name>.tar
|
刪除容器 rm
刪除容器,如容器還在運行,可加 -f
,強制刪除。
1 2 3 4
| sudo docker rm <Container ID or Name>
# 強制刪除 sudo docker rm -f <Container ID or Name>
|
刪除映像檔 rmi
1
| sudo docker rmi <Image Name>
|
補充
安裝 nvidia-docker2
Docker 版本小於 19.03
,又要使用 GPU 了話,要改安裝 nvidia-docker2
,不過此套件過一陣子將不再支援,不建議安裝。
1 2 3 4 5 6 7 8 9
| # 此範例 Docker 版本為 18.06 sudo apt-get update sudo apt-get install docker-ce=18.06.1~ce~3-0~ubuntu curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt-get update sudo apt-get install -y nvidia-docker2=2.0.3+docker18.06.1-1 nvidia-container-runtime=2.0.0+docker18.06.1-1 sudo pkill -SIGHUP dockerd
|