原创

操作Docker镜像

清理镜像

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

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

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

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

[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文件,之后退出即可,相应的代码如下:

[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或者名称来指定容器,如:

[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的模板压缩包,之后可以使用如下命令直接导入:

[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目录,然后切换至该目录:

[envythink@localhost ~]$ mkdir pyhello
[envythink@localhost ~]$ cd pyhello/

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

#基于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的镜像,如下所示:

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,使用的命令如下:

[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文件导入镜像到本地镜像列表,使用的命令如下:

[root@localhost envythink]# docker load -i envyubuntu_latest.tar
Loaded image: envyubuntu:latest

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

[root@localhost envythink]# docker load < envyubuntu_latest.tar
Loaded image: envyubuntu:latest

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

上传镜像

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

docker push [image] NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]

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

[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的前提,也是最基本的资源,所以在平时使用过程中需要累积和定制自己的镜像文件,这一点对提高工作效率有着非常大的帮助。

获取更多信息,请关注下面的微信公众号:

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • docker镜像操作

    章鱼喵
  • docker--镜像操作

    Docker 镜像是容器的基础。镜像是一个有序集合,其中包含根文件系统更改和在容器运 行时中使用的相应执行参数。镜像通常 包含堆叠在彼此之上的联合分层文件系统。...

    eadela
  • Docker镜像操作

    运行容器时,如果使用的镜像在本地中不存在,docker就会自动从 docker镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。

    李小白是一只喵
  • Docker:镜像操作和容器操作

    镜像操作 列出镜像: $ sudo docker images REPOSITORY TAG IMAGE ID...

    古时的风筝
  • Docker 系列二(操作镜像).

        -- Docker 镜像仓库地址 :一般是 域名或者IP[:端口号]。默认地址是 Docker Hub     -- 仓库名 :两段式名称,即 用户名/...

    JMCui
  • Docker镜像的基本操作

    若与
  • 【快学Docker】Docker镜像相关操作

    Docker运行容器前需要本地存在镜像,如果本地不存在镜像,Docker则会尝试从远端仓库拉去镜像。镜像是Docker一大核心,我们今天就来了解下Docker镜...

    Happyjava
  • Docker入门实战(二)——Docker镜像操作

    1. 什么是Docker镜像? 从源码层面来讲,Docker镜像是一个个只读文件系统,对于源码这里不作深究。我们只从逻辑角度来看,Docker镜像是一个个装有...

    大闲人柴毛毛
  • Docker的核心概念,镜像操作

    简介 在实际使用Docker的过程中,遇到一些问题,但是总没有系统的博文可以详细的介绍Docker,所以个人写一个由浅入深的系统学习Docker过程。 这里首...

    牛嗷嗷
  • docker制作镜像

    格式:docker import [选项] <文件>|<URL>|- [<仓库名>[:<标签>]]

    py3study
  • docker--镜像制作

    docker官方和个人发布的镜像由于版本等各种原因,漏洞较多,已统计Docker Hub超过 30%的官方镜像包含高危漏洞。此外,由于网络等原因也会造成dock...

    eadela
  • Docker - Image镜像创建及容器操作

    主要包括两部分: 1. 镜像(IMAGE)创建 2. 数据卷(Data Volumes)挂载

    AIHGF
  • Docker镜像与容器的常用操作

    国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。国内很多云服务商都提供了国内加速器服务,例如:

    踏歌行
  • Docker中关于镜像的基本操作

    我们从官方注册服务器(https://hub.docker.com)的仓库中pull下CentOS的镜像,前边说过,每个仓库会有多个镜像,用tag标示,如果不加...

    KEVINGUO_CN
  • docker镜像制作 原

    domain0
  • springBoot制作docker镜像

    爱撒谎的男孩
  • 02.docker镜像制作

    陈雷雷
  • docker镜像的制作

    2.通过 Debootstrap 构建 Ubuntu 16.04 LTS 的 rootfs

    黑白格
  • Docker系列学习文章 - docker镜像基本操作(五)

    | 导语上一篇文章我们讲解了如何简单运行一个Nginx、Mysql、Redis容器服务。我们运行的很顺利,因为我们就用了一条命令就搞定了。确实,docker就是...

    宝哥@上云专家

扫码关注云+社区

领取腾讯云代金券