【云原生|Docker系列第3篇】Docker镜像的入门实践

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 【云原生|Docker系列第3篇】Docker镜像的入门实践

欢迎来到Docker入门系列的第三篇博客!在前两篇博客中,我们已经了解了什么是Docker以及如何安装和配置它。本篇博客将重点介绍Docker镜像的概念,以及它们之间的关系。我们还将学习如何拉取、创建、管理和分享Docker镜像,这是使用Docker的重要步骤之一。

Docker镜像是Docker的核心概念之一,它提供了一个可执行的软件包,其中包含了运行应用程序所需的一切:代码、运行时环境、系统工具、库以及依赖项等。

通过学习Docker镜像的概念,您将能够更好地理解Docker的工作原理,并利用Docker提供的强大功能来开发、测试和部署应用程序。接下来,让我们深入探索Docker镜像的世界吧!

目录

1. Docker镜像


Docker镜像是Docker的核心构建块,它是一个轻量级、可执行的软件包,用于构建和运行容器化应用程序。一个Docker镜像包含了运行应用程序所需的一切,包括应用程序的代码、运行时环境、系统工具、库以及依赖项等。

1.1 Docker镜像的特点

  • 轻量级:Docker镜像采用了分层存储的机制,不同层之间可以共享相同的文件,从而减少了存储空间的占用。
  • 可移植性:Docker镜像具有良好的可移植性,可以在不同的主机和环境中运行,无需关注底层操作系统的差异。
  • 版本控制:每个Docker镜像都有唯一的标识符,称为镜像ID,可以用于对镜像进行版本控制和管理。
  • 可复用性:可以通过基于已有的Docker镜像构建新的镜像,从而实现镜像的复用和扩展。

1.2 Docker镜像的获取

获取Docker镜像通常有两种方式:拉取公共镜像仓库中的镜像,或者通过构建自定义镜像来创建。

1.2.1 拉取镜像

Docker镜像可以从公共的镜像仓库中拉取,最著名的镜像仓库就是Docker Hub。您可以在Docker Hub上找到数以万计的官方和社区维护的Docker镜像。使用docker pull命令可以拉取镜像,命令格式如下:

docker pull <镜像名称>:<标签>

例如,要拉取官方的Ubuntu镜像:

docker pull ubuntu:latest

1.2.2 使用Dockerfile构建镜像

1.3 Docker镜像的管理

在使用Docker时,我们可能需要对镜像进行管理,包括查看镜像列表、删除镜像、导出和导入镜像等操作。

1.3.1 查看镜像列表

要查看本地主机上已有的镜像列表,可以使用docker images命令。该命令将显示镜像的仓库名称、标签、镜像ID、创建时间和大小等信息。

docker images ls

1.3.2 删除镜像

要删除本地主机上的一个或多个镜像,可以使用docker rmi命令。需要指定要删除的镜像的镜像ID或者仓库名称和标签。

docker rmi <镜像ID或名称>:<标签>

1.3.3 导出和导入镜像

有时候,我们可能需要将一个镜像导出到一个文件中,或者从一个文件中导入一个镜像。可以使用docker save命令将镜像导出到一个tar文件中,然后使用docker load命令从tar文件中导入镜像。

导出镜像:

docker save -o <导出文件名.tar> <镜像名称>:<标签>

导入镜像:

docker load -i <导入文件名.tar>

2. 使用Dockerfile定制镜像


2.1 Dockerfile定制镜像

镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。

Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

以我们刚刚定制nginx镜像为例子,我们在一个空白目录中,建立一个文本文件,并命名为Dockerfile:

$ mkdir mynginx
$ cd mynginx
$ touch Dockerfile

其内容为:

FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

其中命令我们后面再详细讲述,我们使用它构建镜像,dockerfile构建镜像命令格式如下:

docker build -t <镜像名称>:<标签> <Dockerfile路径>

接下来您可以使用以下命令构建镜像:

docker build -t myimage:latest .

然后我们再运行这个镜像,你可以选择直接命令行运行,也可以直接在docker客户端运行,这里为了方便理解,我用docker客户端运行这个镜像:

随便填个端口:

打开网页访问这个端口:

2.2 Dockerfile指令

2.2.1 COPY 复制文件

格式如下:

COPY [--chown=<user>:<group>] <源路径>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]

COPY 指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置。比如:

COPY package.json /usr/src/app/

<源路径> 可以是多个,甚至可以是通配符,其通配符规则要满足 Go 的 filepath.Match 规则,如:

COPY hom* /mydir/
COPY hom?.txt /mydir/

2.2.2 FROM 指定基础镜像

所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个 nginx 镜像的容器,再进行修改一样,基础镜像是必须指定的。而 FROM 就是指定 基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。

在 Docker Hub 上有非常多的高质量的官方镜像,有可以直接拿来使用的服务类的镜像,如 nginx、redis、mongo、mysql、httpd、php、tomcat 等;也有一些方便开发、构建、运行各种语言应用的镜像,如 node、openjdk、python、ruby、golang 等。可以在其中寻找一个最符合我们最终目标的镜像为基础镜像进行定制。

格式如下:

FROM <镜像名字>

如:

FROM nginx

2.2.3 RUN 执行命令

RUN 指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。其格式有两种:

  • shell 格式:RUN <命令>,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的 RUN 指令就是这种格式。
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
  • exec 格式:RUN [“可执行文件”, “参数1”, “参数2”],这更像是函数调用中的格式。

2.2.4 ADD 更高级的复制文件

ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。

比如 <源路径> 可以是一个 URL,这种情况下,Docker 引擎会试图去下载这个链接的文件放到 <目标路径> 去。下载后的文件权限自动设置为 600,如果这并不是想要的权限,那么还需要增加额外的一层 RUN 进行权限调整,另外,如果下载的是个压缩包,需要解压缩,也一样还需要额外的一层 RUN 指令进行解压缩。所以不如直接使用 RUN 指令,然后使用 wget 或者 curl 工具下载,处理权限、解压缩、然后清理无用文件更合理。因此,这个功能其实并不实用,而且不推荐使用。

例如:

FROM scratch
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /

2.2.5 CMD 容器启动命令

指定容器启动时要执行的命令,可以有多个 CMD,但只有最后一个生效。

CMD ["python", "app.py"]

2.2.6 WORKDIR 设置工作目录

设置工作目录,后续的指令将在该目录下执行。

WORKDIR /app

2.2.7 EXPOSE 暴露端口

声明容器运行时需要监听的端口。

EXPOSE 80

2.2.8 ENV 设置环境变量。

ENV APP_VERSION=1.0

3. Docker镜像的分享和推送


Docker镜像的分享和推送是与团队合作和社区共享的重要环节。您可以将自己创建的镜像分享给其他开发者,也可以将镜像推送到公共的或私有的镜像仓库中。

3.1 分享Docker镜像

要分享一个Docker镜像,可以通过导出和导入的方式进行。首先,使用docker save命令将镜像导出到一个tar文件中,然后通过邮件、文件共享等方式与其他人共享该文件。

docker save -o <导出文件名.tar> <镜像名称>:<标签>

接收方可以使用docker load命令从tar文件中导入镜像。

docker load -i <导入文件名.tar>

3.2 推送Docker镜像

如果您希望将镜像推送到Docker Hub或其他镜像仓库中,可以使用docker push命令。推送镜像之前,您需要先登录到镜像仓库。

docker login

然后,使用docker push命令将镜像推送到仓库。

docker push <镜像名称>:<标签>

总结

在本篇博客中,我们深入探讨了Docker镜像的概念。我们学习了如何获取和管理Docker镜像,包括拉取镜像、构建自定义镜像以及导出和导入镜像。我们还介绍了如何通过Dockerfile制作镜像以及Dockerfile的指令。最后,我们了解了如何分享和推送Docker镜像,以便与他人共享和合作。

通过学习和掌握Docker镜像的基本概念,您将能够更好地利用Docker来开发、测试和部署应用程序。容器化技术的出现使得应用程序的开发和部署更加灵活、高效,并带来了诸多优势。在接下来的博客中,我们将继续探索Docker的更多功能和应用场景,下一篇文章我们会进入Docker容器的入门实践。

希望本篇博客对您理解Docker镜像起到了很好的指导作用。继续探索Docker的世界,您将发现更多令人兴奋的功能和应用!

相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。 &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
6天前
|
弹性计算 Kubernetes Cloud Native
云原生架构下的微服务设计原则与实践####
本文深入探讨了在云原生环境中,微服务架构的设计原则、关键技术及实践案例。通过剖析传统单体架构面临的挑战,引出微服务作为解决方案的优势,并详细阐述了微服务设计的几大核心原则:单一职责、独立部署、弹性伸缩和服务自治。文章还介绍了容器化技术、Kubernetes等云原生工具如何助力微服务的高效实施,并通过一个实际项目案例,展示了从服务拆分到持续集成/持续部署(CI/CD)流程的完整实现路径,为读者提供了宝贵的实践经验和启发。 ####
|
2天前
|
缓存 Linux 网络安全
docker的镜像无法下载如何解决?
【10月更文挑战第31天】docker的镜像无法下载如何解决?
100 28
|
4天前
|
存储 监控 Linux
docker构建镜像详解!!!
本文回顾了Docker的基本命令和管理技巧,包括容器和镜像的增删改查操作,容器的生命周期管理,以及如何通过端口映射和数据卷实现容器与宿主机之间的网络通信和数据持久化。文章还详细介绍了如何使用Docker部署一个简单的Web应用,并通过数据卷映射实现配置文件和日志的管理。最后,文章总结了如何制作自定义镜像,包括Nginx、Python3和CentOS镜像,以及如何制作私有云盘镜像。
47 2
|
4天前
|
运维 持续交付 虚拟化
docker入门详解!!!
本文介绍了容器技术的发展历程,从物理机到虚拟化再到容器化,重点讲解了Docker的诞生及其优势。Docker通过轻量级的容器技术,实现了资源的高效利用、快速启动、环境一致性、持续交付和部署等优点。文章还详细解析了Docker的架构和工作原理,包括Docker Daemon、REST接口、Docker Client等组件,以及容器与虚拟机的差异。
33 2
|
7天前
|
Kubernetes 负载均衡 Cloud Native
云原生应用:Kubernetes在容器编排中的实践与挑战
【10月更文挑战第27天】Kubernetes(简称K8s)是云原生应用的核心容器编排平台,提供自动化、扩展和管理容器化应用的能力。本文介绍Kubernetes的基本概念、安装配置、核心组件(如Pod和Deployment)、服务发现与负载均衡、网络配置及安全性挑战,帮助读者理解和实践Kubernetes在容器编排中的应用。
29 4
|
5天前
|
Cloud Native 持续交付 云计算
云原生入门指南:从容器到微服务
【10月更文挑战第28天】在数字化转型的浪潮中,云原生技术成为推动现代软件开发的关键力量。本篇文章将带你了解云原生的基本概念,探索它如何通过容器化、微服务架构以及持续集成和持续部署(CI/CD)的实践来提升应用的可伸缩性、灵活性和可靠性。你将学习到如何利用这些技术构建和部署在云端高效运行的应用,并理解它们对DevOps文化的贡献。
19 2
|
6天前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
14 1
|
7天前
|
Kubernetes Cloud Native API
云原生架构下微服务治理的深度探索与实践####
本文旨在深入剖析云原生环境下微服务治理的核心要素与最佳实践,通过实际案例分析,揭示高效、稳定的微服务架构设计原则及实施策略。在快速迭代的云计算领域,微服务架构以其高度解耦、灵活扩展的特性成为众多企业的首选。然而,伴随而来的服务间通信、故障隔离、配置管理等挑战亦不容忽视。本研究聚焦于云原生技术栈如何赋能微服务治理,涵盖容器编排(如Kubernetes)、服务网格(如Istio/Envoy)、API网关、分布式追踪系统等关键技术组件的应用与优化,为读者提供一套系统性的解决方案框架,助力企业在云端构建更加健壮、可维护的服务生态。 ####
|
7天前
|
Kubernetes 监控 Cloud Native
云原生应用:Kubernetes在容器编排中的实践与挑战
【10月更文挑战第26天】随着云计算技术的发展,容器化成为现代应用部署的核心趋势。Kubernetes(K8s)作为容器编排领域的佼佼者,以其强大的可扩展性和自动化能力,为开发者提供了高效管理和部署容器化应用的平台。本文将详细介绍Kubernetes的基本概念、核心组件、实践过程及面临的挑战,帮助读者更好地理解和应用这一技术。
30 3
|
8天前
|
监控 安全 Cloud Native
云原生安全:Istio在微服务架构中的安全策略与实践
【10月更文挑战第26天】随着云计算的发展,云原生架构成为企业数字化转型的关键。微服务作为其核心组件,虽具备灵活性和可扩展性,但也带来安全挑战。Istio作为开源服务网格,通过双向TLS加密、细粒度访问控制和强大的审计监控功能,有效保障微服务间的通信安全,成为云原生安全的重要工具。
25 2