Docker封装镜像&挂载本地目录过程记录(已完成)-2023.12.27

目录

1.过程背景

2.环境准备

3.配置过程

4.小结


1.过程背景

工作需要进行相关代码封装以便于移植到不同设备。Docker无疑是个很好的工具。

  • Docker是一个开源的容器化技术,提供了一种轻量级、高效且可移植的解决方案,用于打包、部署和运行应用程序。Docker的核心概念主要有三个:Docker镜像、Docker容器和Docker仓库。
  • Docker镜像:是应用程序运行的基础模板,它包含了一切运行应用程序所需的文件和配置。Docker镜像是一个只读模板,可以创建出一个Docker容器。
  • Docker容器:是实际运行应用程序的实例,它基于Docker镜像创建,包含了运行应用程序所需的所有环境和配置。每个容器都是相互隔离的,互不影响。
  • Docker仓库:是存储和管理Docker镜像的地方,可以将其视为一个代码仓库。私有仓库需要认证,而公开仓库则任何人都可以使用。

2.环境准备

Docker本身包含两个重要概念:容器镜像,其关系相当于函数类。那么其实Docker整体过程相当于:基于一个初始的类(镜像)中创建函数(容器)→配置函数内容,包括参数和引用其他的函数(运行环境)→将该函数(容器)重新编写成类(封装成另外的镜像)→在新创建的类(镜像)下建立不同函数并编写程序运行

从以上过程上来看比较麻烦,又要一个基础的镜像,又要从容器重新封装成镜像。就笔者理解,原因大概有两个,一是docker本质上还是类似于虚拟机,需要一个基础的运行环境,也是本身机制所限。二是基础镜像中有一些基础的cdk之类的不用重新构建,而且已经封装好的镜像不受容器影响,所以只能从镜像构建容器,配置环境后重新封装成镜像。

这样做最大好处在于,由配置好的容器封装成的镜像,包含了目标运行代码的所有条件,如果到不同设备上只用:移植镜像→构造容器→填入代码运行。

本次尝试采取的基础镜像是从Docker商店pull下来的最新的ubuntu的镜像(Docker商店相当于Windows商店一样,提供了一下作者发布的自己封装的镜像)

具体指令为:

docker pull ubuntu

其中注意的是,笔者亲测ubuntu18.04版本相对配置麻烦,不建议作为基础镜像。

通过如下指令可以看到下载的镜像:

docker images -a


3.配置过程

(1)配置过程按照第2部分介绍顺序即可,首先依据基础镜像进行容器建立:

docker run --name  xxx -it  /path/to/one:/path/to/two ubuntu:latest /bin/bash

docker run:创建容器的命令,与之相关的参数可以自行查询参数

--name:容器命名

-it:i 交互模式,t 重新分配伪终端入口。

/path/to/one:/path/to/two ubuntu:地址映射one映射到two,在这里做映射有两点作用,一是将要运行的本地或者云端代码(需要加端口和域名)映射到容器内,封装时不占用镜像实际大小。二是在容器1这里先映射了,避免封装到另外的镜像后重新建立容器2运行代码报错,又得到容器1增加配置,再走封装流程。这里建立容器1并映射后,配置环境,运行调通再封装镜像。

ubuntu:latest:依赖的镜像名称,镜像名:tag,这里tag是latest,pull时候默认分配,pull时候自己可以设置,封装时也需要注意选取。或者时用固定分配ID如图中174c8c..........来代替ubuntu:latest。

/bin/bash:载入容器后运行bash。

创建以后可以采取一下命令查看列表是否有上述name来确定是否创建成功:

docker ps -a

(2)接下来就是进行容器环境的配置,其中有不少的小坑,这里建议按照笔者的顺序运行。

apt-get update

apt-get install sudo

apt-get python3

apt-get python3-pip

这里笔者配置的是ultralytics相关环境,如果这里依赖的镜像是ubuntu18.04如果单独apt-get pip将会提示搜索不到pip,但是如果用pull最新的ubuntu可以用apt-get pip检索到python3-pip。

pip install --upgrade pip

更新pip到最新版本,这里以及之后用root下进行pip会报黄色警报

WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv

这里参考一些文章,采用python的环境管理工具python3-venv,建立python下环境好一些:

apt-get install python3-venv 

sudo python3 -m venv xxxx

source xxxx/bin/activate

pip install ultralytics

等待安装完成即可。

(3)运行代码

python xxx.py

这里存在一个问题就是opecv相关,在docker容器内运行可能会报一个opecv的错误:

ImportError: libGL.so.1: cannot open shared object file: No such file or directory

这里笔者搜索过相关文章,主要解决方法是安装opencv-python-headless库:

pip install opencv-python-headless

这里还需要注意的是

以挂载形式呈现的源码在docker容器运行,涉及加载图像路径的时候需要以实际docker的路径为基准,例如笔者采取以下挂载:

/home/xxx/ultralytics:/ultralytics

将home下xxx文件夹中的ultralytics挂载到了docker容器中ultralytics文件夹,此时笔者源码读图像的路径是/home/xxx/ultralytics/datasets/food/test/。如果在docker容器内直接运行源码此时就会报错,因为现在实际的图像路径为:

/home/ultralytics/datasets/food/test/

所以最好的方式是在确定最后进行docker封装时,编写相关路径直接以运行脚本为基准的相对路径编写,比如笔者要运行/home/xxx/ultralytics/xxx.py,那么读取图像的路径可以直接编写为./datasets/food/test/即可。

这里还需要注意的是

由于是挂载到docker容器内,所以在docker容器内运行其实等同于在原路径运行,保存也是实际保存在原路径下。

(4)镜像封装

镜像封装主要采用以下的命令:

docker commit -a "作者名" -o "备注信息" xxx xxx1:xxx2

xxx-此处填写的是创建容器时填写的名称。

xxx1:xxx2-此处xxx1填写的是欲创建的镜像名称,xxx2填写的是该镜像tag(类似于昵称,标记)。

(5)镜像保存

docker save -o /path/to/save/xxx.tar/zip/... xxx1:xxx2

-o:--output,表示输出到文件。

/path/to/save/xxx.tar/zip/...:保存的地址/文件名.文件格式。

xxx1:xxx2:同上。

这里需要注意的是,所有的容器名,镜像名:tag都可以用自身ID代替,具体的容器ID和镜像ID可以通过docker ps -adocker images -a 查询。

(6)容器及镜像删除

容器删除需要先停止容器的运行,采取以下命令即可:

docker stop xxx/ID

随后删除容器:

docker rm xxx/ID 

镜像删除命令类似:

docker rmi xxx1:xxx2/ID

 最后需要注意的是,容器和镜像相关的信息记不起来的话可以用上节提到的查询命令查询。


4.小结

Docker是个蛮好的工具,笔者也是第一次进行配置和运用,有错误和理解不到位的地方欢迎批评改正。 

  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CDimage 是一款镜像制作工具,出自微软。它是微软内部“专用的”ISO 封装工具,不向外提供;所以,我们平时所看到的、使用的都是从微软内部泄露出来的~!!CDimage是系统整合不可少的利器,大大节省了光盘存放空间;我们平时见的"N合1”光盘大都是由CDimage(或内置CDimage内核的光盘工具,如Easyboot等)创建的。 但是我想网友们最关心的或许并不是以上问题,而是“CDimage到底能不能封装出SHA1值和官方一致的ISO镜像?”。下面我们就来说说CDimage的用法--其实你英文好的话用help命令查看即可!以下是常用参数[2.47版]的中文说明: -l 卷标,无空格(例如:-lMYLABEL) -t 所有目录和文件的时间标记,无空格,任意分隔符(例如:-t12/31/2000,15:01:00) -g 把文件时间从本地时间转换为GMT时间 -h 包含隐藏的文件和目录 -n 允许长文件名(比DOS的8.3文件名长) -nt 允许长文件名,与NT3.51兼容(-nt与-d不能同时使用) -d 不强制转换文件名的小写字母为大写字母 -c 使用ANSI文件名,不用源OEM文件名 -b "El Torito"光盘启动文件,无空格(例如:-bc:\location\cdboot.bin) -p "El Torito"启动目录的平台ID -e 在El Torito启动目录中不要设置软盘模拟方式 -s 在镜像文件中签上数字签名(无空格,给出RPC服务器名和结束点名称,像这样-sServerName:EndPointName) -x 在镜像中计算并制作"AutoCRC"值 -o 优化容量:重复的文件只制作一次 -y 试验选项,跟一个数字(例如:-y1),为试验的目的而产生ISO-9660的非标准变化: 1 在文件名后续加版本号';1'(7.5.1) 2 圆整目录大小为2K的倍数(6.8.1.3) 5 先写\i386目录,逆序 6 允许目录记录正好排到扇区结束点(符合ISO-96606.8.1.1但是突破了MSCDEX) 7 产生NT4.0下的16位应用程序时报警 -oc 更慢的重复文件探测方式:二进制比较而不是MD5哈西值 -oi 比较文件时忽略diamond压缩时间标记 -os 建立镜像时显示重复的文件(-o选项可以组合,像这样:-ocis) -k (keep)即使某些源文件打开失败也生成镜像 -m 忽略镜像文件最大681,984,000bytes的限制 -a 《分配概要》显示文件和目录的大小 -q 只扫描源文件,不建立镜像文件
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值