Docker心经

338 阅读7分钟

以下是我在使用过程中

  • 遇到的坑
  • 解决的问题
  • 一些总结

其中还有很多不足,大家可以慢慢一起完善

大家一起进步一起成长


安装

建议 ubuntu16.4/18.4

安装说明自行百度不做介绍

安装docker

blog.csdn.net/jinking01/a…

安装nvidia-docker 参考官方

docs.nvidia.com/datacenter/…


测试可用

检验cuda是否安装正确&能否被pytorch检测到

1. import torch
2. import torchvision
3. print(torch.cuda.is_available())

python -c "import torch;print(torch.cuda.is_available())"

测试pytorch能不能调用cuda加速

1. a = torch.Tensor(5,3)
2. a=a.cuda()
3. print(a)

python -c "import torch;print(torch.cuda.is_available());a = torch.Tensor(5,3);a=a.cuda();print(a)"


基本操作

基础命令

镜像可取docker hub 自行下载 不做介绍

查看docker服务是否启动:

  • systemctl status docker

启动docker服务

  • sudo systemctl start docker

查看docker版本信息

  • docker --version
  • docker version
  • docker info

🌈 重要的命令

  • 加载   docker load -i name
  • 🔥 查看镜像  docker iamges
  • 🔥 查看容器  docker ps
  • 🔥 查看正在运行的容器  docker ps -a
  • 进入容器
    • docker attach name
    • 🔥 docker exec -it name bash  推荐这个 退出容器不会停止
  • 查看conda环境  
    • conda env list
    • conda info --envs
  • 激活conda环境  conda activate name
  • 🔥 强制删除正在运行的容器 docker rm --force name

将镜像导出

  • docker save 镜像id>~/wg/ERN.tar

  • docker save 镜像名称:版本号 -o /home/outpainting-wg.tar

在集群中导入镜像

  • docker load -i ~/wg/name

  • docker load < ~/wg/wg-op.tar

加载进来的镜像名称、标签均为none,修改名称与标签

  • docker tag eb40dcf64078 wg-op:torch1.5.0-cu101

🔥将容器打包成镜像

  • docker commit 容器ID 新镜像名称:版本号

如 docker commit 9e4fcf42be59 lvshasha_tensorflow

在 docker images 时就会出现 lvshasha_tensorflow 这个镜像

🔥挂载

如果挂载多个目录,-v 可以多次使用

  • -v /home/my:/my -v ./home/ht:ht

将本地代码文件夹 传入到docker内部容器内

  • docker cp /home/wg/outpaiting/demo/Outpainting-master.tar.gz 容器名称:/home/wg/demo/code

🔥端口映射

  • -P 本机端口:容器端口

-p 2222:22

因为用到22端口映射所以必须安装ssh服务

使用时通过访问服务器的2222端口来访问容器

ctrl+p+q

代码跑起来之后,ctrl+p+q 可以退出容器,但是还保持运行的状态

使用  docker attach 容器名称  重新进入


创建容器

docker版本不同,调用gpu的命令不同

  • docker run -id --gpus all -p 2225:22 --name wg -v ~/wg/outpainting/demo:/demo -v /datasets/places365/train:/demo/train -v /datasets/places365/test:/demo/test wg-op:torch1.2 /bin/bash

  • nvidia-docker run -id -p 2225:22 --name wg -v ~/wg/outpainting/demo:/demo -v /datasets/places365/train:/demo/train -v /datasets/places365/test:/demo/test wg-op:torch1.2 /bin/bash


🎯 Pycharm远程调用docker

直接调用docker容器我们是做不到的

但是可以做到间接调用

localhost -> remote server -> docker

1. 建立容器

nvidia-docker run -id -p 2225:22 --name wg -v ~/wg/outpainting/demo:/demo -v /datasets/places365/train:/demo/train -v /datasets/places365/test:/demo/test wg-op:torch1.2 /bin/bash

大家使用时直接将这个命令复制下来,蓝色部分原封不动,其他部分替换为自己的就可以了

如果docker版本为XX时,将nvidia-docker 换为docker --gpus all 即可。

2. 安装openssh-server

在远程服务器上安装openssh-server

apt update && apt install openssh-server

注意,要在两个地方安装

  1. 远程服务器
  2. 容器内

3. 建立连接

进入容器

修改SSH连接的密码

默认账户为root

passwd

容器内部重启ssh服务

service ssh restart

在服务器中测试容器与服务器上的映射是否建立

docker port <容器名字> 22

若输出,表明只要外界连接到服务器的2222端口,就会转发到容器的22端口

0.0.0.0:2222

4. 本地测试连接是否建立

ssh root@<你服务器的ip地址> -p 2222

若成功 则直接连接至容器

第2,3,4步骤

在设置一次后,将该容器导出为镜像

再创建这个镜像的容器,即已经拥有ssh

只需要进入容器设置密码,重启即可,随后在pycharm设置就可以

5. 配置pycharm

配置SFTP

在导航栏中 Tools > Depolyment > Configuration中添加配置SFTP。 如图

添加配置SFTP,点击弹窗左上角的+号。选择SFTP,根据自己的实际情况进行配置。

PS:这里的root密码就是之前设置好的test

配置SFTP中的mapping

都配置完之后。打开自动上传功能 Tools>Depolyment>Automatic Upload(always) 本地修改好代码只要按保存键就自动将本地代码上传至远程docker container中。 到这里已经配置好代码的自动同步了。还差最后一步,远程调试就配置成功。

Pycharm链接远程docker container (配置远程编译器)

添加新编译器(远程docker container编译器)

在打开的页面选择之前配置好的SFTP

通常选择完之后羡慕有两个选项 Create: 新建SFTP Move: 将选择的SFTP作为编译器的SFTP

通常选择Move就好

选择你需要使用的解释器

上面已经配置了mapping,选择了move之后,项目位置就会自动映射。

完结🎉

补充知识

linux操作

查看 CUDA 版本:

cat /usr/local/cuda/version.txt

查看 CUDNN 版本:

cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

统计文件夹下文件个数,包括子文件

ls -lR | grep "^-"| wc -l

统计文件夹中目录个数

ls -l ./|grep "^d"|wc -l

判断是否有网

集群本地 ping www.baidu.com

容器内部 curl www.baidu.com

Linux 删除目录

rm -rf xxx 递归删除目录的所有文件

编辑文件的两种方式

  • gedit

  • vim

查看线程命令*

ps -aux

杀死线程命令

kill pid

SCP

使用ssh的scp服务传输文件

sudo scp /home/outpainting-wg.tar 账户名@ip:~/

拷贝/移动文件

cp hello.csv ./python/ml:把当前目录的hello.csv拷贝到当前目的python文件夹里的ml文件夹里

mv hello.csv ./python:把当前目录的hello.csv剪切到当前目的python文件夹里

cp -r /usr/wg/ /usr/wgg/:将/usr/wg目录中所有文件及其子目录拷贝到/usr/wgg中

conda配置

更换conda源

conda config --add channels <https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/>

conda config --add channels <https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge>

conda config --add channels <https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/>

conda下载pytorch巨慢 是因为国内镜像源不支持conda 但是最新发现清华源已经支持了, 需要额外添加pytorch的库,否则找不到

conda config --add channels <https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/>

conda config --add channels <https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/>

conda config --add channels <https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/>

conda config --add channels <https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/menpo/>

conda config --add channels <https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/>

安装 conda install pytorch==1.5.1 torchvision==0.6.1 cudatoolkit=9.2 -c pytorch

但是一定要去掉后面的 -c pytorch。因为命令最后是-c pytorch,所以默认还是从conda源下载,新安装的清华等源没有用上

查看conda 配置

conda config --show

设置搜索时显示通道地址

conda config --set show_channel_urls yes

pip配置

更换pip源

临时使用

  • pip install -i <https://pypi.tuna.tsinghua.edu.cn/simple> pandas
  • pip install pandas -i <https://mirrors.aliyun.com/pypi/simple/>
豆瓣
<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 到最新的版本后进行配置

  1. pip install pip -U

  2. pip config set global.index-url <https://mirrors.aliyun.com/pypi/simple/>

安装opencv

安装opencv-contrib-python

pip install -i <https://pypi.tuna.tsinghua.edu.cn/simple> opencv-contrib-python

若出现 ImportError: libGL.so.1: cannot open shared object file: No such file or directory 则
1. apt-get update
2. apt-get install -y libgl1-mesa-dev
若出现 ImportError: libgthread-2.0.so.0: cannot open shared object file: No such file or directory 则
1. apt-get update
2. apt-get install libglib2.0-dev
若出现 ImportError: libSM.so.6: cannot open shared object file: No such file or dir  则
1. apt-get install libsm6

如果你出现了上面的错误,那你很大概率也会遇到下面的问题,

ImportError: libXrender.so.1: cannot open shared object file: No such file or directory
1. apt-get install libxrender1

ImportError: libXext.so.6: cannot open shared object file: No such file or directory
1. apt-get install libxext-dev

更换镜像的python版本

如果拉取的镜像中是python3.5版本 但是实际需要3.6版本

  1. 拉取tf镜像

  2. 创建容器

  3. 使用这个PPA源

    1. sudo add-apt-repository ppa:deadsnakes/ppa
    2. sudo apt update
    3. sudo apt install python3.6 python3.6-dev -y
  4. 修改python命令默认指向python3.6:

    1. 查看默认python指向:

      sudo ls -l /usr/bin | grep python

    2. 删除原有python软连接

      sudo rm /usr/bin/python

    3. 建立python到python3.6新的软链接

      sudo ln -s /usr/bin/python3.6 /usr/bin/python

    4. ubuntu 安装pip:直接安装python3版本pip

      这里也有个小坑!如果你写的是python3-pip 执行安装后,如果系统自带了python3.5,其实pip这时是装在了python3.5环境下了!!!
      sudo apt-get install python3-pip
      
      正确的指定方式,应该把小版本号也加上!
      sudo apt-get install python3.6-pip
      
    5. 建立pip到pip3的软连接

      sudo ln -s /usr/bin/pip3 /usr/bin/pip

注意⚠️

如果执行apt-get install python3.6-pip 报错
则安装新的pip
curl <https://bootstrap.pypa.io/get-pip.py> -o get-pip.py

如果安装到python下就是
python get-pip.py --force-reinstall

如果安装到python3下就是
python3 get-pip.py --force-reinstall

成功

但这时,安装的pip是一个新的pip,替代了之前镜像中自带的pip中已经下好的东西

现在的pip是一个全新的环境,需要自己全部添加需要的环境


撒花🎉

希望可以帮助到大家

不好之处多多包涵


微信公众号:程序员WeiG

个人博客:wggz.top/