写点什么

Docker 心经

作者:卫先生
  • 2021 年 11 月 22 日
  • 本文字数:4304 字

    阅读完需:约 14 分钟

Docker心经

作者 | 刚子

出品 | 刚子


以下是我在使用过程中

  • 遇到的坑

  • 解决的问题

  • 一些总结

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

安装

建议 ubuntu16.4/18.4,安装说明自行百度不做介绍


安装docker

安装nvidia-docker 参考官方


测试可用

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

 import torch  import torchvision  print(torch.cuda.is_available()) 
复制代码


python -c "import torch;print(torch.cuda.is_available())"
复制代码

测试 pytorch 能不能调用 cuda 加速

  a = torch.Tensor(5,3)  a=a.cuda()  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:v1 在 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地址:~/

  • scp ERN.tar 你的账号@你的ip地址:~/wg/


拷贝/移动文件

  • 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 源


1. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/2. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge3. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
复制代码


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


1. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/2. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/3. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/4. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/menpo/5. 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 some-package -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 directory1. 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 directory1. apt-get update2. apt-get install libglib2.0-dev
若出现ImportError: libSM.so.6: cannot open shared object file: No such file or dir1. apt-get install libsm6
如果你出现了上面的错误,那你很大概率也会遇到下面的问题,ImportError: libXrender.so.1: cannot open shared object file: No such file or directory1. apt-get install libxrender1
ImportError: libXext.so.6: cannot open shared object file: No such file or directory2. apt-get install libxext-dev
复制代码

更换镜像的 python 版本

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


  1. 拉取 tf 镜像

  2. 创建容器

  3. 使用这个 PPA 源

sudo add-apt-repository ppa:deadsnakes/ppasudo apt updatesudo apt install python3.6 python3.6-dev -y
复制代码


  1. 修改 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 是一个全新的环境,需要自己全部添加需要的环境



撒花🎉希望可以帮助到大家不好之处多多包涵


微信公众号 : 后端开发充电宝

个人知识库:语雀知识库

保持谦逊,保持自律,保持进步

发布于: 18 小时前阅读数: 7
用户头像

卫先生

关注

还未添加个人签名 2021.11.20 加入

还未添加个人简介

评论

发布
暂无评论
Docker心经