前言

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

安裝 NVIDIA Container Toolkit

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 基本操作

在 Docker Hub 上尋找,會顯示熱度前幾名的映像檔。

1
sudo docker search <Image Name>

取得映像檔 pull

將映像檔從倉庫下載到本機。

1
sudo docker pull <Image Name>

全部映像檔 images

顯示本機已下載的映像檔。

1
sudo docker 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

顯示本機已建立的容器。

1
sudo docker ps -a

進入運行中的容器

使用 exec

1
sudo docker exec -it <Container ID or Name> bash

執行 exit 時,不會中止容器。

使用 attach

1
sudo docker attach <Container ID or Name>

執行 exit 時,就會中止容器。

啟用容器 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