Docker之 - 使用镜像和仓库(三)

简介: 上一篇文章中,我们学习了包括 docker run 在内的许多对容器进行操作的基本指令,那么在本节中,我们主要探讨 Docker 镜像的一些概念,比如什么是镜像,如何对镜像进行管理,如何修改镜像,如何创建、存储、共享自己创建的镜像等,那么就开始我们的学习

指令失败时呢?

之前大致介绍了一下指令失败时的执行过程,下面来看一个例子:假设我们在上面的 Dockerfile 中把 nginx 拼成了 ngnx ,再来构建一遍

91.jpg


我们可以看到,程序出错了,这个时候我们希望去调试一下这次失败。我们使用 docker run 命令来基于这次构建到目前为止已经成功的最后一步创建一个容器,这里它的ID 是 dee85a65a396,我们可以使用如下命令

docker run -t -i dee85a65a396 /bin/bash,来恢复到出错之前的镜像,然后重新运行出错的指令apt-get install -y ngnx ,可以看到哪里出错了


92.jpg


但是感觉这个步骤是多余了一些,如果 Dockerfile 中出现了错误,那么 Docker 就会给你提示,用不着重新运行命令来找出问题原因。

Dockerfile 和构建缓存

由于每一步的结果都会作为下一步的基础镜像,所以Docker 构建镜像的过程非常聪明,它会将之前的镜像层作为缓存。

正如上面 Dockerfile 来举例,比如,在我们调试过程中,不需要在第一步和第三步之间做任何修改,因此 Docker 会将之前构建时创建的镜像当作缓存并作为新的开始点。再次构建时,Docker 会直接从第四步开始。当之前的构建步骤没有变化时,这会节省大量的时间。如果第一步到第三步之间有什么变化,则回到第一步开始。

然而,有的时候不希望有缓存的功能,这个时候你需要使用 apt-get update,那么 Docker 将不会刷新 APT 包的缓存,要想略过缓存,可以使用 docker build 的 --no-cache 标志。

基于构建缓存的 Dockerfile 模版

构建缓存的一个好处就是,我们可以实现简单的 Dockerfile 模版,一般会在 Dockerfile 文件顶部使用相同的指令集模版,比如对 ubuntu ,使用下面的模版

FROM ubuntu:14.04
MAINTAINER James Turnbull "james@example.com"
ENV REFRESHED_AT 2019-08-15
RUN apt-get -qq update

我们来分析一下这个新的 Dockerfile :

  • 首先,通过 FROM 指令为新镜像设置了一个基础镜像 ubuntu:14.04。
  • 接着,使用 MAINTAINER 指令添加了自己的详细信息
  • 然后,通过 ENV 指令设置了一个名为 REFRESHED_AT 的环境变量,用来表示最后一次的更新时间
  • 最后,使用 RUN 指令运行 apt-get -qq update 命令,该指令会刷新 APT 包的缓存,用来确保每个安装的软件包都在最新版本。


查看新镜像

现在来看一下新构建的镜像,使用 docker images 命令来完成

93.jpg


如果想要了解镜像是如何构建出来的,可以使用 docker history 命令,如下


94.jpg


从结果可以看出镜像构建的每一层都是哪些指令构成的


从新镜像启动容器

我们可以基于新构建的镜像启动新容器,来检查我们的构建工作是否正常


95.jpg


在这里,我们使用 docker run 命令,启动一个 static_web 的容器, -d表示的是以分离(detached) 的方式在后台运行。这种方式适合 nginx守护进程 这种需要长时间运行的进程。我们也指定了需要在 容器中运行的命令: nginx -g "daemon off;",将以前台方式运行 nginx 作为我们的服务器。

我们这里也使用了一个新的 -p 标志,用来控制 Docker 再运行时应该给外部开放哪些端口

  • Docker 可以在宿主机上随机选择 49153 --- 65535 之间的一个比较大的端口映射到 80 端口上
  • 可以在 Docker 宿主机指定一个具体的端口来映射到 80 端口上

使用 docker ps查看一下端口分配情况

96.png

Docker 把 32769 端口映射到了 80 端口上

也可以通过 docker port查看端口的映射情况


97.jpg


Dockerfile 指令

Dockerfile 指令比较多,这里我们会对 Dockerfile 单独列一个章节进行说明

将镜像推送至 Docker Hub

镜像构建完毕之后,我们也可以将它上传到 Docker Hub 上面去,这样其他人就能使用这个镜像了。

Docker Hub 的私有仓库是需要收费的

我们可以使用 docker push 命令将镜像推送至 Docker Hub。命令如下

98.jpg


为什么推送不上去?

网上搜索了一下,大概是镜像标签的问题,重新为镜像设置一个标签


99.png

然后把这个标签推送上去,相当于就是把镜像推送上去

000.jpg

我们可以在 Docker Hub 上看到我们推送的镜像了

00.png


删除镜像

如果不再需要一个镜像了,也可以将它删除,使用 docker rmi命令来删除一个镜像


111.jpg


该操作只能删除本地镜像,如果你已经推送至 Docker Hub 上,那么你还需要在 Docker Hub 上将其删除



登录 Docker Hub ,直接点下面的链接删除

222.jpg


docker rmi 删除多个容器的方式直接在后面枚举容器即可,中间用空格隔开

总结

本篇文章主要讲述了 Docker 中的镜像和仓库的一些概念和基本用法,那么你是否能回顾起来下面这些内容呢?

  • 什么是镜像
  • 如何列出Docker中的镜像,tag标签是干什么用的
  • 如何拉取远程仓库中的镜像
  • 如何查找镜像
  • 对于镜像构建,你能想到哪些内容
  • 如何推送镜像至 Docker Hub
  • 如何删除镜像


相关文章
|
1天前
|
Ubuntu NoSQL 开发工具
《docker基础篇:4.Docker镜像》包括是什么、分层的镜像、UnionFS(联合文件系统)、docker镜像的加载原理、为什么docker镜像要采用这种分层结构呢、docker镜像commit
《docker基础篇:4.Docker镜像》包括是什么、分层的镜像、UnionFS(联合文件系统)、docker镜像的加载原理、为什么docker镜像要采用这种分层结构呢、docker镜像commit
94 69
|
3天前
|
Ubuntu NoSQL 关系型数据库
《docker基础篇:6.本地镜像发布到私有库》包括本地镜像发布到私有库流程、docker regisry是什么、将本地镜像推送到私有库
《docker基础篇:6.本地镜像发布到私有库》包括本地镜像发布到私有库流程、docker regisry是什么、将本地镜像推送到私有库
59 28
|
1月前
|
Docker 容器
将本地的应用程序打包成Docker镜像
将本地的应用程序打包成Docker镜像
|
22天前
|
NoSQL PHP MongoDB
docker push推送自己搭建的镜像
本文详细介绍了如何搭建和复盘两个Web安全挑战环境:人力资源管理系统和邮件管理系统。首先,通过Docker搭建MongoDB和PHP环境,模拟人力资源管理系统的漏洞,包括nosql注入和文件写入等。接着,复盘了如何利用这些漏洞获取flag。邮件管理系统部分,通过目录遍历、文件恢复和字符串比较等技术,逐步绕过验证并最终获取flag。文章提供了详细的步骤和代码示例,适合安全研究人员学习和实践。
45 3
docker push推送自己搭建的镜像
|
26天前
|
Docker 容器
|
1月前
|
数据库 Docker 容器
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。Dockerfile定义了构建镜像所需的所有指令,包括基础镜像选择、软件安装、文件复制等,极大提高了开发和部署的灵活性与一致性。掌握Dockerfile的编写,对于提升软件开发效率和环境管理具有重要意义。
60 9
|
2月前
|
缓存 Linux 网络安全
docker的镜像无法下载如何解决?
【10月更文挑战第31天】docker的镜像无法下载如何解决?
2747 30
|
1月前
|
存储 缓存 运维
Docker镜像采用分层存储,每层代表镜像的一部分,如基础组件或应用依赖,多层叠加构成完整镜像
Docker镜像采用分层存储,每层代表镜像的一部分,如基础组件或应用依赖,多层叠加构成完整镜像。此机制减少存储占用,提高构建和传输效率。Docker还通过缓存机制提升构建和运行效率,减少重复工作。文章深入解析了Docker镜像分层存储与缓存机制,包括具体实现、管理优化及实际应用案例,帮助读者全面理解其优势与挑战。
54 4
|
2月前
|
存储 关系型数据库 Linux
【赵渝强老师】什么是Docker的镜像
Docker镜像是一个只读模板,包含应用程序及其运行所需的依赖环境。镜像采用分层文件系统,每次修改都会以读写层形式添加到原只读模板上。内核bootfs用于加载Linux内核,根镜像相当于操作系统,上方为应用层。镜像在物理存储上是一系列文件的集合,默认存储路径为“/var/lib/docker”。
|
2月前
|
缓存 JavaScript 安全
深入理解Docker镜像构建过程
深入理解Docker镜像构建过程
80 0

热门文章

最新文章

下一篇
开通oss服务