45

关于 Docker 镜像的操作,看完这篇就够啦(下)

 5 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzU4MDUyMDQyNQ%3D%3D&%3Bmid=2247483740&%3Bidx=1&%3Bsn=a43b68937f795774809af07539e38292&%3Bchksm=fd54d1daca2358ccb582c1a0e2e86b0ca02180e06c61d8375ddde8d6cee095b9874e143
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

UJRrqq7.jpg!web

紧接着上篇《 关于 Docker 镜像的操作,看完这篇就够啦 !(上) 》,奉上下篇 !!!

镜像作为 Docker 三大核心概念中最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌握的。本文将带您一步一步,图文并重,上手操作来学习它。

目录:

一、Docker 删除镜像

  • 1.1 通过标签删除镜像

  • 1.2 通过 ID 删除镜像

  • 1.3 删除镜像的限制

  • 1.4 清理镜像

二、Docker 创建镜像

  • 2.1 基于已有的镜像创建

  • 2.2 基于 Dockerfile 创建

三、Docker 导出&加载镜像

  • 3.1 导出镜像

  • 3.2 加载镜像

四、Docker 上传镜像

  • 4.1 获取 Docker ID

  • 4.2 创建镜像仓库

  • 4.3 上传镜像

五、总结

六、 赠送 | 面试&学习福利资源

一、Docker 删除镜像

1.1 通过标签删除镜像

通过如下两个都可以删除镜像:

或者:

支持的子命令如下:

  • -f,-force : 强制删除镜像,即便有容器引用该镜像;

  • -no-prune : 不要删除未带标签的父镜像;

uamyUzM.jpg!web

例如,我们想删除上章节创建的 allen_mysql:5.7 镜像,命令如下:

从上面章节中,我们知道 allen_mysql:5.7docker.io/mysql:5.7 实际上指向的是同一个镜像,那么,您可以能会有疑问,我删除了 allen_mysql:5.7 , 会不会将 docker.io/mysql:5.7 镜像也给删除了?

实际上,当同一个镜像拥有多个标签时,执行 docker rmi 命令,只是会删除了该镜像众多标签中,您指定的标签而已,并不会影响原始的那个镜像文件。

不信的话,我们可以执行 docker images 命令,来看下 docker.io/mysql:5.7 镜像还在不在:

reuqQzI.jpg!web

可以看到, docker.io/mysql:5.7 镜像依然存在!

那么,如果某个镜像不存在多个标签,当且仅当只有一个标签时,执行删除命令时,您就要小心了,这会彻底删除镜像。

例如,这个时候,我们再执行 docker rmi docker.io/mysql:5.7 命令:

IraQRnj.jpg!web

从上图可以看到,我们已经删除了 docker.io/mysql:5.7 镜像的所有文件层。该镜像在本地已不复存在了!

1.2 通过 ID 删除镜像

除了通过标签名称来删除镜像,我们还可以通过制定镜像 ID, 来删除镜像,如:

一旦制定了通过 ID 来删除镜像,它会先尝试删除所有指向该镜像的标签,然后在删除镜像本身。

1.3 删除镜像的限制

删除镜像很简单,但也不是我们何时何地都能删除的,它存在一些限制条件。

当通过该镜像创建的容器未被销毁时,镜像是无法被删除的。为了验证这一点,我们来做个试验。首先,我们通过 docker pull alpine 命令,拉取一个最新的 alpine 镜像, 然后启动镜像,让其输出 hello,docker! :

接下来,我们来删除这个镜像试试:

可以看到提示信息,无法删除该镜像,因为有容器正在引用他!同时,这段信息还告诉我们,除非通过添加 -f 子命令,也就是强制删除,才能移除掉该镜像!

但是,我们一般不推荐这样暴力的做法,正确的做法应该是:

  1. 先删除引用这个镜像的容器;

  2. 再删除这个镜像;

也就是,根据上图中提示的,引用该镜像的容器 ID ( 9d59e2278553 ), 执行删除命令:

然后,再执行删除镜像的命令:

aaIr2qr.jpg!web

这个时候,就能正常删除了!

1.4 清理镜像

我们在使用 Docker 一段时间后,系统一般都会残存一些临时的、没有被使用的镜像文件,可以通过以下命令进行清理:

它支持的子命令有:

  • -a,--all : 删除所有没有用的镜像,而不仅仅是临时文件;

  • -f,--force :强制删除镜像文件,无需弹出提示确认;

另外,执行完 docker image prune 命令后,还是告诉我们释放了多少存储空间!

二、Docker 创建镜像

此小节中,您将学习 Docker 如何创建镜像?Docker 创建镜像主要有三种:

  1. 基于已有的镜像创建;

  2. 基于 Dockerfile 来创建;

  3. 基于本地模板来导入;

我们将主要介绍常用的 1,2 两种。

2.1 基于已有的镜像创建

通过如下命令来创建:

支持的子命令如下:

  • -a,--author ="": 作者信息;

  • -c,--change =[]: 可以在提交的时候执行 Dockerfile 指令,如 CMD、ENTRYPOINT、ENV、EXPOSE、LABEL、ONBUILD、USER、VOLUME、WORIR 等;

  • -m,--message ="": 提交信息;

  • -p,--pause =true: 提交时,暂停容器运行。

接下来,基于本地已有的 Ubuntu 镜像,创建一个新的镜像:

VJnm22r.jpg!web

首先,让我将它运行起来,并在其中创建一个 test.txt 文件:

命令如下:

创建完 test.txt 文件后,需要记住标注的容器 ID: a0a0c8cfec3a , 用它来提交一个新的镜像( PS: 你也可以通过名称来提交镜像,这里只演示通过 ID 的方式 )。

执行命令:

提交成功后,会返回新创建的镜像 ID 信息,如下图所示:

再次查看本地镜像信息,可以看到新创建的 test:0.1 镜像了:

zIZfmyn.jpg!web

2.2 基于 Dockerfile 创建

通过 Dockerfile 的方式来创建镜像,是最常见的一种方式了,也是比较推荐的方式。Dockerfile 是一个文本指令文件,它描述了是如何基于一个父镜像,来创建一个新镜像的过程。

下面让我们来编写一个简单的 Dockerfile 文件,它描述了基于 Ubuntu 父镜像,安装 Python3 环境的镜像:

创建完成后,通过这个 Dockerfile 文件,来构建新的镜像,执行命令:

注意:命令的最后有个点,如果不加的话,会构建不成功 !

yAvYZj7.jpg!web

编译成功后,再次查看本地镜像信息,就可以看到新构建的 python:3 镜像了。

yymEBnm.jpg!web

三、Docker 导出&加载镜像

此小节中,您将学习 Docker 如何导出&加载镜像。

通常我们会有下面这种需求,需要将镜像分享给别人,这个时候,我们可以将镜像导出成 tar 包,别人直接通过加载这个 tar 包,快速地将镜像引入到本地镜像库。

要想使用这两个功能,主要是通过如下两个命令:

  1. docker save

  2. docker load

3.1 导出镜像

查看本地镜像如下:

yymEBnm.jpg!web

例如,我们想要将 python:3 镜像导出来,执行命令:

执行成功后,查看当前目录:

可以看到 python_3.tar 镜像文件已经生成。接下来,你可以将它通过复制的方式,分享给别人了!

3.2 加载镜像

别人拿到了这个 tar 包后,要如何导入到本地的镜像库呢?

通过执行如下命令:

或者:

导入成功后,查看本地镜像信息,你就可以获得别人分享的镜像了!怎么样,是不是很方便呢!

四、Docker 上传镜像

我们将以上传到 Docker Hub 上为示例,演示 Docker 如何上传镜像。

4.1 获取 Docker ID

想要上传镜像到 Docker Hub 上,首先,我们需要注册 Docker Hub 账号。打开 Docker Hub 网址 https://hub.docker.com,开始注册:

fm2Yfu6.jpg!web

填写您的 Docker ID (也就是账号),以及密码,Email, 点击继续。

接下来,Docker Hub 会发送验证邮件,到您填写的邮箱当中:

fMrE7rn.jpg!web

点击验证即可,接下来,再次返回 Docker Hub 官网,用您刚刚注册的 Docker ID 和密码来登录账号!

fIrUneB.jpg!web

4.2 创建镜像仓库

登录成功后,会出现如下页面:

ueiamia.jpg!web

选择创建一个镜像仓库:

e2euiyj.jpg!web

填写 仓库名称描述信息是否公开后 ,点击创建。

uqmMFvz.jpg!web

我们看到,仓库已经创建成功了,但是里面还没有任何镜像,接下来开始上传镜像,到此新创建的仓库中。

4.3 上传镜像

进入命令行, 用我们刚刚获取的 Docker ID 以及密码登录 ,执行命令:

7BrUjeQ.jpg!web

登录成功后,我们开始准备上传本地的 python:3 镜像:

baURzaV.jpg!web

首先,我们对其打一个新的标签, 前缀与我们新创建的 Docker ID 、仓库名保持一致 :

7bEv6nV.jpg!web

查看本地信息,可以看到,标签打成功了。接下开,开始上传!执行命令:

zMNJJnv.jpg!web

上传成功!去 Docker Hub 官网,新创建的仓库的信息页面验证一下,是否真的成功了:

m67RVja.jpg!web

大工告成!!!

五、总结

本文中,我们着重学习了 Docker 中如何删除镜像, 创建镜像,导出&加载镜像,以及向 Docker Hub 上传镜像。本文是 Docker 镜像学习的下篇,后续会带来更多 Docker 相关的学习文章,祝您学习愉快!

六、赠送面试&学习福利资源

最近在网上发现一个不错的 PDF 资源《Java 核心面试知识.pdf》分享给大家,不光是面试,学习,你都值得拥有!!!

获取方式: 关注本公众号, 后台回复 资源 ,既可获取资源链接 !!! ,下面是目录以及部分截图:

IZBBjaz.jpg!web

nuuy2qv.jpg!web

qY3Ezuv.jpg!web

BBfUZnv.jpg!web

EJvU3iN.jpg!web

amEjmya.jpg!web

yqiIfia.jpg!web

重要的事情说两遍,获取方式: 关注本公众号, 后台回复 资源 ,既可获取资源链接 !!!

·END·

近期热文:

如果你喜欢本文

请长按二维码,关注 小哈学Java

eiaEF3Q.jpg!web

转发 朋友圈 ,是对我最大的支持。

看完,赶紧点个“在看”鸭

点鸭点鸭

↓↓↓↓


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK