一 . 实施背景
因项目中可能使用的opencv版本比较高,(ubuntu18.04中ros自带opencv版本低(3.0),直接使用opencv编译比较麻烦(时间消耗太长))主要是依赖ros环境,所以直接使用docker安装ubuntu20.04的系统环境,这样可以使用较高版本的ros-opencv,20.04中opencv版本为4.0,所以搭建如此环境:其中驱动以及cuda cudnn tensorrt都是自己安装(和linux_x86基本一致)
二 . docker 镜像设置 “用于加速下拉镜像”
“主机中输入以打开docker镜像配置修改”
vim /etc/docker/daemon.json
or
gedit /etc/docker/daemon.json
{
"registry-mirrors": ["https://epsax6ut.mirror.aliyuncs.com"],
}
{
"registry-mirrors": ["https://f6tophti.mirror.aliyuncs.com"]
}
三 . docker相关命令
“root下直接使用docker //用户名下需要在docker 命令前加上sudo”
1. docker查看镜像
docker images2. docker查看容器
docker ps -a3. docker 启动镜像—也就成为了容器
docker run -it --name=镜像名字 --gpus all 镜像名字:版本 /bin/bash4. docker 进入容器内部
docker exec --it (容器)id /bin/bash
// 如果进不去需要将dokcer ps -a中的id start:
docker (容器)id start
docker exec -it (容器)id /bin/bash
//运行此命令就算进来我们的容器了
讲解:上述3为启动镜像为容器,若想要在新的终端中查看容器 不可再次执行上述3 :单次执行3启动不一样的容器可以使用上述2来查看,当启动镜像为容器后执行4即可进入容器
- docker映射我们宿主机的驱动 (docker内装不了驱动,所以映射主机的需要确定主机是否有nvidia-smi)
docker run --gpus all 镜像名字:版本 /bin/bash
注意:宿主机和容器驱动统一,容器内环境需要和驱动兼容
- docker容器内 静态查看gpu占用/动态查看gpu占用 //映射后查看gpu占用率的命令
nvidia-smi or watch -n 1 nvidia-smi - 删除容器 镜像 (先删容器再删除镜像)
docker rm -f (容器)id//删除你启动的容器
docker rmi (镜像)id //删除你创建的镜像 - docker内有时候更改docker内source后需要重启镜像才会生效
docker restart (容器)id - 提交容器为镜像(在你自己的本地备份一个环境,以免没有备份时,基础环境被自己破坏)
docker commit -m “描述” -a “作者” (需要备份的容器)id 备份后镜像名字:版本
注意:1. docker容器是启动某个镜像后生成的容器内进行操作,若在操作容器没有备份的情况下删除了该容器,则资料全无。
2.再次启动镜像为容器----则为新的容器 .3.commit后正常来说docker image 后会展示你备份的新的镜像,证明备份成功,可使用下述12将镜像打包至它处
- docker外部复制进来东西 /home/dudu/work为容器内自己创建的路径
docker cp ./cudnn-linux-x86_64-8.4.1.50_cuda10.2-archive.tar.xz (容器id):/home/dudu/work - 导出镜像包 和导入镜像包
docker save -o ***.tar (镜像名字)name:(镜像版本)version
docker load -i ***.tar - docker设置容器启动时,带起来自启动脚本 :-c 为该容器内路径
docker run -it --name=镜像名字 --gpus all 镜像名字:版本 /bin/bash -c “/etc/service_init.sh start” - 设置容器开机自启动
docker update —restart=always 容器id - 挂载相关位置(外变内变)
doker run -it -v /home/:/home name /bin/bash
注意:挂载到宿主机可以说是只用docker内环境保证宿主机环境的干净,程序在外边(运行程序要在docker内),容器内挂载位置若有程序,最好备份,因为挂载后容器以宿主机为主,宿主机/home/路径下没有文件,docker内/home/下有也会消失,除非容器挂载位置的文件夹干净。
四 . 上传镜像
“用户可以通过 docker push 命令,把自己创建的镜像上传到仓库中来共享。例如,用户在 Docker Hub 上完成注册后,可以推送自己的镜像到仓库中,远程仓库可设置权限,可以设置与其他用户共享。”
1 . docker查看镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu20.04_best latest affaa49f362e 7 weeks ago 18.8GB
2 .将本地制作镜像上传至云端阿里云 (自己创建账号)
sudo docker restart
3 .docker镜像打包 == tag ubuntu20.04_best:latest
docker tag ubuntu20.04_best:latest registry.cn-beijing.aliyuncs.com/ubuntu_20-04/ubuntu20.04_best:1.0
4 .再次查看镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu20.04_best latest affaa49f362e 7 weeks ago 18.8GB
registry.cn-beijing.aliyuncs.com/ubuntu_20-04/ubuntu20.04_best 1.0 affaa49f362e 7 weeks ago 18.8GB
5 . 上传docker hub
docker push registry.cn-beijing.aliyuncs.com/ubuntu_20-04/ubuntu20.04_best:1.0
注意:由于我自己做的镜像为ubuntu系统,其中含有大量深度学习的相关依赖,做出的镜像大概占用50G,docker hub指定传不上去,所以自己硬盘备份。