如何使用docker、挂载数据,以及让docker使用宿主机器的GPU环境

最近的工作和学习需要我使用docker,浅浅的学了一下,记录在这:下载docker,用docker打包我的项目和环境,让docker使用宿主机器的GPU环境,将数据挂载在docker容器内,保存一个新的镜像等。

我想说:docker下载你真是害人不浅!(虽然如果下好了确实也挺好用的!),好了还是言归正传:

什么是 Docker?

Docker 使用容器技术,将应用程序及其所有依赖项(如库、配置文件等)打包到一个轻量级、可移植的容器中。这些容器能够在各种环境中快速部署和运行,无需担心环境差异。

安装docker我这里不写了,因为我没安装过,我是用的机器本来就有docker。

拉取docker镜像

使用以下命令从 Docker Hub 或其他注册表中拉取镜像:

powershell 复制代码
docker pull <镜像名称>:<标签>

这里因为网络的原因十分的坑,我是使用了一个docker的镜像源才拉成功几个镜像的,这里分享一下:https://docker.1ms.run,不过这东西似乎很容易过去,用的时候再找吧。添加镜像源需要你进入修改本地的/etc/docker/daemon.json文件,添加这么一行:在"registry-mirrors"字段内添加镜像的地址,如:

powershell 复制代码
{"registry-mirrors": ["https://docker.1ms.run"]}

然后重启docker:

powershell 复制代码
systemctl daemon-reload
systemctl restart docker

再使用docker pull的方法拉取镜像就好了(现实远没有这么简单。。。)拉取镜像成功后,可通过docker images查看本地已有那些镜像,通过docker rmi <镜像ID或名称>可删除镜像 。

镜像和容器的区别

上面说了镜像的拉取,删除,查看,下面说容器操作,首先说说镜像和容器的区别:

  1. Docker 镜像是一个只读的模板,用于创建容器。它包含运行应用程序所需的所有内容,如操作系统环境(如 Linux 文件系统)、应用程序文件和依赖项。、配置文件和启动命令等

  2. 容器是基于镜像运行的实例。它是一个轻量级的、独立的运行环境,可以看作是镜像的动态副本。

还是很容器的懂的,跑个例子就都懂了,好,下面说容器常见指令:

通过docker ps查看运行中的容器,通过docker stop <容器ID或名称>停止容器。

  1. 下面是如何运行一个容器:
powershell 复制代码
docker run --name test -idt docker.1ms.run/continuumio/miniconda3

这里的test是我定义的容器名,docker.1ms.run/continuumio/miniconda3是使用的镜像名,参数**-idt** 是为了启动一个后台运行的交互式容器,同时保留终端分配支持,此参数还有选择,见个人偏好。这样启动容器后,可执行docker exec -it <容器ID/名字> /bin/bash进入该容器。

  1. docker cp 用于在本地主机和容器之间复制文件或目录:

1) 从容器中复制文件到主机

假设容器名称是 my-container,容器内的路径是 /app/data.txt,复制到主机的 /home/user 目录:

powershell 复制代码
docker cp my-container:/app/data.txt /home/user/

2) 从主机复制文件到容器

将主机上的文件 /home/user/config.json 复制到容器 my-container 的 /app/ 目录:

powershell 复制代码
docker cp /home/user/config.json my-container:/app/

比如我这次是下面了一个conda环境的镜像,然后将本地的一个conda的虚拟环境上传到容器中,我使用了以下指令将我的环境copy过去,然后再进入容器里,conda env list就可以看见llama_factory环境了,地址在/opt/conda/envs/llama_factory,这里有一个注意点,就是pip的设置,本地的/home/user/.conda/envs/llama_factory/bin/pip里设置了pip使用的地址是#!/home/user/.conda/envs/llama_factory/bin/python,所以复制到容器还是这样,因此要在容器里打开对应的/opt/conda/envs/llama_factory/bin/pip改一下pip使用的地址为#!//opt/conda/envs/llama_factory/bin/python

powershell 复制代码
docker cp /home/user/.conda/envs/llama_factory my-container:/opt/conda/envs
  1. 让 Docker 容器使用本地 GPU 环境

要让 Docker 容器使用本地 GPU 环境,需要本地安装 NVIDIA 提供的 NVIDIA Container Toolkit ,当然你本地的机器必须有显卡。有一个网站可以提供安装的简便方法,亲测可用:NVIDIA Container 运行时库

我是centos系统,所以用yum安装,亲测飞快!

然后在启动容器时使用加上--gpus参数即可,如下:

powershell 复制代码
docker run --gpus all <镜像名称>

--gpus all是指让容器使用宿主机的所有 GPU。如果需要指定 GPU,例如 GPU ID 为 0,可执行docker run --gpus '"device=0"' <镜像名称>

  1. 本地数据挂载在容器上

在 docker 中,挂载本地数据到容器可以通过 数据卷(Volumes)绑定挂载(Bind Mounts) 实现。这样,主机上的目录或文件可以映射到容器中,达到共享数据的目的。我这里使用的是绑定挂载 (Bind Mounts),直接将主机上的文件或目录挂载到容器中的文件系统位置,使用起来灵活且简单。

powershell 复制代码
docker run -v <主机路径>:<容器路径> <镜像>

如将主机的 /home/user/data 目录挂载到容器的 /app/data 目录:

powershell 复制代码
docker run -v /home/user/data:/app/data my-image

我有一个将本地文件夹挂载在容器上,并使用本地GPU环境的启动容器指令:

powershell 复制代码
docker run --gpus all -d --name container_name -v ./home/user/data:/app/data my-image  tail -f /dev/null 

这里的 tail -f /dev/null 是一个保持容器运行的"占位命令",可防止容器在启动后立即退出。

  1. 创建镜像并保存成压缩包

docker commit 用于 创建镜像,它将一个容器的当前状态保存为一个新的镜像。可以理解为从正在运行的容器中"拍照"并生成新的镜像。

powershell 复制代码
docker commit <容器ID> <新镜像名称>:<标签>

docker save 用于将 Docker 镜像导出为 一个 tar 文件,通常用于备份、分享或迁移镜像。生成的 tar 文件包含镜像的所有层信息,可以传输给其他机器并在其上加载。

powershell 复制代码
docker save -o <tar文件名>.tar <镜像名称>:<标签>
相关推荐
吃苹果的牛顿顿1 小时前
Docker本地搭建WordPress
运维·docker·容器
daizikui5 小时前
docker使用阿里云容器镜像服务下载公共镜像
阿里云·docker·容器
lu云之东6 小时前
Harbor2.11.1生成自签证和配置HTTPS访问
网络协议·http·docker·https·harbor
yangshuo12816 小时前
Docker-Compose 快速部署安装 Nginx 或其他应用
运维·nginx·docker
Eternal-Student6 小时前
【docker了解】如何将x86镜像转换为适用于Jetson的ARM镜像
arm开发·docker·容器
飘散风中8 小时前
Docker+PostgreSQL数据库
数据库·docker·容器
开出南方的花8 小时前
Flask服务封装+Docker服务部署
python·docker·flask
vvw&9 小时前
如何使用 Docker Compose 安装 WireGuard UI
linux·服务器·ui·docker·容器·wireguard·异地组网
MARSERERER11 小时前
docker无法拉取社区镜像
运维·docker·容器