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


    一、获取镜像

    docker pull ubuntu:18.04
    
    • 1

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

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

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

    二、查看镜像信息

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

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

    -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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

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

    例如:

    docker tag ubuntu:latest myubuntu:latest
    
    • 1

    在这里插入图片描述

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

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

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

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

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

    在这里插入图片描述

    三、搜索镜像

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

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

    四、删除和清理镜像

    4.1.使用标签删除镜像

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

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

    在这里插入图片描述

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

    docker rmi 镜像ID

    注意:当该镜像创建的容器存在时,镜像文件无法被删除
    在这里插入图片描述
    也可以使用-f强制删除,通常不推荐,正确的做法是先删除依赖该镜像的所有容器,再删除该镜像。
    在这里插入图片描述

    4.3. 清理镜像

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

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

    五、创建镜像

    创建镜像的方法主要有三种:基于已有镜像的容器创建、基于本地模板导入、基于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				# 提交时暂停容器运行
    
    • 1
    • 2
    • 3
    • 4

    比如执行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创建

    可以参考这篇文章https://blog.csdn.net/weixin_53246927/article/details/125755563的Dockerfile操作常用命令

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

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

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

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

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

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

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

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

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

    5、CMD

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

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

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

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

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

    优先级:
    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
    
    • 1
    • 2
    • 3
    • 4

    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账号名
    
    • 1

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

    docker tag local-image:tagname new-repo:tagname
    docker push new-repo:tagname
    
    • 1
    • 2

    建了仓库发现还是失败,然后我就开始了试错的过程,直到我试到下列图片的第一句,我幡然醒悟,发现是自己没tag
    在这里插入图片描述
    然后就成功了,在docker hub就可以查看镜像了
    在这里插入图片描述

  • 相关阅读:
    java计算机毕业设计小区停车场信息系统源码+系统+数据库+lw文档+mybatis+运行部署
    基于用户协同过滤,基于物品协同过滤
    tf.nn
    “RunningEventsDuration“ app Tech Support(URL)
    华为认证 | 考HCIE,真的不需要先考HCIP
    计算机竞赛 深度学习卫星遥感图像检测与识别 -opencv python 目标检测
    【轨迹跟踪】基于matlab拓展卡尔曼滤波时序四旋翼无人机状态跟踪【含Matlab源码 2246期】
    Spring中常用的注解
    java程序员都应该知道的Java 截取字符串的几种操作
    堆 AcWing 838. 堆排序
  • 原文地址:https://blog.csdn.net/Annie_0321/article/details/127557964