Docker基礎
基礎概念
Docker 是一個開源的容器化平臺,它允許開發者和系統管理員打包、分發和運行應用程序,而無需擔心底層基礎設施。Docker 使用 Linux 容器(LXC)技術,但提供了一個更易用的接口和更豐富的功能集。以下是 Docker 的一些關鍵特性和概念:
- 容器(Container):容器是 Docker 的核心概念,它是一個輕量級的、可移植的、自給自足的軟件運行環境。容器內包含了運行應用程序所需的所有內容:代碼、運行時、庫、環境變量和配置文件。
- 鏡像(Image):Docker 鏡像是一個只讀模板,包含了運行容器所需的所有內容。鏡像可以被看作是容器的藍圖,它們是不可變的,這意味著一旦創建,就不能更改。
- 倉庫(Repository):Docker 倉庫是一個集中存儲和分發 Docker 鏡像的地方。
- Dockerfile:Dockerfile 是一個文本文件,包含了一系列的指令和參數,用于自動化構建 Docker 鏡像的過程。通過編寫 Dockerfile,你可以定義如何構建你的應用程序的鏡像。
容器共享宿主機的內核,不需要像虛擬機那樣模擬整個操作系統,因此啟動速度快,資源占用少。總結來講,可以把docker當作一個小型的虛擬機。
運行模式
Docker 的運行模式可以分為幾種主要的方式,每種模式適用于不同的使用場景。在筆者的工作之中,應用最為廣泛的是交互模式和后臺模式。
交互模式
交互模式允許你啟動一個容器并與其進行交互,通常是為了調試或手動操作容器內的應用程序。
runoob@runoob:~$ docker run -i -t ubuntu:15.10 /bin/bash
root@0123ce188bd8:/#
各個參數解析:
- -t: 在新容器內指定一個偽終端或終端。
- -i: 允許你對容器內的標準輸入 (STDIN) 進行交互。
交互模式會進入容器里面
后臺模式
后臺模式使容器在后臺運行,不會占用你的終端。可以通過 docker ps 命令查看運行中的容器。
docker run -itd --name ubuntu-test ubuntu /bin/bash
注:加了 -d 參數默認不會進入容器,想要進入容器需要使用指令 docker exec
如果需要進入容器:
docker exec -it 243c32535da7 /bin/bash
其中243c32535da7為容器ID。
Docker鏡像的制作
Docker鏡像的制作主要包括以下幾個步驟:
拉取鏡像
以某一個鏡像作為基礎鏡像,這里選用的是以centos7操作系統作為基礎鏡像,該鏡像包括cuda工具和cudnn包。
docker pull nvidia/cuda:11.7.1-devel-centos7
測試樣例下載
下載需要的測試樣例,此處以cuda samplers為例,測試樣例位于github里的
/NVIDIA/cuda-samples位置。
啟動容器
docker run -itd --rm --gpus all nvidia/cuda:11.7.1-devel-centos7 /bin/bash
其中的參數解釋如下:
- ?
-it:-i保持容器的標準輸入流,允許你與容器進行交互;-t分配一個偽終端,使容器的終端更易于交互。 - ?
-d:--detach:讓容器在后臺運行,不會占用你的終端。與-it配合使用時,容器會在后臺運行,并且你可以通過終端訪問容器。 - ?
--rm:自動刪除容器:當容器停止時,Docker 會自動刪除該容器。這個選項有助于避免容器積累,節省磁盤空間。 - ?
--gpus all:允許容器訪問所有可用的 NVIDIA GPU。這個選項需要在 Docker 運行時和 GPU 驅動程序配置正確,以便容器能夠利用 GPU 進行計算加速。 ?nvidia/cuda:11.7.1-devel-centos7:Docker 鏡像的名稱和標簽:指定要使用的 Docker 鏡像。在這個例子中,使用了 NVIDIA 提供的 CUDA 11.7.1 開發環境鏡像,基于 CentOS 7。- ?
/bin/bash:容器啟動時執行的命令:啟動一個 bash shell,使你可以在容器內進行交互式操作。
將測試樣例cp到容器中
docker cp /home/cuda-samples-11.6 faa9d887f1ee:/home/
封裝鏡像
docker commit -a "jsd" -m "cuda:12.5.1 with cuda-samples-12.5" 2316bf9e3674 nvidia/cuda/12.5.1-cudnn-devel-ubuntu20.04/cudasamples:v1.0
參數說明如下:
- ?
-a "jsd":-a(--author):指定鏡像的作者信息。這里的"jsd"是作者名。 - ?
-m "cuda:12.5.1 with cuda-samples-12.5":?-m?(--message):為鏡像提交添加注釋。這條信息描述了你對容器所做的修改或鏡像的用途。在這個例子中,注釋為"cuda:12.5.1 with cuda-samples-12.5",表明這個鏡像包含了 CUDA 12.5.1 以及 CUDA 樣本代碼。 - ?
2316bf9e3674:容器的 ID。你想從這個容器創建新的鏡像。你可以通過docker ps -a命令獲取容器 ID。
登陸倉庫
docker login --username=<yourID> <提供鏡像服務的網址>
?
<password>
修改鏡像tag
docker tag <本地鏡像ID> <你的鏡像倉庫地址>
例如:
docker tag 391718087e05 ***.com/jsd/cuda-with-samples:v1.0
推送鏡像
docker push 鏡像倉庫的地址/倉庫用戶名/倉庫名稱:鏡像標簽
例如:
docker push ***.com/jsd/cuda-with-samples:v1.0
Docker鏡像的修改
上節討論了Docker鏡像的制作方法以及如何將其推送至鏡像倉庫。這節主要介紹如何在當前現有鏡像中添加新的文件,并且將其保存為新的鏡像。
這是當前鏡像:
***.com/jsd/cuda-with-samples:v1.0
這是要添加的內容:
fileA.sh fileB.sh
具體步驟如下:
-
創建 Dockerfile:
# 使用現有的鏡像作為基礎鏡像 FROM ***.com/jsd/cuda-with-samples:v1.0 ? # 將本地文件復制到鏡像中的指定目錄 # 確保路徑和文件名正確 COPY check_executables.sh cuda_samples_manager.sh run_make_in_samples.sh /home/cuda-samples-12.5/ -
構建鏡像:在包含
Dockerfile的目錄下打開終端或命令提示符,使用docker build命令構建新的鏡像。記得將[new-tag]替換為你想要的新標簽名稱。docker build -t ***.com/jsd/cuda-with-samples:v3.0 .注意:在命令的最后,.表示 Dockerfile 在當前目錄。
-
推送鏡像到阿里云倉庫:構建完成后,使用
docker push命令將新鏡像推送到阿里云 Docker 倉庫。docker push ***.com/jsd/cuda-with-samples:v3.0 -
驗證新鏡像:使用
docker images查看本地鏡像列表,確認新鏡像已經創建。你也可以使用docker pull命令拉取新鏡像到本地進行測試。 -
運行新鏡像:使用新鏡像啟動容器,以驗證文件是否正確添加。
docker run -it --name [container-name] ***.com/your-repo/your-image:[新標簽] /bin/bash
Docker常用操作
上述講述了Docker鏡像的制作和修改,下面說明docker常用的操作命令。
在使用Docker鏡像的過程中,除了構建和修改鏡像,還有許多其他相關操作。這些操作涵蓋了鏡像的管理、運行和分發等方面。以下是一些常見的與Docker鏡像操作相關的命令和使用方法:
鏡像管理
-
列出本地鏡像
列出本地的所有Docker鏡像:docker images -
刪除鏡像
刪除一個或多個鏡像:docker rmi <image_id_or_name>如果鏡像正在被使用,可以使用
-f選項強制刪除:docker rmi -f <image_id_or_name> -
查看鏡像詳細信息
docker inspect <image_id_or_name>
運行容器
-
運行容器
從鏡像運行一個新容器:docker run -it --name <container_name> <image_name> /bin/bash-it:讓容器運行在交互模式,并連接終端。--name:指定容器名稱。
-
后臺運行容器
以后臺模式運行容器(守護模式):docker run -d --name <container_name> <image_name> -
運行并暴露端口
運行容器并暴露端口,使其可以被外部訪問:docker run -d -p 8080:80 --name <container_name> <image_name>-p 8080:80:將主機的8080端口映射到容器的80端口。
鏡像分發
-
登錄Docker Hub
在推送和拉取鏡像之前,需要先登錄Docker Hub:docker login -
推送鏡像到Docker Hub
將本地鏡像推送到Docker Hub上:docker tag <local_image_name> <your_dockerhub_username>/<repository_name>:<tag> docker push <your_dockerhub_username>/<repository_name>:<tag> -
從Docker Hub拉取鏡像
從Docker Hub拉取一個鏡像:docker pull <image_name>:<tag>
容器管理相關操作
-
查看運行中的容器
查看所有正在運行的容器:docker ps -
查看所有容器(包括已停止的)
docker ps -a -
停止和啟動容器
停止一個正在運行的容器:docker stop <container_id_or_name>啟動一個已停止的容器:
docker start <container_id_or_name> -
重啟容器
重新啟動一個容器:docker restart <container_id_or_name> -
刪除容器
刪除一個已停止的容器:docker rm <container_id_or_name>