将项目封装进docker进行迁移和使用
首先要理解docker的基本使用,本文不做过多阐述,博主也对docker没有了解透彻。
这里列一下docker的基本命令:
docker info # 查看docker信息
docker -v # 查看docker版本
docker images # 查看docker所有的镜像
docker ps -a # 查看docker所有的容器
docker rm ${容器id} # 删除容器
docker rmi ${镜像id} # 删除镜像 -f:强制删除;
docker cp ${本地文件的路径} ${容器id}:${容器内文件路径} # 传输文件,宿主机->容器
docker cp ${容器id}:${容器内文件路径} ${本地文件的路径} # 传输文件,容器->宿主机
docker start ${容器名} # 启动容器
docker attach ${容器名} #进入容器
docker stop ${container id} # 根据容器id终止运行的容器
Ctrl+d # 退出容器
Ctrl+p+q # 退出容器而不关闭
docker rename ${旧的容器名} ${新容器名} # 修改容器名字
docker tag ${旧的容器id\旧的镜像名} ${新的镜像名}
docker commit -m ${备注信息} ${容器id/容器名} ${新的镜像名}:${新的镜像tag} # 修改完容器中内容,保存为新的镜像
docker save -o ${目标文件} ${镜像名}:${镜像tag} # 镜像导出
docker save -o nginx.tar nginx:latest # 样例,其中-o和>表示输出到文件,nginx.tar为目标文件,nginx:latest是源镜像名(name:tag)
docker load -i ${目标文件} # 镜像导入
docker load -i nginx.tar # 样例, 其中-i和<表示从文件输入。会成功导入镜像及相关元数据,包括tag信息
docker run --name=${容器名} --ipc=host -it --gpus all -p ${主机端口}:${容器端口} --cpu-shares 1024 -v ${主机文件夹}:${容器文件夹} ${REPOSITORY}:${TAG} /bin/bash
docker run --name=mmdet --ipc=host -it --gpus all -p 7777:8888 --cpu-shares 1024 -v /home/gy77:/workspace/ pytorch/pytorch:1.12.0-cuda11.3-cudnn8-devel /bin/bash
# --name: 容器名
# --ipc=host: 容器间共享宿主机的内存
# -i: 交互式操作。
# -t: 终端。
# --gpus all :启动所有的gpu
# detrex:v1: 这是指用 ubuntu 15.10 版本镜像为基础来启动容器。
# --cpu-shares 1024 : 设置容器按比例共享CPU资源(容器A是1024,容器B是2048,则是按照1:2)
# /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
# docker增加非管理员的权限
cho $USER
sudo gpasswd -a $USER docker
newgrp docker
docker 添加国内镜像源
ubuntu:
vim /etc/docker/daemon.json
内容如下:
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
]
}
service docker restart # 重启docker
docker info # 验证是否成功
封装项目
本文以detrex项目为例,讲解如何把一个项目封装进docker以便更好的转移。
1️⃣ 拉取pytorch镜像
ptorch镜像网址:https://hub.docker.com/r/pytorch/pytorch/tags
去找一个适合自己的pytorch版本镜像,拉取到本地。这里博主拉取 pytorch:1.12.0-cuda11.3-cudnn8-devel 。可以看到是对应的cuda11.3版本,在宿主机(也就是服务器)中安装的cuda版本最好一致。
️ 值得注意的是,我们要拉取结尾为devel 的镜像。
docker pull pytorch/pytorch:1.12.0-cuda11.3-cudnn8-devel
2️⃣ 创建容器
拉取完毕后,我们可以用docker images 命令查看一下,创建容器
gy77@ECS-yd24:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
pytorch/pytorch 1.12.0-cuda11.3-cudnn8-devel 43a3ceca55fd 8 months ago 14.1GB
根据自己的需求创建容器:
docker run --name=${容器名} --ipc=host -it --gpus all -p ${主机端口}:${容器端口} --cpu-shares 1024 -v ${主机文件夹}:${容器文件夹} ${REPOSITORY}:${TAG} /bin/bash
# 例子:
docker run --name=detrex --ipc=host -it --gpus all -p 7777:8888 --cpu-shares 1024 -v /home/gy77:/workspace/ pytorch/pytorch:1.12.0-cuda11.3-cudnn8-devel /bin/bash
# --name: 容器名
# --ipc=host: 容器间共享宿主机的内存
# -i: 交互式操作。
# -t: 终端。
# --gpus all :启动所有的gpu
# detrex:v1: 这是指用 ubuntu 15.10 版本镜像为基础来启动容器。
# --cpu-shares 1024 : 设置容器按比例共享CPU资源(容器A是1024,容器B是2048,则是按照1:2)
# /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
3️⃣ 连接容器
创建容器后,我们就可以在另一个终端中利用 dockers ps -a 命令看到已启动的容器。
如果想让一个新的终端窗口进入容器,使用docker attach命令(容器启动的情况下),容器未启动的情况下,先启动容器。
docker start ${容器名} # 启动容器
docker attach ${容器名} # 连接容器
4️⃣ 在容器中搭建我们项目的环境。
每个人的项目不一致,这里就需要自己在容器中搭建自己的项目环境了。
# 基础的ubuntu软件包先更新一下:
apt update
# 搭建项目环境(detrex为例):
cd /workspace
git clone https://github.com/IDEA-Research/detrex.git
cd detrex
git submodule init
git submodule update
python -m pip install -e detectron2
pip install -e .
# 测试推理你的项目
cd detrex
# download pretrained DINO model
wget https://github.com/IDEA-Research/detrex-storage/releases/download/v0.2.1/dino_r50_4scale_12ep.pth
# download the demo image
wget https://github.com/IDEA-Research/detrex-storage/releases/download/v0.2.1/idea.jpg
# 验证gpu
python demo/demo.py --config-file projects/dino/configs/dino_r50_4scale_12ep.py \
--input "./idea.jpg" \
--output "./demo_output.jpg" \
--opts train.init_checkpoint="./dino_r50_4scale_12ep.pth"
5️⃣ 将容器打包为镜像。
docker commit -m ${备注信息} ${容器id/容器名} ${新的镜像名}:${新的镜像tag} # 修改完容器中内容,保存为新的镜像
6️⃣ 镜像导出和导入
docker save -o ${目标文件} ${镜像名}:${镜像tag} # 镜像导出
docker save -o detrex_img.tar detrex:latest # 样例,其中-o和>表示输出到文件,nginx.tar为目标文件,nginx:latest是源镜像名(name:tag)
docker load -i ${目标文件} # 镜像导入
docker load -i detrex_img.tar # 样例, 其中-i和<表示从文件输入。会成功导入镜像及相关元数据,包括tag信息
将项目封装进docker进行迁移和使用的更多相关文章
- springboot项目封装为docker镜像
1.本次镜像的基础镜像是:https://www.cnblogs.com/JoeyWong/p/9173265.html 2.将打包好的项目文件放在与Dockerfile同级的目录下 3.Docker ...
- docker gitlab迁移 备份 部署 搭建以及各种问题
当前环境 服务器A 服务器B ubuntu docker gitlab(版本一致) docker安装gitlab 由于考虑到gitlab 包含了⾃身的nginx.数据库.端⼝占⽤等等因数,这⾥使⽤的是 ...
- 将DLL文件直接封装进exe执行文件中(C#)
前言:由于项目需要,需制作一个注册机,将个人PC的MAC值和硬盘序列号与软件进行绑定,由于笔者的C++不是很好,所以采用C#进行开发.但在采用C#的时候,获取硬盘的MAC值和序列号的时候又不是很准确, ...
- JAVA项目如何通过Docker实现Jenkins持续部署
原文地址:http://blog.51cto.com/dadonggg/1957691 本篇实操性的案例讲解——JAVA项目如何通过Docker实现持续部署(只需简单四步), 即:开发通过git pu ...
- 从零开始通过idea插件将一个spring boot项目部署到docker容器里运行
实操:将一个spring boot项目部署到docker容器里运行 实验需要的环境: 腾讯云+Ubuntu 16.04 x64+idea+插件docker integration+daocloud 第 ...
- VUE+ELEMENT-UI的后台项目封装组件--查询form的封装
最近项目打算重构,项目的模块几乎都是以后台查询展示的传统的增删改差模式,所以卑微的我想要自己封装一下查询form,先上效果图 子组件页面: <template> <div class ...
- idea使用docker-maven-plugin插件将项目编译为docker镜像到远程linux服务器 原
在使用idea开发时,直接docker-maven-plugin插件,把项目编译成docker镜像,然后通过docker:push推送到linux服务器,非常简单,快捷,也避免了手动打包,然后拷贝wa ...
- 项目从.NET 4.5迁移到.NET 4.0遇到的问题
当把项目从.NET 4.5迁移到.NET 4.0时,遇到的问题和解决如下: 在"属性--应用程序--目标框架"设置成.NET 4.0版本. 重新生成项目,报有关EF的错: 卸载掉项 ...
- ICMP 隧道——将流量封装进 IMCP 的 ping 数据包中,旨在利用 ping 穿透防火墙的检测
利用 ICMP 隧道穿透防火墙 转自:http://xiaix.me/li-yong-icmp-sui-dao-chuan-tou-fang-huo-qiang/ 以前穿透防火墙总是使用 SSH 隧道 ...
- JDBC课程4--使用PreparedStatement进行增删查改--封装进JDBCTools的功能中;模拟SQL注入 ; sql的date()传入参数值格式!
主要内容: /*SQL 的date()需要传入参数值: preparedStatement().setDate(new java.util.Date().getTime()); 熟悉了使用Prepar ...
随机推荐
- java 携带session 前台传递cookie 跨域解决方案 vue + java
前台 axios 设置 withCredentials: true 后台设置 跨域 header("Access-Control-Allow-Origin","源地址&q ...
- gyroflow.xyz - 视频防抖 支持相机 gopro 不支持手机视频 - 软件推荐
gyroflow.xyz - 视频防抖 支持相机 gopro 不支持手机视频 - 软件推荐 https://gyroflow.xyz/ https://github.com/gyroflow/gyro ...
- K8s中Labels(标签)和Annotations(注解)对比
在Kubernetes中,Labels(标签)和Annotations(注解)都是用于为资源对象添加元数据的机制,但它们在用途.选择能力以及数据形式上存在一些关键的区别. 首先,Labels主要用于标 ...
- Java/Kotlin 实现控制台输出日志保存到文件
原文:Java/Kotlin 实现控制台输出日志保存到文件 | Stars-One的杂货小窝 之前开发的几款软件,用户用着的过程中,偶尔会存在报错问题,想保留一份日志出来,之后可由用户发过来,进行问题 ...
- isPrimitive()方法和包装类
java.lang.Class.isprimitive()是说:确定指定的Class对象是基本类型,其返回是个boolean值,true代表你指定的这个Class对象是基本类型,false代表这个Cl ...
- Android实际开发bug大总结
目录介绍 1.1 java.lang.UnsatisfiedLinkError找不到so库异常 1.2 java.lang.IllegalStateException非法状态异常 1.3 androi ...
- 记录--P0事故预警
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 背景 某一天,前端小余同学和后端别问我小哥在做登录业务接口对接,出于业务的特殊性和安全性的考虑,她和后端小哥约定"user&qu ...
- Redis 中 scan 命令太坑了,千万别乱用!!
作者:铂赛东\链接:www.jianshu.com/p/8cf8aac3dc25 1 原本以为自己对redis命令还蛮熟悉的,各种数据模型各种基于redis的骚操作.但是最近在使用redis的scan ...
- 大模型落地实战指南:从选择到训练,深度解析显卡选型、模型训练技、模型选择巧及AI未来展望—打造AI应用新篇章
大模型落地实战指南:从选择到训练,深度解析显卡选型.模型训练技.模型选择巧及AI未来展望---打造AI应用新篇章 0.前言大模型发展史 早期阶段(1950s~1980s) 在1950年代初期,人们开始 ...
- C# Mat Bitmap互转
var mat = OpenCvSharp.Extensions.BitmapConverter.ToMat(source);//bitmap转mat Cv2.CvtColor(mat, mat, C ...