基本环境搭建
容器基本操作:
# 按照服务器配置拉取对应的镜像
docker pull pytorch/pytorch:1.9.0-cuda10.2-cudnn7-devel
# 查看主机端口 没有信息 说明端口空闲
netstat -anp |grep 8088
# 生成对应容器
docker run -it --ipc=host --runtime=nvidia --name Det-yxx -p 8088:22 -v /home/yxx/3D_object_dection/kitti:/workspace/kitti pytorch/pytorch:1.9.0-cuda10.2-cudnn7-devel /bin/bash
# --ipc=host 容器与宿主主机共享内存
# --runtime=nvidia: 使用GPU
# 重新进入该容器
docker exec -it 容器id /bin/bash # 进入容器后,打开一个新的终端
docker attach 容器id # 进入容器后,进入正在执行的终端
容器内查看GPU相关:
进入python控制台
import torch
# 查看容器中是否可以使用CUDA
torch.cuda.is_available()
# 查看有几张卡
torch.cuda.device_count()
# 查看卡的型号 'NVIDIA GeForce RTX 2070'
torch.cuda.get_device_name(0)
容器内配置ssh
# 给当前容器设置密码 后面ssh使用密码登录
passwd
# 安装ssh
apt-get update
apt-get install openssh-server
apt-get install openssh-client
apt-get install ssh
# 安装vim
apt-get install vim
# 安装网络工具包
apt-get install net-tools
# 查看端口占空 发现22端口确实空闲
netstat -anp |grep 22
# ssh的连接设置
vim /etc/ssh/sshd_config
# 文件末尾追加:
PermitRootLogin yes
port=22
PubkeyAuthentication yes
PasswordAuthentication yes
# 启动ssh
/etc/init.d/ssh restart
# 再次查看端口 发现被ssh占用了已经
netstat -anp |grep 22
# 尝试远程登录容器 这边其实和登录服务器一样了
# 登录服务器是 ssh 用户名@ip -p 22
# 容器内我们没有设置其他用户 直接就用root登录 ip还是服务器的ip 端口就是主机的8088端口 对应容器的22端口
ssh root@ip -p 8088
其他环境:
# 配置pip 参考这里:https://blog.csdn.net/qq_44173974/article/details/125336916
# 安装git zip等常用软件
apt-get update
apt-get install git
apt-get install zip
# 安装conda
# 参考https://blog.csdn.net/qq_44173974/article/details/125336916
# 将容器打包成镜像(因为做完了基本的环境配置了)
docker commit -m="基本环境" -a="yxx" 容器ID dl-environment-yxx:1.0
# 重新生成容器
docker run -it --ipc=host --runtime=nvidia --name dl-yxx -p 8088:22 -v /home/yxx/3D_object_dection/dl-yxx:/dl-yxx dl-environment-yxx:1.0 /bin/bash
问题与解决
容器启动后添加端口映射
一般添加端口自映射需要在生成容器的时候用-p指定映射规则,但如果当时忘记指定了或者后期需要新的映射规则,就需要这一步了方法1:
将现有的容器打包成镜像,然后在使用新的镜像运行容器时重新指定要映射的端口,比较暴力方法2:
直接修改当前容器的配置文件
# 停止容器 但是停止容器之前记得吧容器ID记下来哟
docker stop 容器ID/name
# 停掉docker服务
systemctl stop docker
# 查看容器的端口映射 是空
docker port 容器ID/name
# 进入容器配置文件的存放目录
# 注意 这里的容器ID需要是完全的 一般docker ps之类看到的都是部分的 可以使用docker inspect 查看完整的容器id
cd /var/lib/docker/containers/容器Id
vim hostconfig.json
vim config.v2.json
注意我们要实现的是将主机的8088端口和容器的22端口进行映射,并且此前两者不存在其他的映射关系
首先是在hostconfig.json中添加如下:
然后在config.v2.json中添加如下两处:
# 发现端口映射成功了
docker port Det-yxx
# 启动docker服务
systemctl start docker
# 启动容器
docker start Det-yxx
# 容器中启动ssh
/etc/init.d/ssh restart
# 容器中查看端口 发现被22端口占用了已经
netstat -anp |grep 22
# 主机中查看端口 发现被8088端口占用了已经
netstat -anp |grep 8088
安装完虚拟环境后 CUDA调用不了
# 查看当前python解释器和所有的python解释器
import sys
sys.executable
sys.path
# 安装虚拟环境的时候 CUDA版本最好和容器的CUDA版本一致 不一致的话就会出现CUDA无法调用的情况
# 我之前直接使用了本机装虚拟环境时使用的命令 忽略了本机的CUDA之类的基本环境和容器的区别
# 容器是基于镜像生成的,镜像的CUDA版本是10.2 所以虚拟环境中也要安装对应的pytorch
# conda install pytorch==1.9.0 torchvision==0.10.0 torchaudio==0.9.0 cudatoolkit=10.2 -c pytorch
opencv的使用问题
# opencv的安装
pip install opencv-python
# 但是使用的时候报错
# Importerror: libgl.so.1: cannot open shared object file: no such file or directory
# 原因是opencv这些图像库会依赖一些计算机的软件,这些软件在容器中是没有的,我们需要手动安装一下
apt-get update
apt-get install ffmpeg libsm6 libxext6 -y
自定义软件包的使用
# 在跑别人代码的时候 发现一些自定义软件包的引用会存在问题如下:
# ModuleNotFoundError: No module named ‘lib‘
# 我们需要把对应的目录告诉python的解释器,比如下面这样,这表示当前目录下就存在lib这个包
import sys
sys.path.append('.')