Dockerfile构建自定义镜像的实现

 更新时间:2021年08月19日 10:28:24   作者:程序媛小庄  
Dockerfile构建镜像的方式就目前而言是使用最为广泛的,本文主要介绍了Dockerfile构建自定义镜像的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

前言

前面文章中使用docker运行容器使用的镜像都是从dockerhub上远程pull下来的,那么我们能不能构建自己的镜像呢?答案是肯定滴,可以通过Dockerfile构建自己的镜像,Dockerfile本身并不难,就是一堆命令,让小编觉得有难度的地方是如何使用Dockerfile的这些命令从更高一层的角度上更好的去构建自己的镜像,我们就一起来看看吧。

Dockerfile简介

Dockerfile其实就是一个文件,该文件的名字就是Dockerfile,当然也可以不用这个名字,在构建镜像时指定名字即可,但是约定俗称使用Dockerfile,Dockerfile的主要作用就是帮助我们构建一个自定义镜像,因此Dockerfile也称为镜像构建文件或者镜像描述文件。

可能会有小伙伴问了,在dockerhub上官方提供了很多镜像已经基本满足了所有的服务,为什么还要自定义镜像呢?使用Dockerfile自己构建镜像就可以将自己的应用打包成镜像,运行镜像就可以直接运行我们自定义的一些功能的服务了。

举个简单的例子,在dockerhub上下载centos7的镜像,官方提供的镜像是没有vim这一功能的,因此我们可以基于官方的基础的centos镜像构建自己的镜像来实现运行centos容器时里面自动安装vim这一功能了。

Dockerfile构建镜像的流程

在介绍Dockerfile构建镜像流程前需要知道一个重要概念---上下文(context)目录,Dockerfile所在的目录被称为上下文目录。

docker是CS架构,使用Dockerfile构建镜像时使用的命令是docker build,当在客户端的操作系统中执行该命令时,docker引擎会将Dockerfile所在的目录中的所有数据打包发送给docker服务端,因此Dockerfile所在的目录中最好只包含构建当前镜像所需的文件,服务端运行一行Dockerfile中的命令就会产生一个临时镜像存在docker cache中(如果不想要产生临时镜像在docker build后加--no_cache参数),运行到最后一行的时候会得到一个最终的镜像。如下图所示:

Dockerfile使用

首先说一下Dockerfile构建镜像的命令:

# 命令格式:docker build -t 镜像名:tag Dockerfile所在路径
docker build -t mycentos:01 .

下面就来介绍一下在Dockerfile中常用的命令,注意注意,在Dockerfile中所有的命令都是大写的哦~。

FROM 镜像名:tag  :Dockerfile中第一条命令,表示基于哪个镜像进行构建镜像。虽然是构建自定义镜像,但是这个自定义镜像也是在官方提供的基础镜像之上进行的哦。

# Dockerfile
FROM centos:7  # 表示镜像基于centos7进行构建

RUN:构建镜像时需要运行的命令,可以跟shell命令。

# 第一种语法格式
RUN yum install -y vim

# 第二种语法格式
RUN ["yum", "install", "-y", "vim"]

EXPOSE:对外界暴露的端口,只有在镜像中暴露端口,才能在执行docker run命令时指定-p参数。

EXPOSE 9000  # 表示暴露9000端口

WORKDIR:指定进入容器时的路径,可以写多个,容器内没有指定的路径时会创建该路径,可以写多个,下一个路径是基于上一个路径的相对路径。

WORKDIR /data
WORKDIR /a

COPY:将context目录中指定文件复制到镜像的指定目录中.

# 命令格式:COPY 原路径(可以是绝对路径也可以是相对路径) 容器内目标路径
# 语法格式一
COPY /root/app/aa.txt /data 

# 语法格式二
COPY ["<src>", ..., "<dest>"] ---语法格式二

ADD:将context目录中指定文件复制到镜像的指定目录中,可以识别URL,自动下载URL对应的压缩包,可以将本地压缩包复制到镜像指定目录后自动解压。

# context目录中指定文件复制到镜像的指定目录中
ADD bb.txt /data

# 自动识别URL并下载到容器内指定目录
ADD https://www.python.org/ftp/python/3.9.1/Python-3.9.1.tgz /data

# 将压缩包会自动解压到指定目录
ADD xxx.tar /data

ENTRYPOINT:用来指定容器启动时执行的命令,和CMD类似,往往用来设置容器启动后的第一个命令,可以写多个;可以被覆盖。

# ENTRYPOINT shell脚本 或者 ENTRYPOINT ["tail", "-f"...]
ENTRYPOINT tail -f bb.txt
# 覆盖
docker run --entrypoint=cat mycentos:08 /data/bb.txt

CMD:以最后一条CMD为准;可以被覆盖;可以为ENTRYPOINT传参数,与ENTRYPOINT结合使用(只能用json数组的形式)

# 只运行最后一条CMD
CMD ls $BASEDIR
CMD cat bb.txt

# 可以被覆盖,docker run后面的命令会直接覆盖Dockerfile中的CMD后的命令
docker run mycentos:09 ls /data

# 与ENTRYPOINT结合使用,为ENTRYPOINT传参,可以动态传递参数比如项目路径不变但是项目名称会变化,需要注意的时候,两者结合使用的时候必须使用json数组的格式。
ENTRYPOINT ["ls", "/data"]
CMD [/data/bb"]

或者

docker run mycentos:10 /data/bb/aa

到此这篇关于Dockerfile构建自定义镜像的实现的文章就介绍到这了,更多相关Dockerfile构建镜像 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Docker redmine项目管理工具的使用

    Docker redmine项目管理工具的使用

    Redmine 是一个开源的,基于Web的项目管理和缺陷跟踪工具,本文主要介绍了Docker redmine项目管理工具的使用,具有一定的参考价值,感兴趣的可以了解一下
    2022-01-01
  • 在Docker中安装Elasticsearch7.6.2的教程

    在Docker中安装Elasticsearch7.6.2的教程

    这篇文章主要介绍了在Docker中安装Elasticsearch7.6.2的教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • docker安装nginx并部署前端项目的全过程

    docker安装nginx并部署前端项目的全过程

    作为一个前端,代码写完,最后部署到服务器,这是一个必须要了解的过程,这篇文章主要给大家介绍了关于docker安装nginx并部署前端项目的相关资料,需要的朋友可以参考下
    2022-05-05
  • docker启动报错问题OCI runtime create failed: container_linux.go:380: starting container process

    docker启动报错问题OCI runtime create failed: c

    这篇文章主要介绍了docker启动报错问题OCI runtime create failed: container_linux.go:380: starting container process,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 如何通过Jenkins定期清理为None的镜像详解

    如何通过Jenkins定期清理为None的镜像详解

    这篇文章主要给大家介绍了关于如何通过Jenkins定期清理为None的镜像的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • Docker Alpine镜像时区问题完美解决方案

    Docker Alpine镜像时区问题完美解决方案

    这篇文章主要介绍了Docker Alpine镜像时区问题完美解决方案,本文给大家分享两种解决方案供大家参考,需要的朋友可以参考下
    2021-04-04
  • 使用docker搭建kong集群操作

    使用docker搭建kong集群操作

    这篇文章主要介绍了使用docker搭建kong集群操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • CentOS 7.2 下安装 Docker 1.12.3 版的详细方法

    CentOS 7.2 下安装 Docker 1.12.3 版的详细方法

    这篇文章主要介绍了CentOS 7.2 安装 Docker 1.12.3 版的相关资料,本文分步骤给大家介绍了CentOS 7.2 下安装 Docker 1.12.3 版的详细方法,需要的朋友可以参考下
    2016-11-11
  • docker 指定IP地址、与主机同网段IP

    docker 指定IP地址、与主机同网段IP

    这篇文章主要介绍了docker 指定IP地址、与主机同网段IP,非常具有实用价值,需要的朋友可以参考下
    2017-05-05
  • docker部署nexus并启用https方式

    docker部署nexus并启用https方式

    这篇文章主要介绍了docker部署nexus并启用https方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08

最新评论