前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >操作Docker镜像

操作Docker镜像

原创
作者头像
啃饼思录
修改2020-10-27 10:30:29
6030
修改2020-10-27 10:30:29
举报

清理镜像

一般来说,Docker使用一段时间后,系统中可能会遗留一些临时的镜像文件,以及一些没有使用的镜像,此时可以使用docker image prune命令来进行清理。

该命令支持的选项参数如下:(1)-f或者--force表示强制删除镜像,而不进行提示确认;(2)-a或者--all表示删除所有无用镜像,不仅仅是临时镜像;(3)-filter filter表示只清理符合给定过滤器的镜像。

同样这些选项参数都不用记忆,用的时候使用man docker-image-prune命令查看一下即可。

举个例子,开发者可以使用如下命令来自动清理临时的遗留镜像文件层,最后会提示释放的存储空间:

代码语言:txt
复制
[envythink@localhost ~]$ docker image prune -f

创建镜像

创建镜像有三种方法:(1)基于已有镜像的容器创建;(2)基于本地模板导入;(3)基于Dockerfile创建。

基于已有镜像的容器创建

基于已有镜像的容器创建,主要是使用docker commit [container]命令,其对应的格式为docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]],主要的选项参数格式为:(1)-a或者--author=""表示作者信息;(2)-c或者--change=[]表示提交的时候执行Dockerfile指令,包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等;(3)-m或者--message=""表示提交信息;(4)-p或者--pause=true表示提交时暂停容器的运行。

同样这些选项参数都不用记忆,用的时候使用man docker-commit命令查看一下即可:

接下来通过一个例子,来演示如何使用docker commit [container]命令创建一个新镜像。第一步,启动已经存在的ubuntu:latest镜像,并在其中进行修改操作。如新建一个test文件,之后退出即可,相应的代码如下:

代码语言:txt
复制
[envythink@localhost ~]$ docker run -it envyubuntu:latest /bin/bash
root@9dfcfb7dac63:/# touch test.txt
root@9dfcfb7dac63:/# exit

接着可以使用docker ps -a命令来查看一下当前所有容器的运行状况,如下所示:

请记住刚才我们创建的容器ID为9dfcfb7dac63,此时该容器与原envyubuntu:latest镜像相比,已经发生了变化,因此可以使用docker commit [container]命令来提交为一个新的镜像。注意提交的时候可以使用ID或者名称来指定容器,如:

代码语言:txt
复制
[envythink@localhost ~]$ docker commit -m "Added a new file" -a "Docker Envy" 9dfcfb7dac63 test:0.1
sha256:71ea5620150363e696d187c8e139fcd1fc4ab809a26c3d6f20bcee1ae422f025

可以看到执行命令后会返回新创建的镜像的ID信息,此时使用docker images命令查看本地镜像时就可以发现新创建的镜像已经存在了,如下所示:

基于本地模板导入

用户也可以直接从一个操作系统模板文件中导入一个镜像,主要使用docker import [container]命令,其对应的命令格式为docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]。要直接导入一个镜像可以使用OpenVZ提供的模板来创建,也可以使用其他已导出的镜像模板来创建。

举个例子,本地已经存在了一个名为ununtu-18.04的模板压缩包,之后可以使用如下命令直接导入:

代码语言:txt
复制
[envythink@localhost ~]$ cat ubuntu-18.04-x86_64-minimal.tar.gz | docker import - ubuntu:18.04

其对应的解释如下图所示:

基于Dockerfile创建

基于Dockerfile创建镜像是最常见的方式,Dockerfile是一个由一组指令组成的文本文件,其中的每条指令对应Linux中的一条命令,它可以利用给定的指令描述基于某个父镜像来创建新镜像。

Dockerfile结构大致分为4个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。请注意Dockerfile的每行只支持一条指令,但是每条指令可以携带多个参数,支持使用以#号开头的注释。

接下来学习一些较为常用的Dockerfile操作指令,如下表所示:

指令

说明

FROM镜像

用于指定新镜像所基于的镜像,注意它必须是第一条指令

MAINTAINER 名字

新镜像的维护人信息

RUN 命令

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

EXPOSE端口号

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

ENV 环境变量 变量值

设置一个环境变量的值,之后的RUN会使用

ADD 源文件/目录 目标文件/目录

将源文件复制到目标文件,源文件要与Docker位于同一目录下,或者为一个URL

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

将本地主机上的源文件/目录复制到目标地点,源文件/目录要与Dockerfile在同一目录下

VOLUME"目录"

在容器中创建一个挂载点

USER 用户名 /UID

指定运行容器时的用户

WORKDIR 路径

为后续的RUN、CMD、ENTRYPOINT指定工作目录

ONBUILD命令

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

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

指定启动容器时运行的命令或脚本,只能有一条CMD命令,多条时只有最后一条被执行

举个例子,接下来通过介绍基于envyubuntu:latest镜像来安装Python3,进而构成一个新的python:3镜像,相应的操作如下:

第一步,创建镜像工作目录并切换至该目录,在/home/envythink目录下新建pyhello目录,然后切换至该目录:

代码语言:txt
复制
[envythink@localhost ~]$ mkdir pyhello
[envythink@localhost ~]$ cd pyhello/

第二步,在pyhello目录下新建Dockerfile文件,并在里面添加配置信息:

代码语言:txt
复制
#基于ubuntu:latest镜像
FROM ubuntu:latest

#维护人的信息
LABEL version="1.0" maintainer="docker envy <envyzhan@aliyun.com>"

#创建镜像时执行的脚本文件
RUN yum update && yum install -y python3

第三步,创建镜像。开发者可以使用docker build [image] .命令来创建镜像,编译成功后本地将多出一个python:3的镜像,如下所示:

代码语言:txt
复制
docker build -t python:3 .

这样我们就通过上述命令创建出一个python:3的镜像。请注意该命令最后面有一个.号,请注意这个.号不是用来指定Dockerfile文件的所在位置,实际上使用-f参数来指定Dockerfile的路径。那么问题来了这个.号的作用是什么?

其实Docker在运行时分为Docker引擎(服务器守护进程)和客户端工具,而当我们使用docker各种命令的时候,其实就是在使用客户端工具与Docker引擎进行交互,而我们在使用docker build命令构建镜像时,其实这个过程是在Docker引擎内完成的,而不是在本地客户端。那么问题来了,如果开发者在Dockerfile中使用了类似于COPY、ADD等指令来操作文件时,Docker引擎是如何获取这些文件呢?

因此这里就有一个镜像构建上下文的概念,当构建镜像的时候,用户来指定构建镜像的上下文路径,而docker build命令会将这个路径下所有的文件都打包上传给Docker引擎,之后Docker引擎将这些内容展开,就能获取到所有指定上下文中的文件。

还记得前面在介绍COPY指令的时候,特别要求源文件要与Dockerfile在同一目录下,如COPY ./hello.txt /test命令,该命令并不是复制本地当前目录下的hello.txt文件,而是docker引擎中展开的构建上下文中的文件,所以如果复制的文件超出了docker引擎中展开的构建上下文的范围,那么docker引擎是无法找到那些文件。综上所述,上述docker build .命令中的.号是指在指定镜像构建过程中的上下文环境的目录。

在理解了这个镜像构建上下文以后,接下来思考这个.dockerignore文件的作用,如果你之前有使用过git,那么肯定可以知道.gitignore文件的作用,它用来配置需要忽略上传的文件或者文件夹信息,因此接着这个设计理念自然可以猜到这个.dockerignore文件就是用于指定在构建镜像过程中的上下文环境目录需要忽略的文件或者文件夹。

存出和载入镜像

接下来开始学习docker镜像的save和load子命令,开发者可以使用docker save [image]docker load [image]命令来存出和载入镜像。

存出镜像

开发者如果想导出镜像到本地,可以使用docker save [image]命令,同时该命令支持-o也就是-output string参数,用于指定导出镜像到某个文件中。

举个例子,将本地的envyubuntu:latest镜像导出到本地为envyubuntu_latest.tar,使用的命令如下:

代码语言:txt
复制
[root@localhost envythink]# docker save -o envyubuntu_latest.tar envyubuntu:latest
[root@localhost envythink]# ls
envyubuntu_latest.tar
载入镜像

开发者如果想将之前通过docker save [image]命令导出的tar文件再次导入到本地镜像库,可以使用docker load [image]命令,同时该命令支持-i也就是-input string参数,用于指定需要载入镜像的名称。

同样举个例子,将之前存出的envyubuntu_latest.tar文件导入镜像到本地镜像列表,使用的命令如下:

代码语言:txt
复制
[root@localhost envythink]# docker load -i envyubuntu_latest.tar
Loaded image: envyubuntu:latest

当然了也可以使用输入重定向符号<,此时相应的命令为:

代码语言:txt
复制
[root@localhost envythink]# docker load < envyubuntu_latest.tar
Loaded image: envyubuntu:latest

上面那种方式将导入镜像及其相关的元数据信息,里面包含标签等,当显示导入成功后,开发者可以使用docker images命令查看发现与原来的镜像是一样的。

上传镜像

接下来介绍docker镜像的push子命令,这个名称非常重要,也很实用。开发者可以使用docker push [image]命令来将本地镜像上传到仓库,默认上传到Docker Hub官方仓库,注意此过程需要用户登录,因此建议开发者都去Docker Hub官网注册一个账号,之后就可以上传自制的镜像。完整的命令格式如下所示:

代码语言:txt
复制
docker push [image] NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]

举个例子,用户lichee想上传本地的ubuntu:latest镜像到Docker Hub官方仓库,可以先添加新的标签lichee/ubuntu:latest,然后使用这里的docker push [image]命令来上传镜像,如下所示:

代码语言:txt
复制
[root@localhost envythink]# docker tag ubuntu:latest lichee/ubuntu:latest
[root@localhost envythink]# docker images
REPOSITORY                       TAG                 IMAGE ID            CREATED             SIZE
ubuntu                           latest              9140108b62dc        2 weeks ago         72.9MB
lichee/ubuntu                    latest              9140108b62dc        2 weeks ago         72.9MB
[root@localhost envythink]# docker push lichee/ubuntu:latest
The push refers to repository [docker.io/lichee/ubuntu]
Sending image list

Please login prior to push:
Username:
Password:
Email:

请注意第一次上传镜像时,会提示需要输入用户名,密码和邮箱等信息,之后这些信息会存到本地的~/.docker目录下。

小结

本篇主要介绍了docker镜像相关的一些重要操作,如获取、查看、搜索、删除、创建、存出、载入、上传等,当然这些已经能满足大部分的工作场景,再必要的时候开发者可以使用docker image help命令来查看docker支持的镜像操作子命令。docker镜像是使用Docker的前提,也是最基本的资源,所以在平时使用过程中需要累积和定制自己的镜像文件,这一点对提高工作效率有着非常大的帮助。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 清理镜像
  • 创建镜像
    • 基于已有镜像的容器创建
      • 基于本地模板导入
        • 基于Dockerfile创建
        • 存出和载入镜像
          • 存出镜像
            • 载入镜像
            • 上传镜像
            • 小结
            相关产品与服务
            容器镜像服务
            容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档