Docker离线镜像迁移与数据卷应用指南

创始人
2025-01-01 16:53:01
0 次浏览
0 评论

Docker离线镜像迁移

如果您需要在没有网络的机器上使用Docker,可以执行以下步骤来迁移镜像。

首先,显示网络中计算机上已安装的Docker映像的列表。
命令行。
选择要在离线环境中使用的图像并将其导出为压缩文件。
为此,找到图像的名称(通常在输出列表的红框区域中),然后使用相应的命令将其导出为.tar文件格式。
通过USB设备或其他可移动存储介质将导出的镜像文件(.tar格式)复制到离线目标机上。
在目标机器上解压压缩文件中的镜像内容。
您可以使用带有“-r”参数的复制命令将所有文件递归复制到指定目录,例如“cp-r/path/to/downloaded.tar/path/to/destination”。
最后,在目标机的Docker环境中,使用dockerload命令加载导出的镜像。
确保路径正确(例如“dockerload-i/path/to/destination.tar”)。
加载完成后,运行dockerimages命令检查镜像是否成功迁移并加载到目标机器上的镜像仓库中。

镜像文件格式无效

(镜像文件格式无效怎么办)1:容器数据量(重要)计算机1:cp命令通常数据在主机上如果只获取主机数据,可以使用cp命令。
如:首先启动nginx容器,外部可以使用8800端口访问问题:dockercontainerrun-d-it--nametest_nginx-p8800:80nginx启动成功,在浏览器扫描访问127.0.0.1:8800时可以显示nginx屏幕。
目前,所需数据在主机上,可以将主机文件cp到nginx容器配置文件中,相关路径为:dockercontainercp/docker/www/index.htmltest_nginx:/usr/share/nginx/html。

目前主页数据已更改,这种方式过于复杂单一,无法实时更新目前需要docker数据卷2:docker数据卷是在Docker中实现数据持久化(称为数据持久化)表示数据不跟随Container结束),数据需要从主机挂载到容器。
目前,Docker提供了三种不同的方式将数据从主机挂载到容器,有用的方法只有两种:挂载到容器上:-v或--volume。
如果是Docker17.06以上:建议使用--mount。
(同bindmount)2.1):第一种方法:volumes:Docker管理部分主机文件系统,默认位于/var/lib/docker/volume目录下(最常用的方法)1.创建自定义容器卷:dockervolumecreateetc_nginx2。
查看所有容器卷:dockervolumecomputerls3查看指定容器卷的详细信息:dockervolumeinspectetc_nginxMountpoint是一个挂起的容器主机。
4、使用指定卷创建容器:有了自定义的容器卷,我们就可以使用这个数据卷创建容器这里以nginx为例:dockercontainerrun-d-it--nametest_nginx2-p8811:80-vec_nginx。
:/usr/share/nginx/htmlnginx其中,-v表示数据卷挂载这里使用的是etc_nginx自定义数据卷,数据卷挂载到/usr/share/nginx/html(该目录是yum安装的目录)默认Web目录nginx)。
5.清理卷:暂停容器实例:dockercontainerstoptest_nginx2删除容器实例:dockercontainerrmtest_nginx2删除自定义数据卷:dockervolumermetc_nginx2.2):第二种方法:bindmounts:表示可以存储在主机系统中的任何位置;使用方式)dockercontainerrun-d-it--nametest2_nginx-p8800:80-v/docker/www/:/usr/share/nginx/htmlnginx这里指定挂主机上的/docker/www/目录(将会是如果不存在则自动创建)加载到/usr/share/nginx/html(该目录是yum安装nginx的默认web目录)。
在宿主机的/docker/www/下创建index.html,输入测试的内容在浏览器上访问127.0.0.1:8800的容器及其在宿主机上的内容。
再次进入容器,/usr/share/nginx/html/index.html文件已成功挂载为主机内容。
dockercontainerinspecttest2_nginx查看详细的容器信息,还可以在这里看到挂载信息的内容:总结:记住Docker数据卷以及挂载数据到容器的两种主要方式,Volumes和BindMounts通过数据卷,我们可以实现Docker数据保留,这一点被广泛应用在实际应用中使用。
2:自定义镜像docker文件(非常重要)在真实的生产环境中,我们通过原始镜像构建出一个容器后,通常会在这个容器中安装一些软件或者搭建一个环境,如果其他人也需要使用这个容器,那么就需要包裹图像。
1:Dockercommit命令1.1):下载镜像并运行容器当不使用docker文件时,我们需要手动创建镜像并使用命令犯罪。
例如:在ubuntu镜像中启动一个容器,启动到容器中,发现没有ssh命令,这时就需要我们自己安装了。
dockerimagepullubuntu#下载镜像dockercontainerrun-d-it--name=ssh_ubantuubuntu/bin/bash#运行容器dockercontainerexec-itssh_ubantu/bin/bash#进入容器,在容器中使用ssh命令,需要自己安装1.2):安装ssh在容器中安装ssh,官方镜像没有软件包,需要更新后再安装ssh。
installapt-getupdateapt-getinstallssh-ydid成功运行ssh命令!exit退出容器1.3):Dockercommit打包镜像:从容器创建新镜像。
语法:dockercommit[OPTIONS]CONTAINER[REPOSITORY[:TAG]]参数说明:-a:提交镜像的作者-c:使用Dockerfile命令创建镜像-m:提交时的描述文本-p:创建过程中暂停容器;默认为true)将ssh_ubantu镜像容器打包并打上标签ubantu:v1dockercommit-a"byroot"-m"addssh"ssh_ubantuubantu:v1再次使用Dockerimages即可看到成功添加的镜像二:Docker文件介绍及参数除第一次commit包外image,最常用也是最重要的是使用dockerfile创建镜像。
2.1):dockerfile简介:Dockerfile是一个用于构建镜像的文本文件,文本内容包含通过读取Dockerfile中的指令自动构建镜像所需的指令和命令。
DockerFile的基本结构:Docker文件通常分为四个部分:镜像基本信息、维护者信息、镜像操作指令和容器启动时的执行指令#是DockerFile中的注释。
Dockerfile文件说明:Docker按照从上到下的顺序执行Dockerfile命令。
要指定基础映像,第一个命令必须是FROM。
以#字符开头的语句被视为注释。
可以在Docker文件中使用RUN、CMD、FROM、EXPOSE、ENV等命令。
2.2):FROMFROMdockerfile关键字指定构建镜像的基础源镜像,如果本地没有指定镜像,则会自动从Docker的公共库中拉取镜像。
FROM必须是Dockerfile中非注释行的第一个命令,即Dockerfile以FROM语句开头。
如果需要在一个Dockerfile中创建多个镜像,FROM可以在一个Dockerfile中出现多次。
如果FROM语句没有指定镜像标签,则默认使用最新的标签。
格式:FROMFROM:FROM@示例:FROMmysql:5.6注意:tag或digest是可选的如果不使用这两个值,则将使用最新版本的RUN基础镜像来执行命令行命令。
下列。
有以下两种格式:shell格式:RUN#相当于在终端运行shell命令。
示例:RUNyuminstallwgeexec格式:RUN["可执行文件","参数1","参数2"]示例:RUN["./test.php","dev","offline"]相当于RUN./test。
phpdevoffline注意:每次执行Dockerfile命令时,都会在docker上创建一个新层。
因此,层数太多意味着任何东西都不会导致图像膨胀太多。
例如:FROMcentosRUNyuminstallwgetRUNwget-Oredis.tar.gz"http://download.redis.io/releases/redis-5.0.3.tar.gz"RUNtar-xvfredis.tar.gz上面的执行将创建一个3层镜像。
可以简化为以下格式:FROMcentosRUNyuminstallwget\&&wget-Oredis.tar.gz"http://download.redis.io/releases/redis-5.0.3.tar.gz"\&&tar-xvfredis.tar.gzas上面,带有&&符号链接命令,执行后只会创建第1层镜像。
MAINTAINER维护者信息格式:MAINTAINER示例:[email protected]命令复制,从其中复制文件或目录context目录复制到容器中指定的路径。
格式:COPY[--chown=:]...COPY[--chown=:]["",...""]示例:COPYhom*/mydir/COPYhom?.txt/mydir/#:源文件或资源目录,可以是通配符表达式。
#:此容器中指定的路径不需要先构建。
如果该路径不存在,则会自动创建。
ADD将本地文件添加到容器中,tar类型的文件会自动解压(网络压缩资源不会解压),网络资源可访问,就像wget一样。
ADD和COPY命令的使用格式相同(相同需求下,官方推荐COPY)。
功能类似,但区别如下:ADD的优点:当作为tar压缩文件执行时,如果压缩格式为gzip、bzip2和xz,则会自动复制并解压到。
ADD缺点:tar压缩文件不解压无法复制。
这将使映像构建缓存失效,从而可能使映像构建速度变慢。
具体是否使用可以根据是否需要自动解压来决定。
格式:ADD...ADD["",...""]用于支持包含空格的路径示例:ADDhom*/mydir/#添加所有以“hom”开头的文件ADDhom?.txt/mydir/#?替换一个字符,例如:"home.txt"ADDtestrelativeDir/#Add"test"to`WORKDIR`/relativeDir/ADDtest/absoluteDir/#Add"test"to/absoluteDir/CMD与RUN命令类似,用于运行一个程序,但是两个操作的执行时间不同:dockerrun时会运行CMDRUN的作用是为启动的容器指定默认运行的程序当程序执行完毕后,CMD命令指定的程序可以用作命令行参数dockerrun被Docker中指定的程序覆盖。
如果rfile中有多个CMD命令,则只有最后一个生效格式:CMDCMD["",""",...]CMD["","",...]#ThisisthespecifiedProgramENTRYPOINT命令提供了一个默认参数#建议使用第二种格式,执行第一种格式的过程是相当不言自明的,这个过程也会自动转换为第二种格式来运行,默认的可执行文件是sh示例。
:CM德乔“Thisisatest.”|wc-CMD[“/usr/bin/wc”]ENTRYPOINT使其可执行,并且可以仅使用参数来消除对“app.on”的需要。
与CMD命令类似,但不会被dockerrun命令行参数指定的命令覆盖,并且该命令行参数将作为参数传递给ENTRYPOINT命令指定的程序。
但是,如果运行dockerrun时使用了--entrypoint选项,这将覆盖CMD命令。
由命令定义的程序。
优点:执行dockerrun时可以指定ENTRYPOINT运行所需的参数注意:如果Dockerfile中有多个ENTRYPOINT指令,则只有最后一个生效格式:ENTRYPOINT["executable".,“参数1”。
,"param2"](可执行文件,优先级)ENTRYPOINTcommandparam1param2(shell内部命令)示例:FROMubuntuENTRYPOINT["top","-b"]CMD["-c"]ENV设置环境变量并定义环境变量,然后在中命令中,可以使用这个环境变量ARG构建参数,与ENV效果相同,但作用范围不同ARG设置的环境变量只在Dockerfile中有效,即这意味着它仅在dockerbuild过程中有效。
镜像中不存在此环境变量VOLUME定义了匿名数据卷。
如果启动时忘记挂载数据卷容器,它将自动安装到匿名卷。
目的:避免容器重启导致重要数据丢失,这是非常致命的。
避免种植容器。
EXPOSE只是声明端口。
功能:帮助镜像用户了解该镜像的业务控制器端口,方便配置映射。
当运行时使用随机端口映射时,即dockerrun-P时,EXPOSE端口会自动随机映射。
WORKDIR指定工作目录。
WORKDIR指定的工作目录将存在于每个构建的图像层中。
(必须首先创建WORKDIR指定的工作目录)。
在dockerbuild镜像构建过程中,每个RUN命令都是一个新层。
只有通过WORKDIR创建的目录才会始终存在。
正如cdUSER命令用于指定执行下一条命令的用户和用户组一样,这里只是改变执行下一条命令的用户(用户和用户组必须已经存在)。
ONBUILD触发器用于延迟构建命令的执行。
简而言之,在该镜像的构建过程中(假设该镜像是测试构建),Dockerfile中使用ONBUILD指定的命令将不会被执行。
当新的Dockerfile使用之前构建的镜像FROMtest-build并构建新镜像的Dockerfile时,将执行test-build的Dockerfile中ONBUILD指定的命令。
LABELLABEL命令用于以键值对的形式向镜像添加一些元数据,语法格式如下:LABEL===...参考这张图就很容易理解了:3:Docker文件。
实践。
构建nginx3.1镜像):在指定目录下创建Dockerfile配置文件注意:Dockerfile中第一个D是大写字母。
在/opt/docker目录下创建一个Dockerfile文件mkdir-p/opt/dockervim/opt/docker/Dockerfile3.2):写这个Dockerfile文件最简单的Docker文件配置就是yuminstall方法也可以自行下载编译安装方法。
注意:默认是centos8,有些参数无效,如EXPOSE、VOLUME等,目前需要fromcentos:7#基于centos的官方镜像FROMcentos作者信息,或者邮箱中的其他即时信息MAINTAINERyunwei#运行命令,使用yum安装nginx-1.20.1版本RUNyuminstall-yyum-utils\&&echo-e"[nginx-stable]\\nname=nginxstablerepo\\nbaseurl=http://nginx.org/packages/centos/\$releasever/\$basearch\\ngpgcheck=1\\nenabled=1\\ngpgkey=https://nginx.org/keys/nginx_signing。
key\\nmodule_hotfixes=true\\n[nginx-mainline]\\nname=nginxmainlinerepo\\nbaseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch\\ngpgcheck=1\\nenabled=0\\ngpgkey=https://nginx.org/keys/nginx_signing.key\\nmodule_hotfixes=true">/etc/yum.repos.d/nginx.repo\&&yuminstall-ynginx-1.20.1\3.3):用于构建映像的构建命令。
进入cd/opt/docker,使用build命令构建镜像,最后一个点代表当前目录,如果不在当前目录,则输入路径。
并将其标记为v1.1作为版本号。
dockerbuild-tnginx:v1.1如果成功看到两个,则构建成功查看`dockerimages`中当前镜像,已成功存在。
3.4):通过构建镜像来运行容器,并验证运行容器的命令是nginx_v1.1并且可以通过外部端口80访问。
dockercontainerrun-d-it--namenginx_v1.1-p80:80nginx:v1.1/bin/bash启动容器后,通过curl本地IPcurl发现错误:(7)Failedtoconnecttoport80:ConnectionDenied访问被拒绝,原因在Dockerfile中没有默认启动,需要输入容器来启动nginx。
启动并退出dockercontainerexec-itnginx_v1.1bash,回滚本机IP地址或者在浏览器中输入本地IP,成功看到nginx测试页面。
3.5):修改Docker文件适配nginx:V2.0,并在Dockerfile目录下创建nginx.repo文件创建nginx源码内容请参考:用yum安装的nginx如果需要VOLUMEXPOSE参数需要替换为centos:7源码,否则build会报错#基于centos官方镜像FROMcentos:7#作者信息,或者邮箱MAINTAINERyunwei中的其他即时信息#运行命令,使用yum安装nginx-1.20.1版本RUNyuminstall-yyum-utils\&&cpnginx.repo/etc/yum.repos.d/nginx.repo\&&yuminstall-ynginx-1.20.1\#暴露80端口,运行时使用EXPOSE80带-P参数#在容器中创建数据卷防止容器破坏导致数据丢失VOLUME/data1#容器启动nginx#ENTRYPOINT["nginx"]#关闭nginx后台运行并启动nginxCMD["nginx","-g","daemonoff;"]build构建nginx镜像dockerbuild-tnginx:v2.0。
后面不需要添加/bin/bash,因为daemonoff已经关闭了后台,防止容器因为nginx挂掉而挂掉。
dockercontainerrun-d-it--namenginx_v2.1-p8081:80nginx:v2.1dockercontainerls-a检查容器是否处于UP状态、成功启动且未挂起。
直接在浏览器中访问本机IP和8081端口,成功访问电脑。
热门文章
1
C语言编程:爱心图案代码解析与实现 爱心c语言程序代码详情如下。#include,intmain()inti,j,k...

2
C程序设计实践教程:系统学习与实际操作指... c程序设计实践教程内容简介这是一本《C程序设计》实用教程,共分10章,内容分为学...

3
C++字符串处理技巧:定义、操作与排序实... c++如何定义大量字符串字符*s[100];这样,你就会得到一个包含100个字符...

4
C语言实现字符剔除与输出——C++程序示... C语言C++程序编写要求键盘输入一串字符,然后剔除其中一个字符,再输出剩下的字符...

5
C语言for循环嵌套执行原理及运算流程解... c语言中for循环嵌套的运算流程?for循环的一般形式为:for(表达式1;表达...

6
C语言实现100以内素数和计算方法详解 c语言求100以内素数的和解决方案1:#include#includeintpr...

7
Java面试常见问题解析攻略 一般java面试都会问些什么问题1您能介绍一下自己吗?回答提示:大多数人回答这个...

8
AI代写应用解析:从学生到技术工人,探索... ai代写使用人群有哪些学生、科技工作者等。学生:无论是初中生、大学生还是研究生,...

9
Python编程教程:0-10000数字... python输入0-10000的一个数,将数字转换成中文汉字零一二三四五六七八九...

10
C语言贪吃蛇游戏开发详解:从初始化到游戏... 贪吃蛇c语言代码#defineN200#include#include#incl...