超详细总结docker镜像

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 超详细总结docker镜像

01 引言

docker镜像docker的核心概念之一,它是用来构建和运行docker容器的模板,本文来讲解下其相关的概念以及用法。

02 docker镜像概念

如下图所示, docker运行docker build命令时,它会按照Dockerfile中的命令顺序从上至下逐个执行,从而构建出一个新的镜像,在Dockerfile中,每个命令都会创建一个新的中间镜像,并在其基础上执行后续的命令,直到构建完成…

2.1 核心概念

关于docker镜像,有如下核心的概念:

概念 含义
镜像标签 每个镜像都可以有一个或多个标签,用于区分不同版本的镜像,标签一般由两部分组成,中间用冒号分隔,例如:ubuntu:15.04
镜像层 镜像是由多个镜像层(Layers)组成的,每个镜像层包含了一个文件系统的增量修改,比如新增、删除或修改文件,当docker启动一个容器时,会将这些镜像层叠加在一起,形成一个完整的文件系统
Dockerfile Dockerfile是用来构建docker镜像的文本文件,其中包含了一系列构建指令,比如FROMRUNCOPY等,通过Dockerfile,可以自动化构建和发布docker镜像
镜像仓库 镜像仓库是用来存储和管理Docker镜像的系统,可以是公共的或私有的。私有镜像仓库通常用于企业内部部署应用程序或保护敏感数据,而公共镜像仓库则可供开发者和用户使用。Docker Hub是Docker官方的公共镜像仓库,包含了大量常用的Docker镜像,可以方便地查找和下载镜像,同时,Docker Hub也支持用户上传和分享自己构建的Docker镜像

2.2 制作方式

制作docker镜像主要的方式如下:

方式 说明
Dockerfile Dockerfile是一种文本文件,其中包含了一系列构建指令,比如FROM、RUN、COPY等,可以自动化构建和发布Docker镜像
本地文件 可以使用docker load命令将本地文件系统的备份文件导入为Docker镜像,该备份文件可以使用docker save命令进行创建
容器生成 可以使用docker commit命令从已有的Docker容器创建新的Docker镜像
镜像仓库下载 Docker Hub是Docker官方的公共镜像仓库,可以从中下载现成的Docker镜像,然后根据需要进行修改和定制,除了Docker Hub,还有其他第三方镜像仓库,也可以从中下载Docker镜像,但需要注意镜像的来源和安全性

2.3 制作流程

step1 → 编写Dockerfile:首先需要编写Dockerfile文件,定义镜像的构建过程。Dockerfile是一种文本文件,其中包含了一系列构建指令,比如 FROM、RUN、COPY等,可以自动化构建和发布Docker镜像,编写Dockerfile时需要考虑镜像的基础环境、需要安装的软件和配置等。


step2 → 构建镜像:在Dockerfile所在的目录下,使用 docker build命令构建Docker镜像。该命令会依照Dockerfile中的指令进行构建,最终生成一个可用的Docker镜像。

例如:docker build -t my-image:latest .,其中my-image为镜像名称,latest为镜像标签,.表示使用当前目录下的Dockerfile文件。


step3 → 运行容器:使用docker run命令启动Docker容器,并基于所构建的Docker镜像运行应用程序。

例如:docker run -it my-image:latest bash,其中my-image为镜像名称,latest为镜像标签,bash表示以交互式Shell方式运行容器。


step4 → 修改和推送镜像:如果需要修改已有的Docker镜像,可以通过修改Dockerfile后重新构建镜像来实现。最终,可以使用docker push命令将构建的Docker镜像推送到镜像仓库中,以便其他人使用。

例如:docker push my-repo/my-image:latest,其中my-repo为镜像仓库名称,my-image为镜像名称,latest为镜像标签。

2.4 Dockerfile举例

举一个Dockerfile打包Java项目的示例,内容如下:

# 使用openjdk作为基础镜像
FROM openjdk:8-jdk-alpine
# 维护者信息
LABEL maintainer="https://yanglinwei.blog.csdn.net"
# 设置工作目录
WORKDIR /app
# 复制项目构建后的jar包到镜像中
COPY target/myproject.jar /app
# 暴露容器端口
EXPOSE 8080
# 启动jar包
CMD ["java", "-jar", "myproject.jar"]

在这个示例中:

  • 首先使用 FROM 命令指定了openjdk:8-jdk-alpine作为基础镜像(基础镜像可以从DockerHub去搜索);
  • 接着使用 LABEL 命令指定了镜像维护者信息;
  • 然后使用 WORKDIR 命令设置了工作目录为/app;
  • 接着使用 COPY 命令将Java项目构建后的jar包拷贝到镜像的/app目录下;
  • 使用 EXPOSE 命令暴露了容器的8080端口;
  • 最后,使用 CMD 命令启动了jar包,容器启动时会自动运行该命令。

需要注意的是,COPY命令需要将项目构建后的jar包复制到Dockerfile所在的目录下,然后使用COPY命令将jar包拷贝到镜像中,如果jar包的位置不同,需要相应地修改COPY命令中的路径。

03 命令总结

3.1 DockerFile相关命令

下表列出了常见的Dockerfile命令及其含义解析和示例:

命令 含义解析 示例
FROM 指定基础镜像 FROM ubuntu:20.04
MAINTAINER 指定镜像维护者信息(已废弃,推荐使用LABEL命令) MAINTAINER
LABEL 添加镜像元数据,如维护者、描述等 LABEL maintainer="https://yanglinwei.blog.csdn.net"
RUN 在镜像中运行命令 RUN apt-get update && apt-get install -y curl
CMD 容器启动时运行的命令 CMD ["nginx", "-g", "daemon off;"]
ENTRYPOINT 容器启动时运行的命令,可以与CMD命令组合使用 ENTRYPOINT ["npm", "start"]
COPY 复制文件到镜像中 COPY app.js /app/
ADD 复制文件到镜像中,并支持URL解压缩和tar解压缩 ADD app.tar.gz /app/
ENV 设置环境变量 ENV NODE_ENV production
ARG 设置构建时的变量,可以通过–build-arg选项传递值 ARG NODE_ENV=development
EXPOSE 暴露容器端口 EXPOSE 3000
VOLUME 定义容器数据卷 VOLUME /data
WORKDIR 设置工作目录 WORKDIR /app
USER 设置容器运行时的用户 USER root
HEALTHCHECK 定义健康检查命令,用于检测容器是否正常运行 `HEALTHCHECK CMD curl --fail http://localhost:3000
SHELL 定义默认的Shell程序 SHELL ["/bin/bash", "-c"]

3.2 镜像相关命令


命令 描述 示例
docker images 列出本地所有镜像 docker images
docker search 在Docker Hub上搜索镜像 docker search nginx
docker pull 下载镜像 docker pull nginx
docker push 上传镜像到Docker Hub或其他镜像仓库 docker push username/repo:tag
docker build 使用Dockerfile构建新的镜像 docker build -t myimage:latest .
docker tag 为镜像设置标签 docker tag myimage:latest myimage:v1.0
docker rmi 删除镜像 docker rmi myimage:latest
docker inspect 查看镜像的详细信息 docker inspect myimage:latest
docker history 查看镜像的历史记录 docker history myimage:latest
docker save 将镜像保存为tar文件 docker save -o myimage.tar myimage:latest
docker load 从tar文件中加载镜像 docker load -i myimage.tar
docker commit 将容器提交为新的镜像 docker commit container_id myimage:v1.0
docker import 从tar文件中导入镜像 docker import myimage.tar myimage:v1.0

04 文末

本文主要讲解了docke镜像的概念、原理以及制作方式和流程,希望能帮助到大家,谢谢大家的阅读,本文完!

相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
17天前
|
应用服务中间件 nginx 开发者
从 Docker Hub 拉取镜像受阻?这些解决方案帮你轻松应对
最近一段时间 Docker 镜像一直是 Pull 不下来的状态,感觉除了挂🪜,想直连 Docker Hub 是几乎不可能的。更糟糕的是,很多原本可靠的国内镜像站,例如一些大厂和高校运营的,也陆续关停了,这对我们这些个人开发者和中小企业来说是挺难受的。之前,通过这些镜像站,我们可以快速、方便地获取所需的 Docker 镜像,现在这条路也不行了。感觉这次动作不小,以后想直接访问 Docker Hub 是不可能了。所以我们得想办法搭建自己的私有镜像仓库。
从 Docker Hub 拉取镜像受阻?这些解决方案帮你轻松应对
|
10天前
|
JavaScript 前端开发 数据安全/隐私保护
阿里云云效操作报错合集之流水线中获取不到CI_COMMIT_REF_NAME变量,导致docker镜像打包失败,什么原因
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
2月前
|
关系型数据库 MySQL 应用服务中间件
Docker 镜像的创建(二)
Docker 镜像的创建(二)
|
2月前
|
缓存 Linux Apache
Docker 镜像的创建(一)
Docker 镜像的创建(一)
|
13天前
|
应用服务中间件 Linux nginx
详细解读docker国内镜像源docker镜像大全
详细解读docker国内镜像源docker镜像大全
388 0
|
18天前
|
Java Docker 容器
使用 Spring Boot 构建 Docker 镜像并进行多模式部署
使用 Spring Boot 构建 Docker 镜像并进行多模式部署
58 2
|
20天前
|
数据安全/隐私保护 开发者 Docker
国内docker公开镜像站的关闭!别急,docker_image_pusher 使用Github Action将国外的Docker镜像转存到阿里云私有仓库
通过使用 docker_image_pusher 这样的开源项目,我们能够轻松地解决国内访问 Docker 镜像拉取速度慢及拉去失败的问题,同时保证了镜像的稳定性和安全性。利用 Github Action 的自动化功能,使得这一过程更加简单和高效。
708 2
|
3天前
|
Linux Docker 容器
Docker02--搭建Linux环境,配置Docker,docker images无法访问,因为docker没有启动,阿里云镜像加速器免费的
Docker02--搭建Linux环境,配置Docker,docker images无法访问,因为docker没有启动,阿里云镜像加速器免费的
|
4天前
|
缓存 Ubuntu Docker
怎么减小Docker的镜像体积?
**Docker 镜像优化目标:**提升构建速度、减小镜像大小、增强安全性和效率。**技巧:**1) 选择轻量级基础镜像(如Alpine、Ubuntu Minimal);2) 使用多阶段构建,分阶段复制文件和执行操作;3) 利用缓存加速构建,避免不必要的重复;4) 合并`RUN`指令减少镜像层数。这些方法能显著优化镜像,提高性能和节省存储空间。
|
1月前
|
存储 持续交付 数据安全/隐私保护
实现镜像管理轻松搞定:Docker 仓库管理详解
实现镜像管理轻松搞定:Docker 仓库管理详解
278 1