热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Docker之使用Dockerfile指令创建镜像(四)技术流ken

 前言 在之前的博客《Docker端口映射及创建镜像演示(二)--技术流ken》,演示了如何使用一个现有容器创建一个镜像,以及镜像在阿里云的上传和下载。但是这样的镜像有很大的局限性

 


前言

 

在之前的博客《Docker端口映射及创建镜像演示(二)--技术流ken》,演示了如何使用一个现有容器创建一个镜像,以及镜像在阿里云的上传和下载。

但是这样的镜像有很大的局限性,不能根据我们的生产需要进行个性化定制,所以我们急需学习一种能够满足我们需要的制作镜像的工具。

这个时候Dockerfile就出现了。

 

使用dockerfile指令可以根据自己的需要,制作满足自己生产需要的镜像。

本篇博客将详细讲解如何使用dockerfile制作自己的专属镜像。

 


Dockerfile简介

 

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

 

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

 


Dockerfile编写注意项

 



  • # 备注

  • 指令参数,指令的大小写不敏感

  • 第一个非注释行必须是FROM指令

  • 编写Dockerfile必须在一个目录下进行,这个目录称之为 工作目录(WORKSPACE)

  • Dockerfile文件命令的首字母必须大写

  • 制作镜像所要用的文件必须放在工作目录或者工作目录的子目录之下,不能放在父目录

  • 可以通过隐藏文件 .dockeringnore 来指定不要放入到镜像中的文件,一行是一个文件,可以用通配符

  • 基于dockerfile做镜像,本质上还是基于一个现有的镜像做新镜像

 


Dockerfile指令详解

 


1. FROM

作用:FROM 就是指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令

格式:

FROM :[tag]

FROM @

FROM 示例:

第一步:创建工作目录及dockerfile

[root@ken ~]# mkdir /ken
[root@ken ~]# cd /ken
[root@ken ken]# touch Dockerfile

 

第二步:写入from指令

docker.io:注册表

nginx:仓库

latest:版本号

[root@ken ken]# cat Dockerfile
FROM docker.io/nginx:latest

 


2. LABEL

作用:设定一些元数据

格式:

LABEL 信息

LABEL示例:

LABEL author "ken"

 


3. COPY

作用:将工作目录下的文件复制到所做得镜像中的文件系统中

格式:

复制单个文件:COPY

复制多个文件:COPY [ ... ]

COPY示例:

COPY passwd /data/

注意:



  • 源文件路径用相对路径,目标一般用绝对路径

  • 也可以通配符

  • 源文件必须在工作目录或者工作目录的子目录中

  • 目标路径可以不存在,会自动创建

  • 如果源文件是一个目录,会自动递归复制目录下的文件到目标位置,但是目录自身不会复制

  • 如果复制多个文件,或者源文件中用了通配符,那么目标路径必须以 / 为结尾

 


4. ADD

作用:和COPY类似,可以实现将文件和目录加载镜像中,但是区别是可以实现将tar包解压,也可以实现从网络下载文件到镜像

注意:下载的tar无法解压

格式

ADD

ADD ["" "" "" ""]

 ADD示例:

ADD nginx-1.14.0.tar.gz /data/

 


5. WORKDIR

作用:相当于执行cd命令。切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。

格式:

WORKDIR 容器目录

 WORKDIR示例:

WORKDIR /pack/nginx/

 


6. VOLUME

作用:指定数据卷的挂载点

格式:

VOLUME 容器目录

VOLUME示例:

VOLUME /data/mysql/mysql3306/data

 


7. EXPOSE

作用:设置Docker容器内部暴露的端口号,如果需要外部访问,还需要启动容器时增加-p或者-P参数进行分配。

格式:

EXPOSE PORT/[PROTOCOL]

EXPOSE示例:

EXPOSE 80/tcp

 


9. ENV

作用:设置环境变量

格式:

ENV var value

ENV var1=value1 var2=value2 ...

注意:

通过ENV所定义的变量是可以传递到容器之中,但是,在创建容器的时候,如果手动指定了变量的值,那么这个值会覆盖掉镜像中原有的值

 ENV示例:

ENV pkgname=nginx-1.14.0.tar.gz root=/data/mysql/mysql3306/data

 


10. RUN

作用:基于镜像构建容器时候要执行命令

阶段:第一阶段,也就是构建镜像的时候执行

格式:

RUN 命令

RUN示例:

RUN tar xf $root$pkgname

 


11. CMD

作用:定义容器启动以后要默认运行的程序,pid为1的程序

阶段:第二阶段,也就是将镜像构成成容器的时候执行

注意:可以在启动容器的时候用指定的命令替换掉镜像所要执行的命令

CMD指定容器启动是执行的命令,每个Dockerfile只能有一条CMD命令,如果指定了多条,只有最后一条会被执行。如果你在启动容器的时候也指定的命令,那么会覆盖Dockerfile构建的镜像里面的CMD命令

格式:

CMD <命令>   相当于执行的是/bin/sh -c 命令,也相当于执行exec来运行命令

CMD ["<命令>", "<参数>", "<参数>"]

CMD ["<参数>", "<参数>"]   <<<需要借助于ENTRYPOINT指令

CMD示例:

CMD mkdir /ken

 


12. ENTRYPOINT

作用:定义容器启动以后要默认运行的程序,pid为1的程序

注意:

在运行RUN的时候所执行的命令无法覆盖ENTRYPOINT中的命令

RUN 后面的命令会被以参数的方式追加到原本要执行的命令的末尾,而不是替换

基于一个镜像,在创建容器的时候,通过传递不同的参数实现创建不同的容器

每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效

格式:

ENTRYPOINT  ["执行命令","参数1","参数2"...]

 ENTRYPOINT示例:

ENTRYPOINT [ "curl", "-s", "http://10.220.5.138" ]

 


13. ARG

作用:定义变量,这个变量是用在第一阶段(构建镜像——build)

格式:

ARG 变量名=变量值

 ARG示例:

ARG name=ken

 

补充:Dockerfile中ENV 和 ARG的区别

在指定docker build 过程中传参数,要用ARG

在执行docker run的过程中传参数,要用ENV

ARG构建参数和 ENV 的效果一样,都是设置环境变量。所不同的是, ARG 所设置的构建环境的
环境变量,在将来容器运行时是不会存在这些环境变量的

 


14. USER

作用:指定运行容器时的用户名和UID,后续的RUN指令也会使用这里指定的用户

该用户必须存在于容器的用户空间中(容器的文件系统的中的/etc/passwd中)

格式:

USER |

 USER示例:

user ken

 


15. HEALTHCHECK

作用:docker daemon检查docker容器是否正常,如果异常会将该容器stop

将容器stop的条件

1)主进程停止了

2)主进程工作在了后台

 

格式:

HEALTHCHECK [options] CMD

 

options

--interval=#s|m          指定健康检查的时间间隔(例如:30s,30m)

--timeout=#s|m           指定等待响应的超时时间

--start-period=#s|m      指定容器启动多久以后才可以做监控检查

--retries=#              指定重试次数

 

返回值

0:success

1:unhealth

 

HEALTHCHECK示例:

HEALTHCHECK --interval=5m --timeout=1s --retries=3 CMD curl http://10.220.5.138/ken.html || exit 1

 


16. SHELL

可以用来指定系统中默认的shell类型

格式:

SHELL ["/bin/sh", "-c"]    (linux系统中)

SHELL示例:

SHELL ["/bin/sh","-c"]

 


17. STOPSIGNAL

向容器中pid为1的进程发送一个信号,通过这个信号来关闭这个主进程

默认是15信号

格式:

STOPSIGNAL 数值

STOPSIGNAL示例:

STOPSIGNAL 9

 


18. ONBULID

作用:定义一个触发器,指定的命令在构建镜像时并不执行,用来实现当基于这个这个镜像做新镜像的时候要执行的命令

格式:

ONBUILD 其他指令

ONBUILD示例:

ONBUILD COPY ken /app/

 


Dokcerfile完整演示创建nginx镜像

 

根据上面各个指令的介绍,我就直接用上面写的dockerfile进行演示。整个dockerifle内容如下。

[root@ken ~]# vim /ken/Dockerfile
FROM docker.io/nginx:latest
LABEL author "ken"
COPY ./passwd /data/
WORKDIR /pack/nginx/
ENV pkgname=nginx-1.14.0.tar.gz root=/data/mysql/mysql3306/data/
COPY nginx-1.14.0.tar.gz $root
VOLUME $root
EXPOSE 80/tcp
RUN tar xf $root$pkgname
CMD nginx -g "daemon off;"

 

第一步:构建镜像

build:是指根据dockerfile制作镜像

-t:指定一个tag标签

.:表示上下文。你也可以理解为dockfile所在的目录,但是并不是准确的

如果下方出现successfully就表示镜像已经构建成功了

[root@ken ken]# docker build -t ken:v1-0 .
Sending build context to Docker daemon 1.021 MB
Step 1/10 : FROM docker.io/nginx:latest
---> 568c4670fa80
Step 2/10 : LABEL author "ken"
---> Using cache
---> 80e4e5846fd9
Step 3/10 : COPY ./passwd /data/
---> Using cache
---> 685a7ceb74b3
Step 4/10 : WORKDIR /pack/nginx/
---> Using cache
---> 0fc65f8c36df
Step 5/10 : ENV pkgname nginx-1.14.0.tar.gz root /data/mysql/mysql3306/data/
---> Using cache
---> 3f6038473472
Step 6/10 : COPY nginx-1.14.0.tar.gz $root
---> Using cache
---> 0cbff6223d5b
Step 7/10 : VOLUME $root
---> Using cache
---> b74ac1c36c31
Step 8/10 : EXPOSE 80/tcp
---> Using cache
---> 6863a87a61a2
Step 9/10 : RUN tar xf $root$pkgname
---> Using cache
---> b32ac636a389
Step 10/10 : CMD nginx -g "daemon off;"
---> Running in 02308825301d
---> 4a91d70a57eb
Removing intermediate container 02308825301d
Successfully built 4a91d70a57eb

 

第二步:查看镜像

可以发现构建的名为ken标签为v1-0的镜像已经存在了

[root@ken ken]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ken v1-0 4a91d70a57eb 21 minutes ago 116 MB

 

第三步:启动容器

可以发现基于我们刚才的创建的镜像的容器已经顺利跑起来了。

[root@ken ken]# docker run -d --name ken3 -d ken:v1-0
11f492a28b943e619b0ed5d6b19f212f1c9cc47f9bdbe132845e7a7129e5b419
[root@ken ken]# docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
11f492a28b94 ken:v1-0 "/bin/sh -c 'nginx..." 16 seconds ago Up 11 seconds 80/tcp ken3

 

第四步:登录容器

可以发现我们这个启动的容器里面已经有我们指定的工作目录

复制过来的passwd文件

已经下载并传送到/data下了

[root@ken ken]# docker exec -it ken3 bash
root@11f492a28b94:/pack/nginx# ls /data/
mysql/ passwd
root@11f492a28b94:/pack/nginx# ls /data/
mysql/ passwd
oot@11f492a28b94:/pack/nginx# ls /data/mysql/mysql3306/data/nginx-1.14.0.tar.gz
/data/mysql/mysql3306/data/nginx-1.14.0.tar.gz

 

这样基于dockerfile自主创建镜像的过程就演示完了,快去自己制作一个属于自己的镜像吧。

 


推荐阅读
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • REVERT权限切换的操作步骤和注意事项
    本文介绍了在SQL Server中进行REVERT权限切换的操作步骤和注意事项。首先登录到SQL Server,其中包括一个具有很小权限的普通用户和一个系统管理员角色中的成员。然后通过添加Windows登录到SQL Server,并将其添加到AdventureWorks数据库中的用户列表中。最后通过REVERT命令切换权限。在操作过程中需要注意的是,确保登录名和数据库名的正确性,并遵循安全措施,以防止权限泄露和数据损坏。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 本文介绍了Python函数的定义与调用的方法,以及函数的作用,包括增强代码的可读性和重用性。文章详细解释了函数的定义与调用的语法和规则,以及函数的参数和返回值的用法。同时,还介绍了函数返回值的多种情况和多个值的返回方式。通过学习本文,读者可以更好地理解和使用Python函数,提高代码的可读性和重用性。 ... [详细]
author-avatar
手机用户2602896875
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有