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

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

查找镜像

我们可以通过 docker search 命令来查找所有 Docker Hub 上公共可用的镜像,如下


79.png


下面还有很多镜像,我们主要看一下每条镜像都返回了哪些内容

  • 仓库名称
  • 镜像描述
  • 用户评价 --- 反应一个镜像的受欢迎程度
  • 是否官方 --- 是否由Docker 公司及其指定厂商开发的镜像
  • 是否自动构建 --- 表示这个镜像是由 Docker Hub 自动构建的

从上面查询的结果中选择一个镜像进行拉取,docker pull jamtur01/puppetmaster这条命令将会下载 jamtur01/puppetmaster镜像到本地。

接下来就可以使用这个镜像来构建一个容器,下面就用 docker run 命令构建一个容器。

80.jpg


查看版本号


81.png


构建镜像

上面我们看到如何拉取并且构建好带有定制内容的 Docker 镜像,那么我们如何修改自己的镜像,并且管理和更新这些镜像呢?

  • 使用 docker commit 命令
  • 使用 docker build 命令和 Dockerfile 文件

现在我们不推荐使用 docker commit 命令,相反应该使用更灵活更强大的 Dockerfile 来构建镜像。不过,为了对 Docker 又一个更深的了解,我们还是会先介绍一下 docker commit 构建镜像。之后,我们重点介绍Docker 所推荐的构建方法:编写 Dockerfile 之后使用 docker build 命令。

创建Docker Hub 账号

构建镜像中很重要的一环就是如何共享和发布镜像。可以将镜像推送到 Docker Hub中或者自己的私有 Registry 中。为了完成这项工作,需要在 Docker Hub上创建一个账号

如果你还没有Docker 通行证,在 hub.docker.com 注册一个,记下你的用户名,登录本地计算机上的Docker公共注册表。使用docker login,输入用户名和密码进行登录


82.jpg


你的个人信息会保存在 $HOME/.dockercfg 文件中

使用 Docker 的commit 命令创建镜像

创建 Docker镜像的第一种方式是使用 docker commit 命令。可以将此想象为我们是在版本控制系统里面提交变更,毕竟这和 git commit 命令真是太像了。

我们先从创建一个容器开始,这个容器基于我们前面见过的 ubuntu 镜像。如下



83.png


接下来,我们在 ubuntu 中安装 apache 服务器,使用apt-get -yqq updateapt-get -y install apache2 命令。


84.jpg


我们启动了一个容器,并安装了 Apache 服务器,我们会将这个服务器作为 Web 服务器运行,所以我们想把它当前状态保存起来。这样下次启动就不用重新安装了。为了完成这项工作,需要先使用 exit 从 ubuntu 中退出,之后再运行 docker commit 命令。如下

85.jpg


我们看到,在上图所示的 docker commit 命令中,指定了要提交修改过的容器ID(可以通过 docker ps -l -q 命令得到刚刚创建的容器 ID),以及一个镜像仓库和镜像名,这里是 jamtur01/puppetmaster

可以使用 docker images jamtur01/puppetmaster 命令查看刚刚创建的镜像。


86.png


这条命令中我们使用 -m(message) 指定提交信息,同时指定了 --authro 选项,列出镜像作者信息。接着列出了想要提交的容器ID, 最后指定了 jamtur01/puppetmaster ,并为其打上了 webserver 的tag 标签。

可以使用 docker inspect 命令来查看新创建的镜像的详细信息。


87.jpg


使用 Dockerfile 构建镜像

我们并不推荐使用 docker commit 方法来构建镜像。相反,我们推荐使用 Dockerfiledocker build的命令来构建镜像。Dockerfile 使用基于 DSL 语法的指令来构建一个 Docker 镜像,之后使用 docker build 命令基于 Dockerfile 中的指令构建一个新的镜像。

我们的第一个 Dockerfile

下面我们创建一个目录并初始化 Dockerfile,我们创建一个包含简单web服务器的Docker镜像

89.jpg


如上图所示,我们在 /usr/local/docker 目录下创建了一个 static_web 的目录,再创建了一个 Dockerfile 文件。那么这个 static_web 目录就是我们的构建环境。Docker 称此环境为上下文(context)或者 构建上下文(build context)Docker 会在构建镜像时将构建上下文和该上下文中的文件和目录上传到 Docker 守护进程。这样 Docker 守护进程就可以直接访问你镜像中的 代码、文件和数据。

下面是一个通过 Dockerfile 来构建 web 服务器的 Docker 镜像

# Version: 0.0.1
FROM ubuntu:14.04
MAINTAINER James Turnbull "james@example.com"
RUN apt-get update
RUN apt-get install -y nginx
RUN echo 'Hi, I am in your container' \
        >/usr/share/nginx/html/index.html
EXPOSE 80

该 Dockerfile 由一系列指令和参数组成。每条指令,如FROM,都必须为大写字母,而且后面要跟随一个参数: FROM ubuntu:14.04。Dockerfile 中的指令会按照顺序由上向下执行,所以编写 Dockerfile 时,请注意它的顺序。

如果不能使用 :wq 来进行保存的话,请首先使用 sudo su切换到管理员模式,然后就可以保存啦。

每条指令都会创建一个新的镜像层并对镜像进行提交。Docker 大体按照如下流程执行 Dockerfile 指令

  • Docker 从基础镜像运行一个容器
  • 执行一条指令,对容器作出修改
  • 执行类似docker commit 操作,提交一个新的镜像层
  • Docker 再基于刚提交的镜像运行一个新容器
  • 执行 Dockerfile 中的下一条指令,直到所有指令都执行完毕

从上面可以看出,如果你的Dockerfile 由于某些原因(例如指令失败了)没有正常结束,那么你将得到了一个可以使用的镜像。这对调试很有帮助:可以基于镜像运行一个具备交互功能的容器,使用最后创建的镜像对你最后失败的指令做出调试

Dockerfile 也支持中文注释,以 # 开头的行都会被认为是注释。Dockerfile 中的第一行就是注释的例子

每个 Dockerfile 的第一行指令都应该是 FROM。FROM指令指定一个已经存在的镜像,后续指令都将基于该镜像进行,这个镜像被称为基础镜像(base image)。

  • 在上面的示例中,我们使用了 ubuntu:14.04 作为新镜像基础镜像。基于这个 Dockerfile 构建的新镜像以 Ubuntu 14.04 操作系统为基础。再运行一个容器时,必须要指明基于哪个基础镜像进行构建。
  • 接着指定了 MAINTAINER 指令,这条指令会告诉 Docker 该镜像的作者是谁,以及作者的电子邮件地址,这有助于标示镜像的所有者以及联系方式。
  • 在这些指令之后,我们指定了三条 RUN 指令。RUN指令会在当前的镜像中运行指定的命令。在这个例子中,我们通过 RUN 指令更新了已经安装的 APT 仓库,安装了 nginx 包,之后创建了 /usr/share/nginx/html/index.html 文件,该文件由一些简单的示例文本。像前面说的那样,每条RUN指令都会创建一个新的镜像层,如果该命令执行成功,就会将此镜像提交,继续执行下一条指令

默认情况下,RUN指令会在shell里使用命令包装器 /bin/sh -c 来执行。如果是在一个不支持 shell 的平台上运行或者不希望在 shell 中运行,也可以使用 exec 格式的 RUN 指令

如下 : RUN["apt-get", "install", "-y", "nginx"]

在这种方式中,我们使用数组的方式来指定要运行的命令和要传递的参数。

  • 接着设置了 EXPOSE 命令,这条执行告诉 Docker 容器内的应用程序将会使用容器的指定接口。这并不意味着可以自动访问任意容器运行中的服务端口,可以指定多个 EXPOSE 指令向外公开多个端口。

基于 Dockerfile 构建新

执行 docker build 命令时,Dockerfile 中的所有指令都会被执行并且提交,并且在命令成功结束后返回一个新镜像,下面就来看看如何构建一个新镜像。


90.jpg


一定不要忘记最后面有个空格 和. ,也可以在构建镜像的过程中为镜像设置一个标签:使用方法为“镜像名 : 标签”,如下所示

            </div>
目录
相关文章
|
存储 弹性计算 固态存储
阿里云服务器租用价格参考,2核8G、4核16G、8核32G最新收费标准
阿里云服务器2核8G、4核16G、8核32G配置租用价格参考,2024年阿里云产品再一次降价,降价之后2核8G配置按量收费最低收费标准为0.3375元/小时,按月租用标准收费标准为136.0元/1个月。4核16G配置的阿里云服务器按量收费标准最低为0.675元/小时,按月租用标准收费标准为272.0元/1个月。8核32G配置的阿里云服务器按量收费标准最低为1.35元/小时,按月租用标准收费标准为544.0元/1个月。云服务器实例规格的地域和实例规格不同,收费标准不一样,下面是2024年阿里云服务器2核8G、4核16G、8核32G配置的最新租用收费标准。
阿里云服务器租用价格参考,2核8G、4核16G、8核32G最新收费标准
|
存储 安全 网络安全
云计算时代的网络安全:挑战与应对策略
【9月更文挑战第30天】在数字化浪潮的推动下,云计算已经成为企业和个人存储、处理数据的首选方式。然而,随着云服务的普及,网络安全问题也日益凸显。本文将深入探讨云计算环境下的网络安全挑战,并提出相应的应对策略。从云服务的基本概念出发,逐步揭示网络安全的重要性,并结合实例分析常见的网络攻击手段。同时,文章还将分享一些实用的安全措施和最佳实践,帮助读者构建更加安全的云环境。
|
Ubuntu API Python
Chat-TTS chat-tts-ui 实机部署上手测试!Ubuntu服务器实机 2070Super*2 8GB部署全流程
Chat-TTS chat-tts-ui 实机部署上手测试!Ubuntu服务器实机 2070Super*2 8GB部署全流程
438 1
|
机器学习/深度学习 人工智能 自动驾驶
AI技术在现代生活中的应用:从理论到实践
AI技术在现代生活中的应用:从理论到实践
1126 2
|
KVM 虚拟化
计算虚拟化之CPU——qemu解析
【9月更文挑战10天】本文介绍了QEMU命令行参数的解析过程及其在KVM虚拟化中的应用。展示了QEMU通过多个`qemu_add_opts`函数调用处理不同类型设备和配置选项的方式,并附上了OpenStack生成的一个复杂KVM参数实例。
|
存储 数据管理 API
零代码能力:轻松搞定表单和API接口,少写80%后端代码,内含资源
小白接口(果创云 YesApi.cn)是一个零代码和低代码开发平台,提供一站式后端云服务,帮助开发者、学生、业余爱好者、工作室、中小企业及无IT技术人员的传统企业快速搭建应用、接口、服务和网站。平台提供500+免费API接口,支持在线API开发、在线表单、数据库管理、图片文件存储、会员管理等功能,无需后端开发经验,轻松实现数据处理和应用开发。
|
网络协议 算法 程序员
网络必修课:以太网报文格式详解
嗨,大家好!今天,我要带大家深入了解以太网报文格式,这是现代网络通信的重要基础。无论你是网络工程师、开发者,还是对技术感兴趣的朋友,这篇文章都将为你揭开以太网的神秘面纱,让你更好地理解和应用这一关键技术。准备好了吗?让我们开始吧!
685 4
|
人工智能 API 开发者
阿里云CTO周靖人:通义开源模型下载量破2000万,百炼实现150%增长!
阿里云CTO周靖人:通义开源模型下载量破2000万,百炼实现150%增长!
1293 1
|
SQL 监控 安全
网络攻击的阶段详解
【8月更文挑战第31天】
854 0
|
IDE Java API
Android Studio 错误大全
Android Studio 错误大全
507 0