用于炼丹的docker常用命令

环境配置

镜像的选择

这里坑点很多,首先需要搞懂nvidia driver, cuda和docker之间的关系,

  1. driver是gpu的驱动程序,一般装在宿主机上,而容器里面必须装有cuda,才能调用driver(容器里面不能装driver)
  2. 既然宿主机的driver已经确定了,而cuda的版本和driver的版本互有牵连,所以cuda的版本能选择的也几乎确定了(和我一样,瞎选版本就等着重装吧)
  3. 所以就用宿主机nvidia driver和cuda的版本最合适
  4. docker hub里面有nvidia自己做好的镜像,可以直接拉下来用,我这选择的就是同版本,同系统型号nvidia/cuda:11.4.3-cudnn8-devel-ubuntu20.04

使用Docker创建新容器

先拉取一个镜像(因为我在使用的过程中会经常用到anaconda,所以我这拉一个带有anaconda3的image,这里的pnet换自己喜欢的名字,它是根据anaconda3镜像生成容器名)

docker pull nvidia/cuda:11.7.1-cudnn8-devel-ubuntu18.04

然后就是从拉下来的这个镜像开始创建容器了

docker run -idt -p 1313:22 --gpus all -e NVIDIA_DRIVER_CAPABILITIES=compute,utility -e NVIDIA_VISIBLE_DEVICES=all -v /home/yis22/share:/home/share --name=dm-pnet nvidia/cuda:11.4.3-cudnn8-devel-ubuntu20.04 /bin/bash

-idt: 是常见的参数表示用交互式,退出后后台运行的样式创建容器
-p 30001:22 表示把容器的22端口映射到宿主机的30001端口上
--gps all 表示可以看见宿主机的所有gpu
-e NVIDIA_DRIVER_CAPABILITIES=compute,utility utility代表可以做utility的事情,只有加上compute才能够使用cuda计算
-v /home/yis22/share:/home/share 表示把宿主机的/home/yis22/share目录映射到容器的/home/share目录,实现容器内部和宿主机共享文件
--name=dm-pnet 其中dm-pnet表示我起的容器名字,这里更换成你需要的名字
nvidia/cuda:11.4.3-cudnn8-devel-ubuntu20.04 表示用来创建容器的镜像,这个也要更换成你自己对应的镜像
/bin/bash 表示创建容器后,容器后台运行不关闭

进入容器

docker exec -it dm-pnet /bin/bash

输入以下命令验证是否可以使用gpu

nvidia-smi

nvcc -V

# 以上只是可以看nvidia-smi而已,不一定可以计算,
# 安装好pytorch后,先使用`python`进入解释器,
# 再使用以下命令,如果返回true则是可以调用了.
import torch
torch.cuda.is_available()

安装Anaconda

先下载联网下载工具wget

apt-get update
apt-get install wget

下载anaconda3

# 进入home目录
cd /home

# 下载anaconda文件, 只是用wget被拒绝了,所以使用用户代理
wget --user-agent="User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12" -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2022.10-Linux-x86_64.sh

# 安装anaconda
bash Anaconda3-2022.10-Linux-x86_64.sh

容器与宿主机之间文件迁移

宿主机 -> 容器

# docker cp 宿主机文件/路径 容器名:容器内路径
docker cp /home/yis22/softwares/anconda3/envs/pnet_pytorch dm-pnet:/home/anaconda3/envs/pnet_pytorch

容器 -> 宿主机

# docker cp 容器名:文件/路径 宿主机路径 
docker cp wordpress-lee:/root/example.sh /root

开发

使用vscode连接远程服务器中的容器

vscode在本地安装Remote Development插件连接远程服务器

vscode在远程服务器安装Docker插件管理image和container

vscode在远程服务器的container中安装Python插件运行调试容器中代码

镜像快速迁移与部署

用容器生成镜像

docker commit -a "yisnsiy" -m "code and environment for dm-pnet" dm-pnet yisnsiy/img-dm-pnet:v0.1

-a "yisnsiy" 表示作者信息
-m "code and environment for dm-pnet" 表示注释信息
dm-pnet 用来生成镜像的容器名
yisnsiy/img-dm-pnet:v0.1 :生成的镜像名,用作者/名字的形式来代表,:之后的v0.1表示标签,一般表示版本号

删除旧的镜像

# 查看所有镜像
docker images
# 删除镜像
docker rmi yisnsiy/dm-pnet:v0.1

yisnsiy/dm-pnet:v0.1 表示镜像名的全称

删除旧的容器

#  查看所有容器
docker ps -a
# 产看正在运行的容器
docker ps
# 停止容器的运行, dm-pnet是正在运行的容器名
docker stop dm-pnet
# 删除容器
docker rm dm-pnet

保存到目录

# 压缩镜像
docker save yisnsiy/dm-pnet:lastest > /home/yis22/code/dm-pnet:lastest.tar

# 加载镜像
docker load < /home/yis22/code/dm-pnet:lastest.tar

yisnsiy/dm-pnet:lastest 是镜像名
/home/yis22/dm-pnet:lastest.tar 是路径加文件名

跨服务器传输docker

# 免密码scp
# 本地生成密钥对
ssh-keygen -t rsa
# 将公钥复制到远程服务器
ssh-copy-id -p 50030 yis22@remote_host

# 使用nohup和ssh密钥验证后台运行scp任务
nohup scp -i /home/yis22/.ssh/id_rsa source_file user@remote_host:destination_path > scp.log 2>&1 &

# 监视是否还在运行
tail -f scp.log
# 查看后台
ps -ef | grep scp

# 本地 > 远程 传文件
scp file1 file2 yis22@ip:/home/yis22/backup/
# 本地 > 远程 传文件夹
scp -P 22 -r myfolder1 myfolder2 yis22@ip:/home/yis22/backup/

# 远程 > 本地 传文件
scp -P 22 yis22@ip:/home/yis22/backup/file /home/yis22/backup/
# 远程 > 本地 传文件夹
scp -P 22 -r yis22@ip:/home/yis22/backup/ /home/yis22/backup/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值