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>