Docker专题(一)之 镜像的一些操作

编程入门 行业动态 更新时间:2024-10-25 11:30:51

Docker专题(一)之 <a href=https://www.elefans.com/category/jswz/34/1770431.html style=镜像的一些操作"/>

Docker专题(一)之 镜像的一些操作

文章目录

      • 一、获取镜像
      • 二、查看镜像信息
        • 2.1. 使用image命令列出镜像
        • 2.2. 使用tag命令添加镜像标签
        • 2.3. 使用inspect命令查看详细信息
        • 2.4. 使用history命令查看镜像历史
      • 三、搜索镜像
      • 四、删除和清理镜像
        • 4.1.使用标签删除镜像
        • 4.2. 使用镜像ID来删除镜像
        • 4.3. 清理镜像
      • 五、创建镜像
        • 5.1. 基于已有镜像的容器创建
        • 5.2. 基于本地模板导入
        • 5.3. 基于Dockerfile创建
      • 六、存出和载入镜像
        • 6.1 存出镜像
        • 6.2 载入镜像
      • 七、上传镜像

一、获取镜像

docker pull ubuntu:18.04

注意:一般默认是拉取标签为latest的镜像,而镜像的latest意味着该镜像的内容会跟踪最新版本的变化而变化,内容是不稳定的!

子命令支持的选项主要包括:

-a, --all-tags=true|false 			# 默认是false
--disable-content-trust				# 取消镜像的内容校验,默认为true
--registry-mirror=proxy_URL			# 指定镜像代理服务地址,可用于加速docker镜像获取

二、查看镜像信息

2.1. 使用image命令列出镜像
docker images

子命令支持的选项主要包括:

-a, --all=true|false				# 列出所有(包含临时文件)镜像文件,默认为false
--digests=true|false				# 列出镜像的数字摘要,默认为false
-f, --filter=[]						# 过滤列出的镜像,也可以指定带有特定标注的镜像等
--format="TEMPLATE"					# 控制输出格式,如.ID代表ID信息,.Repository代表仓库信息等
--no-trunc=true|false				# 对输出结果中太长的部分是否进行截断,如镜像的ID信息,默认为true
-q,--quiet=true|false				# 仅输出ID信息,默认为false

更多命令,可以通过man docker-images进行查看

2.2. 使用tag命令添加镜像标签

例如:

docker tag ubuntu:latest myubuntu:latest

2.3. 使用inspect命令查看详细信息

使用inspect命令就可以获取该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等信息

docker [image] insepect ubuntu:18.04
2.4. 使用history命令查看镜像历史

镜像文件由多个层组成,使用该命令可以列出各层的创建信息

docker history ubuntu:18.04
# 也可以加镜像的IMAGE ID
docker history 123443f0f0f0

三、搜索镜像

docker search [option] keyword
其中 option 包括:

-f, --filter filter				# 过滤输出内容
--format string					# 格式化输出内容
--limit int						# 限制输出结果个数,默认为25
--no-trunc						# 不截断输出结果

四、删除和清理镜像

4.1.使用标签删除镜像

docker rmi或者docker image rm,命令格式为docker rmi image [IMAGE...]
支持的选项包括

-f, -force 						# 强制删除镜像
-no-prune						# 不要清理未带标签的父镜像

4.2. 使用镜像ID来删除镜像

docker rmi 镜像ID

注意:当该镜像创建的容器存在时,镜像文件无法被删除

也可以使用-f强制删除,通常不推荐,正确的做法是先删除依赖该镜像的所有容器,再删除该镜像。

4.3. 清理镜像

使用docker一段时间后,系统中可能会遗留一些临时的镜像文件,以及一些没有被使用的镜像,可以通过docker image prune命令来进行清理
支持的选项包括:

-a, -all						# 删除所有的无用镜像,不光是临时镜像
-filter filter					# 只清理符合给定过滤器的镜像
-f, -force						# 强制删除镜像,而不进行确认提示

五、创建镜像

创建镜像的方法主要有三种:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建。

5.1. 基于已有镜像的容器创建

该方法主要是使用docker [container] commit 命令。格式为docker [container] commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
主要选项包括:

-a, --author=""					# 作者信息
-c, --change=[]					# 提交的时候执行Dockerfile命令,包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等
-m, --message=""				# 提交信息
-p, --pause=true				# 提交时暂停容器运行

比如执行sudo docker commit -a "Annie" -m "This is a docker commit test" 180a88bdc593 ubuntu:test利用insepect命令去查看镜像可以看到

5.2. 基于本地模板导入

主要使用docker [image] import [OPTIONS] file|URL|[REPOSITORY[:TAG]]
这里注意避个坑:一定要是.tar.gz结尾的压缩包文件才可以通过本地模板导入,刚开始我用了.jar文件直接导入是不行的

5.3. 基于Dockerfile创建

可以参考这篇文章

以下常用命令皆是借鉴上述连接:
1、FORM镜像
指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令

2、MAINTAINER名字
说明新镜像的维护人信息

3、RUN 命令
在所基于的镜像上执行命令,并提交到新的镜像中

当命令较长时,可以使用\来换行

4、ENTRYPOINT
ENTRYPOINT [“要运行的程序”,“参数1”,“参数2”]

设定容器启动时第一个运行的命令及其参数

可以通过使用命令docker run --entrypoint 来覆盖镜像中的ENTRYPOINT指令的内容。

两种格式:
exec格式(数值格式):ENTRYPOINT [“命令”,“选项”,“参数”]shell格式:ENTRYPOINT 命令 选项 参数

前面四个命令就可以创建成一个粗略的镜像。

5、CMD

CMD ["要运行的程序","参数1","参数2"]

启动容器时默认执行的命令或者脚本,Dockerfile只能有–条CMD命令。如果指定多条命令,只执行最后一条命令。

如果在dockerrun时指定了命令或者镜像中有ENTRYPOINT,那么cmd就会被覆盖。

CMD可以为ENTRYPOINT 指令提供默认参数

两种格式:
exec形式:CMD [“要运行的程序”,“参数1”, “参数2”]shell形式: CMD 命令 参数1 参数2

优先级:
docker run–entrypoint > Dockerfile ENTRYPOINT > docker run 命令 > Dockerfile CMD

6、EXPOSE 端口号
指定新镜像加载到Docker时要开启的端口

7、ENV 环境变量变量值
设置一个环境变量的值,会被后面的RUN使用

8、ADD 源文件/目录 目标文件/目录
将源文件复制到镜像中,源文件要与Dockerfile 位于相同目录中,或者是一个URL

注意事项

  • 如果源路径是个文件,且目标路径是以/结尾, 则docker会把目标路径当作一个目录,会把源文件拷贝到该目录下。如果目标路径不存在,则会自动创建目标路径。

  • 如果源路径是个文件,且目标路径是不以/结尾,则docker会把目标路径当作一个文件。如果目标路径不存在,会以目标路径为名创建一个文件,内容同源文件;如果目标文件是个存在的文件,会用源文件覆盖它,当然只是内容覆盖,文件名还是目标文件名。如果目标文件实际是个存在的目录,则会源文件拷贝到该目录下。注意, 这种情况下,最好显示的以/结尾,以避免混淆。

  • 如果源路径是个目录,且目标路径不存在,则docker会自动以目标路径创建一个目录,把源路径目录下的文件拷贝进来。如果目标路径是个已经存在的目录,则docker 会把源路径目录下的文件拷贝到该目录下。

  • 如果源文件是个归档文件(tar、bzip2压缩文件),则docker会自动帮解压。
    URL"下载和解压特性不能一 起使用。任何压缩文件通过URL拷贝,都不会自动解压。

9、COPY
COPY 源文件/目录目标文件/目录

只复制本地主机_上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中

ADD和COPY的区别:

ADD和COPY都可以复制本地文件到镜像中。

ADD可以将本地tar包解压后复制到镜像目录,也支持下载源文件。但不支持下载和解压同时使用。

COPY不支持解压,不支持下载。

10、VOLUME [“目录"]
在容器中创建–个挂载点

11、USER 用户名/UID
指定运行容器时的用户

12、WORKDIR 路径
为后续的RUN、CMD、 ENTRYPOINT 指定工作目录

13、ONBUILD 命令
指定所生成的镜像作为一个基础镜像时所要运行的命令。

当在一个Dockerfile 文件中加上ONBUILD指令, 该指令对利用该Dockerfile构建镜像 (比如为A镜像) 不会产生实质性影响。

但是当编写一个新的Dockerfile文件来基于A镜像构建一个镜像 ( 比如为B镜像)时,这时构造A镜像的Dockerfile文件中的ONBUILD指令就生效了,在构建B镜像的过程中,首先会执行ONBUILD指令指定的指令,然后才会执行其它指令。

14、AGR
设置编译镜像时加入的参数

使用ENV指令定义的环境变量始终会覆盖同名的ARG指令

ARG  CONT_IMG_VER
ENV  CONT_IMG_VER=V1.0.0
RUN  echo $CONT_IMG_VER
docker build --build-arg VER=v2.0

15、创建镜像
编写完成Dockerfile之后,可以通过docker build命令来创建镜像。

基本的格式为docker build [选项] 路径,该命令将读取指定路径下(包括子目录)的Dockerfile,并将该路径下所有内容发送给Docker服务端,由服务端来创建镜像。因此一般建议放置Dockerfile的目录为空目录。

另外,可以通过.dockerignore文件(每一行添加一条匹配模式)来让Docker忽略路径下的目录和文件。

要指定镜像的标签信息,可以通过-t选项。

在编写Dockerfile时,有严格的格式需要遵循:

1、第一行必须使用FROM指令指明所基于的镜像名称;
2、之后使用MAINTAINER指令说明维护该镜像的用户信息;
3、然后是镜像操作相关指令,如RUN指令。每运行一条指令,都会给基础镜像添加新的一 层。
4、最后使用CMD指令指定启动容器时要运行的命令操作。

ps:Dockerfile这个操作我还没看懂,等我看懂了再贴演示的图

六、存出和载入镜像

6.1 存出镜像

导出镜像到本地文件使用docker [image] save命令。该命令支持-o、-output string参数,导出镜像到指定文件中。

6.2 载入镜像

可以使用docker [image] load将导出的tar文件再导入到本地镜像库。支持-i、-input string选项,从指定文件中读取镜像内容。

可以发现再次载入的时候IMAGE ID都是相同的

七、上传镜像

可以使用docker [image] push命令上传镜像到仓库,默认上传到Docker Hub官方仓库(需要登录)。命令格式为docker [image] push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME["TAG]

失败的原因是因为没有登录docker hub,这个机制有点类似于github,需要先登录一下账号

sudo docker login -u username				# username的部分换成自己的docker hub账号名

然后输入密码就行了
然后我发现push的时候还是拒绝,我就去查找了原因,有个博主说需要先执行docker login这个语句,我去试了发现还是不行,后来我又通过网页登录了我的docker hub去查看发现没建仓库,于是手动建了一个,建完才发现右边有个语句提示

docker tag local-image:tagname new-repo:tagname
docker push new-repo:tagname

建了仓库发现还是失败,然后我就开始了试错的过程,直到我试到下列图片的第一句,我幡然醒悟,发现是自己没tag

然后就成功了,在docker hub就可以查看镜像了

更多推荐

Docker专题(一)之 镜像的一些操作

本文发布于:2024-02-12 21:01:41,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1689378.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:镜像   操作   专题   Docker

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!