Docker学习与实战记录

写在前面

最近在学习深度学习的模型训练,需要在服务器中配置训练环境,之前一直用的Anaconda管理环境,最近在学习Docker,记录一下学习过程和一些要点。

相关参考已标记来源。

一、Docker入门

1. 什么是Docker

相当于一个轻量级虚拟机,可以提供独立的、可移植的运行环境。

2. 三个概念

参考:
什么是docker镜像

Docker 包含三个基本概念,分别是镜像(Image)、容器(Container)和仓库(Repository)。镜像是 Docker 运行容器的前提,仓库是存放镜像的场所,可见镜像更是Docker的核心。

如图:
在这里插入图片描述

  • 镜像:
    打包项目带上环境,即镜像。镜像可以用来创建Docker容器,用户可以使用设备上已有的镜像来安装多个相同的Docker容器。
  • 容器:
    镜像创建的运行实例,Docker利用容器来运行应用。
    每个容器都是相互隔离的、保证安全的平台。我们可以把容器看做是一个轻量级的Linux运行环境。
  • 仓库:
    存放镜像(文件)的地方,分为共有仓库和私有仓库

二、Docker实战:创建一个训练模型的环境

参考:Docker从入门到实践

  1. docker pull拉取一个pytorch镜像并且重命名
//下载最新版本的PyTorch镜像
docker pull pytorch/pytorch:latest
//将其重命名为codet5
docker tag pytorch/pytorch:latest codet5
  1. docker images查看拉取的镜像
    请添加图片描述
  2. 使用镜像创建容器
    (1)bash docker run --rm --runtime=nvidia --gpus all -it codet5 /bin/bash

这个命令的意思是:
在nvidia GPU环境下运行名为"codet5"的Docker镜像,并以交互式的方式进入容器中的Bash终端。

具体来说,这个命令会执行以下操作:

  • docker run:启动一个新的Docker容器。
  • –rm:容器退出后自动删除。
  • –runtime=nvidia:使用nvidia-docker运行容器。
  • –gpus all:将所有可用的GPU分配给容器。
  • -it:-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开。即创建一个交互的环境。在交互模式下,用户可以通过所创建的终端来输入命令
  • codet5:指定要运行的Docker镜像的名称或ID。
  • /bin/bash:在容器中启动一个Bash shell。

这个命令在退出之后不会保存容器。

(2)更好的方式是:bash docker run --name <container_name> --runtime=nvidia --gpus all -it codet5 /bin/bash

这个命令会保存容器,在容器内使用 exit 命令退出容器。然后使用 docker ps -a 命令查看所有容器的状态,并找到刚刚创建的容器的 ID。

这个命令的好处是,如果在容器中进行了一些修改,想要保留的话,可以在退出容器之后,将容器转换为新的镜像。

具体步骤是:

  • 使用docker commit <container_id> <new_image_name>,其中,<container_id> 是刚刚创建的容器的 ID,<new_image_name>是新的镜像名称。
  • 验证新的镜像已经被创建成功:docker images ,可以看到刚刚创建的新镜像。
  1. 配置容器环境

强烈建议记录自己配置环境的步骤顺序!!后文会说为什么。
我由于要在容器里跑模型训练的脚本,所以一开始是跑脚本时遇到什么没装就暂停去装。在我安装tree_sitter这个模块时,报错提示我gcc未安装:

error: command ‘gcc’ failed: No such file or directory: ‘gcc’
[end of output]

note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed building wheel for tree_sitter
Failed to build tree_sitter
ERROR: Could not build wheels for tree_sitter, which is required to install pyproject.toml-based projects

于是我又去安装gcc,结果报错:

Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
gcc : Depends: gcc-7 (>= 7.3.0-12~) but it is not going to be installed
E: Unable to correct problems, you have held broken packages.

这个报错提示有一个或多个包存在依赖关系问题,并且安装程序无法解决这些问题。这种情况可能是由于以下原因之一导致的:已经手动安装了某些软件包的旧版本,它们现在不兼容新版本的依赖项;正在使用的软件源中缺少某些软件包或依赖项。

查了网上很多解决办法,都说要换源,但是我嫌麻烦,直接重新创建容器从头再来,发现:调整安装顺序就可以!!!

比方说我已经知道安装tree_sitter要先安装gcc,那我就安装好了gcc再安装tree_sitter。

于是我直接先把基础的模块都安装了。问题解决。

apt-get install gcc
apt-get install -y sudo
apt-get install vim

但是这种解决办法也仅限于有可以remake的条件,以及一些运气。。。也许重新安装的顺序还是不对,那就要不断试错,得不偿失了,不如换源。

  1. 容器联网和挂载宿主机目录
    使用--env参数实现http代理的设置,实现联网,用--v <宿主机目录>:<容器目录>参数实现挂载。

最终,我的命令如下:
docker run --name codet5_v3 -it --runtime=nvidia --gpus all --env http_proxy=http://114.212.82.225:4411 -v /bigdata/qiuhan:/bigdata/qiuhan codet5_v2 /bin/bash

  1. 使用-d在后台运行容器:
    docker run -d <iamge_name> <command>
    返回一个容器ID。
    使用docker ps -a可以查看刚刚创建的容器正在运行。

  2. 将容器打包为镜像
    docker commit <容器名> <镜像名>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值