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

Docker入门实战(三)——用Dockerfile构建镜像

在Docker中,构建一个自定义镜像共有两种方法,一是通过commit指令构建,二是通过Dockerfile文件构建。第一种方式在上篇博客中已经详细介绍(Docker入门实战(二)——

在Docker中,构建一个自定义镜像共有两种方法,一是通过commit指令构建,二是通过Dockerfile文件构建。第一种方式在上篇博客中已经详细介绍(Docker入门实战(二)——Docker镜像操作),接下来介绍在Docker中更为常用的方法——使用Dockerfile构建镜像。

用Dockerfile构建镜像的基本流程

先来回顾下commit方式创建镜像的流程:
1. 首先需要有一个基础镜像(可以把基础镜像理解为操作系统)
2. 然后基于该镜像创建容器
3. 在容器中配置运行环境
4. 最后使用docker commit命令将容器打包成镜像

上述过程的第三步主要任务是在容器中安装软件,并进行相应的配置,如果把这个过程所要执行的命令全都提取出来,写入一个文件中,若需要构建镜像则直接运行该文件,基于其中的命令生成一个镜像。这就是基于Dockerfile构建镜像的方式,这个文件就称为Dockerfile。

Dockerfile文件的构成

Dockerfile文件一共分为四个部分,分别是:注释信息、基础镜像、创建者信息、构建镜像所需的命令,如下所示:

# Version: 1.1 #版本信息
FROM centos:7.2 #基础镜像
MAINTAINER Chaimm "350142639@qq.com" #维护者信息
RUN …… #以下为命令区
CMD ……
EXPOSE ……

该Dockerfile被构建时,Docker会生成一个具有指定基础镜像的操作系统,并逐一执行命令区的命令。当命令命令执行结束后,一个你所需要的镜像便生成了。

Dockerfile指令

RUN

RUN的用法

RUN后面跟构建时需要执行的命令,有两种写法:
1.方式一:RUN后直接跟命令

RUN 命令 -参数

2.方式二:命令和参数以数组的形式存放(推荐)

RUN ["命令","参数"]

RUN的特点

  1. RUN在镜像被构建时执行,因此RUN后一般跟用于构建镜像的命令,如安装软件的命令、环境配置的命令等。
  2. RUN可以有多条,在构建镜像时被依次执行。

CMD

CMD的用法

CMD后的命令仅在容器启动时执行,和RUN一样,也有两种用法:
1.方式一:CMD后直接跟命令

CMD 命令 -参数

2.方式二:命令和参数以数组的形式存放(推荐)

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

CMD的特点

  1. CMD在容器运行的时候执行,而且一个Dockerfile中该命令只能有1个或0个,因此CMD后一般跟用于启动软件的命令。
  2. CMD会被docker run末尾的命令覆盖。
    PS:docker run的末尾的命令也在容器启动的时候执行,而且它的优先级较高,会覆盖Dockerfile中的CMD命令。

ENTRYPOINT

和CMD一样,ENTRYPOINT也在容器启动时执行,只不过ENTRYPOINT不会被docker run后的命令覆盖。当容器运行时,docker run后的命令会追加到ENTRYPOINT的末尾,因此ENTRYPOINT和docker run搭配可以产生神奇的效果:

  • 在Dockerfile的ENTRYPOINT后仅提供命令:
ENTRYPOINT ["/usr/sbin/nginx"]
  • 在docker run末尾仅提供参数:
docker run -i -t myContainer -g "daemon off;"

此时,docker run某位的参数会追加到ENTRYPOINT后,从而相当于执行命令:

/usr/sbin/nginx -g "daemon off;"

这种方式可以为命令动态添加参数。

WORKDIR

该命令用于指定Dockerfile中指令的工作目录,类似于Linux中的cd命令。如:

WORKDIR /usr/tomcat/bin
ENTRYPOINT ["startup.sh"]

当设置完WORKDIR后,后面的命令将基于该工作目录执行。

ENV

该命令用于设置环境变量,且该环境变量会持久化地保存至该镜像的所有容器中。

ENV CATALINA_HOME /usr/tomcat/bin/ #定义环境变量
WORKDIR $CATALINA_HOME #使用环境变量

也可以使用-E参数在容器运行的时候设置,如下所示:

run -i -t -e "CATALINA_HOME=/usr/tomcat/bin/" myContainer /bin/bash

使用-E参数设置的环境变量只在当前容器运行期间有效,关闭容器后随即消失。

USER

该命令用于指定镜像启动时的用户身份和用户组,如:

USER chai #指定用户
USER chai:group #指定用户和用户组

VOLUME

该命令用于为基于本镜像的容器添加卷。

什么是“卷”?

“卷”本质上是一个目录,该目录存在于宿主机中,可以在多个容器间共享。

如何添加“卷”?

VOLUME ["目录"]

ADD

该命令用于将宿主机中的文件/目录复制到容器的指定目录下,如:

COPY file /usr/bin/ #将构建目录中的file文件复制到容器的/usr/bin目录下
COPY file /usr/bin/newFile #将file文件复制到容器的/usr/bin目录下,并赋予新的文件名

PS:Docker根据末尾是否有“/”来判断目标路径为目录还是文件。

COPY

本命令和ADD类似,唯一区别是ADD可以添加宿主机中任何文件/目录,而COPY只能添加当前构建目录中的文件/目录。

生成镜像

当Dockerfile书写完毕后,使用如下命令生成镜像:

docker build -t="用户名/镜像仓库名:版本号"  dockerfile路径

启动镜像

当镜像构件完毕后,使用以下命令来启动一个镜像(启动后即为一个容器):

docker run --name 容器名 -p 8080:80 -it 镜像名 /bin/bash

关于docker run命令可以参考博文Docker入门实战(一)——Docker常用命令,这里详细介绍-p参数。
-p参数用于指定docker容器端口和宿主机端口的映射关系,这样就能通过访问宿主机端口号来访问容器。一共有三种表示方式:
1. -p 宿主机端口号:容器端口号
将容器的指定端口号绑定到宿主机的指定端口号上。
2. -p 容器端口号
这里省略宿主机端口号后,docker会从49000~49900内随机选一个作为宿主机端口号。
3. -p 宿主机IP:宿主机端口号:容器端口号
若宿主机拥有多个IP,则需指定具体IP。
此外,这里宿主机端口号也可以省略,如-p 127.0.0.1::80

PS:除了 -p参数外还有个-P参数,该参数后无需跟端口号,它会将dockerfile中指定的端口号绑定到宿主机的随机端口号上。


推荐阅读
  • Docker学习(五) Dockerfile基础命令
    学习Dockerfile,需要对它的基础命令进行了解FROM-基于基准镜像尽量使用官方提供的基准镜像[x]FROMtomcat:8.5.50-jdk8-openjdk#制作基准镜像 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 本文探讨了如何通过预处理器开关选择不同的类实现,并解决在特定情况下遇到的链接器错误。 ... [详细]
  • DockerfileDocker是软件工业上的集装箱技术。通过以下文件制作Docker镜像[root@Optimusdocker-training]#cdcentos7[root@ ... [详细]
  • 我是docker的新手,正在学习 ... [详细]
  • 1、官方下载jdk8地址:https:www.oracle.comjavatechnologiesjavasejavase-jdk8-downloads.html下载的版本:jdk ... [详细]
  • 如何使用Ping命令来测试网络连接?当网卡安装和有关参数配置完成后,可以使用ping命令来测试一下网络是否连接成功。以winXP为例1、打开XP下DOS窗口具体操作是点击“开始”菜 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • docker镜像重启_docker怎么启动镜像dock ... [详细]
  • 本文将详细探讨 Java 中提供的不可变集合(如 `Collections.unmodifiableXXX`)和同步集合(如 `Collections.synchronizedXXX`)的实现原理及使用方法,帮助开发者更好地理解和应用这些工具。 ... [详细]
  • Logback使用小结
    1一定要使用slf4j的jar包,不要使用apachecommons的jar。否则滚动生成文件不生效,不滚动的时候却生效~~importorg.slf ... [详细]
  • 本文详细介绍了如何正确配置Java环境变量PATH,以确保JDK安装完成后能够正常运行。文章不仅涵盖了基本的环境变量设置步骤,还提供了针对不同操作系统下的具体操作指南。 ... [详细]
  • 本文将详细介绍Nose这一非标准库的Python测试框架,它虽然不是Python官方发行版的一部分,但与unittest框架紧密相关,旨在通过简化测试流程来提升开发效率。 ... [详细]
  • 本文详细介绍了如何正确安装Java EE SDK,并解决在安装过程中可能遇到的问题,特别是关于servlet代码在Apache Tomcat 10中无法运行的情况。 ... [详细]
  • 如何解决《如何使用docker容器作为apache服务器?》经验,为你挑选了2个好方法。 ... [详细]
author-avatar
962326154_5af7cb
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有