超详细总结docker镜像
docker镜像总结
文章目录
01 引言
docker镜像是docker
的核心概念之一,它是用来构建和运行docker容器的模板,本文来讲解下其相关的概念以及用法。
02 docker镜像概念
如下图所示,
docker
运行docker build
命令时,它会按照Dockerfile
中的命令顺序从上至下逐个执行,从而构建出一个新的镜像,在Dockerfile
中,每个命令都会创建一个新的中间镜像,并在其基础上执行后续的命令,直到构建完成…
2.1 核心概念
关于docker镜像,有如下核心的概念:
概念 | 含义 |
---|---|
镜像标签 | 每个镜像都可以有一个或多个标签,用于区分不同版本的镜像,标签一般由两部分组成,中间用冒号分隔,例如:ubuntu:15.04 |
镜像层 | 镜像是由多个镜像层(Layers )组成的,每个镜像层包含了一个文件系统的增量修改,比如新增、删除或修改文件,当docker启动一个容器时,会将这些镜像层叠加在一起,形成一个完整的文件系统 |
Dockerfile | Dockerfile 是用来构建docker 镜像的文本文件,其中包含了一系列构建指令,比如FROM 、RUN 、COPY 等,通过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镜像的概念、原理以及制作方式和流程,希望能帮助到大家,谢谢大家的阅读,本文完!
更多推荐
所有评论(0)