docker相关:
查看docker服务是否启动:
systemctl status docker
启动docker服务:
sudo systemctl start docker
停止
systemctl stop docker
查看状态
systemctl status docker
设置开机启动
systemctl enable docker
重启
systemctl restart docker
镜像相关:
查看
docker images
搜索
docker search image_ name
拉取
docker pull image_name
# 指定版本号
docker pull image_name:version
删除
docker rmi image_name or image_id
列出所有镜像的id
docker images -q
加载
docker load -i name
容器相关:
查看正在运行的容器 docker ps
查看容器 docker ps -a
创建容器
第一种,在远程集群服务器中创建容器
sudo docker run -id/-it --gpus all -p 8022:22 --name 容器名称 -v 本机的绝对路径:服务器的相对路径 镜像名称:标签
第二种,在本地docker创建容器,本地测试,这时千万不要挂载目录,会造成代码消失
sudo docker run -id --gpus all -p 8022:22 --name 容器名称 镜像名称:标签
第三种,创建完成,直接进入容器(安装不一样,不一定适用,比如我的环境安装就不能用这句话)
sudo docker run -id --gpus all -p 8022:22 --name 容器名称 镜像名称:标签 /bn/bash
-it:交互式容器,退出容器后容器自动关闭。t:分配一个伪终端
-id:守护式容器,退出容器后容器不会关闭 推荐这个
-p:开放端口 通常 8022:22 意为将容器的22号端口与服务器8022端口绑定
/ bin/bash: 直接进入容器
-p 8022:22 如果不用pycharm远程连接调试,就不需要端口映射
进入容器
sudo docker exec -it 容器名称 bash
推荐这种方法进入容器,退出终端后,不会停止容器
开始
docker start 容器名称
停止
docker stop 容器名称
删除
docker rm 容器名称
查看容器信息
docker inspect container_name or id
数据卷相关:
创建容器时,使用-v参数设置数据卷
docker run -id --name 容器名称 -v 宿主机目录:容器目录 image_name
注意事项 a. 目录必须是绝对路径 b. 如果目录不存在会自动创建 c. 可以挂载多个数据卷 d. 一个数据卷也可以被多个容器挂载
镜像制作:
- 容器转镜像,数据卷挂载的数据不会被打包,其余文件都会
docker commit 容器id 镜像名称:版本号
docker save -o 压缩文件名称 镜像名称:版本号
docker save 镜像名称:版本号 -o /home/myubuntu-save-1204.tar
- 加载保存的镜像:
docker load -i压缩文件名称
docker load -i /home/myubuntu-save-1204.tar
- dockerfile制作镜像
docker build -f dockerfile_path -t image_name
-f:指定dockerfile路径
-t:指定新的镜像名字
.:上下文路径。
由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。
conda 基本操作
查看conda环境
conda conda env list 或 conda info --envs
激活conda环境
conda activate name
创建虚拟环境
conda create -n name python=3.6 pytorch=1.4
删除虚拟环境
conda remove -n name --all
清理(conda瘦身)
conda clean就可以轻松搞定!
第一步:通过conda clean -p来删除一些没用的包,这个命令会检查哪些包没有在包缓存中被硬依赖到其他地方,并删除它们。
第二步:通过conda clean -t可以将conda保存下来tar包
conda clean -p //删除没有用的包
conda clean -t //tar打包
使用SSH的SCP服务与服务器上传下载文件
sudo scp /home/outpainting-wg.tar username@ip:~/
上传文件:
scp [-r] filename username@address:服务器存储位置绝对路径 , filename可以为单个文件,也可以为文件夹,如果有文件夹时,必须用-r参数选项(表示递归拷贝整个目录)
下载文件:
scp [-r] username@address:filename 本地路径 。
简单记忆就是:
scp [-r] 源文件或源目录 目标路径
如果同时挂载多个目录
-v 可以多次使用
-v /home/my:/my:ro
-v ./home/ht:ht:rw
千万不能忘记 --gpus all 连接远程服务器需要挂载目录 切记前面目录为集群本机的目录,而不是自己电脑本机的目录了
sudo docker run -id --gpus all -p 8022:22 --name outpainting_wg -v /home/wg/wgg/code/Outpainting-master:/var/Outpainting-master ubuntu:wyt /bin/bash
pycharm调试本地docker时,千万不能挂载目录,否则会造成代码丢失
sudo docker run -id --gpus all -p 8022:22 --name outpainting_wg ubuntu:wyt /bin/bash
将集群本地代码文件夹 传入到docker内部容器内
docker cp /home/wg/wgg/code/Outpainting-master.tar.gz 容器名称:/home/wg/code/outpaint
代码跑起来之后,ctrl+p+q 可以退出容器,但是还保持运行的状态
使用 docker attach 容器名称 重新进入
测试cuda是否可以被使用
1 import torch
2 import torchvision
3 print(torch.cuda.is_available())
上面的命令只是检测CUDA是否安装正确并能被Pytorch检测到,并没有说明是否能正常使用,要想看Pytorch能不能调用cuda加速,还需要简单的测试一下:
a = torch.Tensor(5,3)
a=a.cuda()
print(a)
查看当前使用pytorch的版本
import torch
print(torch.__version__) #注意是双下划线
流程:
1. 本机电脑拉取镜像,或者加载已有镜像
2. 创建容器,使用端口映射,便于pycharm调试,使用GPU, 但是切记不挂载目录,否则会造成代码消失
docker run -id --gpus all -p 8022:22 --name 容器名称 镜像名称:标签 /bin/bash
3. 进入容器。在创建容器时 加了/bin/bash 会直接进入容器,没加的话,也不要紧。用exec进入,容器关闭时,也不会消失
docker exec -it 容器名称 bash
4. 在容器内安装需要的环境
5. 将本地代码文件夹 传入到docker内部容器内,使用 python train.py 测试
docker cp /home/wg/wgg/code/Outpainting-master.tar.gz 容器名称:/home/wg/code/outpaint
6. 在容器内安装ssh服务,为了pycharm远程调试
7. 在容器内修改密码
passwd
8. 重启ssh服务
service ssh restart
9. 退出容器
10. 打开pycharm进行设置,连接本地docker进行代码调试,直到测试无误,环境都配置好
11. 将容器保存为镜像
docker commit 容器id 镜像名称:版本号
docker save 镜像名称:版本号 -o /home/outpainting-wg.tar
12. 连接集群
ssh kWang1@172.31.151.24
13. 使用ssh的scp服务,将保存的镜像和代码,数据集传输到集群上
scp /home/outpainting-wg.tar kWang1@ip:~/wg/
scp -r /home/wg/wgg/code/Outpainting-master kWang1@ip:~/wg/code/
scp -r /home/wg/wgg/code/Outpainting-master/train kWang1@ip:/public_datasets/outpainting
scp -r /home/wg/wgg/code/Outpainting-master/val kWang1@ip:/public_datasets/outpainting
scp -r /home/wg/wgg/code/Outpainting-master/test kWang1@ip:/public_datasets/outpainting
14. 在集群上,加载镜像
docker load -i ~/wg/镜像名称
15. 在集群上,镜像内创建容器
docker run -id --gpus all -p 8022:22 --name outpainting -v 集群上代码的本机目录:集群上容器内代码的目录 -v 集群上数据集的本机目录:集群上容器内数据集的目录 outpaint:wg
例如:docker run -id --gpus all -p 8022:22 --name outpainting -v ~/wg/code/Outpainting-master:/home/wg/Outpainting-master -v /public_datasets/outpainting/train:/home/wg/Outpainting-master/train -v /public_datasets/outpainting/val:/home/wg/Outpainting-master/val -v /public_datasets/outpainting/train:/home/wg/Outpainting-master/test outpaint:wg /bin/bash
16.进入容器
docker exec -it 容器名称 bash
17.进入挂载的目录
18.运行代码
python train.py
exec与attach区别
docker exec -it 容器名称 bash
docker attach 容器名称
他们的区别:
exec 进入容器时,是在容器内新开启了一个线程
attach进入容器时,是进入容器当前运行的线程
对我自己来说,我创建完容器,docker exec -it 容器名称 bash进入容器,运行代码,开始训练。ctrl+P+Q 使其退出但是不关闭容器,再次进入时,按道理应该docker attach 容器名称 进入当前运行的线程,也就是应该回到原先退出时的界面,但是每次我这样操作就会卡死掉。
但是拿 docker exec -it 容器名称 bash 再次进入就没有问题,原因就是上述说的,exec 进入容器时,是在容器内新开启了一个线程
查看线程命令 ps -aux
杀死线程命令 kill pid
但是如果ctrl+P+Q 不好使,又需要查看输出的信息或者查看运行的进度的话,可以在代码中添加日志进行查看进度
创建容器时,最后/bin/bash ,就是一直保持容器运行的意思,所以我现在的做法就是,在代码中添加日志,创建完容器运行后,直接关掉远程连接就可以。
统计文件夹下文件个数,包括子文件
ls -lR | grep "^-"| wc -l
统计文件夹中目录个数
ls -l ./|grep "^d"|wc -l
容器内部安装miniconda
直接在容器内部联网下载 wget -c https://.....................,然后安装
https://www.jianshu.com/p/0511decff9f8
如果找不到合适拉取的镜像
可以如下操作:
1. 拉取miniconda的镜像
2. 创建容器
3. 使用miniconda创建虚拟环境
4. 激活需要使用的环境
5. 配置你需要的环境
conda 更换源
更换conda源
更换pip源
临时使用 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas
# 豆瓣
https://pypi.doubanio.com/simple/
# 阿里云
https://mirrors.aliyun.com/pypi/simple/
# 清华大学
https://pypi.tuna.tsinghua.edu.cn/simple/
https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/
临时使用
pip install some-package -i https://mirrors.aliyun.com/pypi/simple/
设为默认#
升级 pip 到最新的版本后进行配置
pip install pip -U
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/