当前位置:首页 > 技术 > 正文内容

Docker File编写实战指南

访客 技术 2026年5月25日 4

DockerFile 基础概念

DockerFile 是用于构建 Docker 镜像的脚本文件,它包含一系列指令和参数,系统会按照这些指令自动生成镜像。

使用流程如下:

  1. 编写 DockerFile 脚本
  2. 执行 docker build 生成镜像
  3. 通过 docker run 启动容器
  4. 使用 docker push 上传镜像到仓库

DockerFile 编写规范

核心规则

  • 所有保留指令必须大写
  • 指令按顺序从上到下执行
  • 每条指令都会创建一个新镜像层并提交
  • # 表示注释行

常用指令详解

  • FROM:设定基础镜像,类似于面向对象中的父类继承
  • MAINTAINER:标注作者信息,通常为姓名+邮箱格式
  • RUN:在构建镜像时执行的命令
  • ADD:添加压缩文件,构建时自动解压
  • WORKDIR:设定容器启动后的默认工作目录
  • VOLUME:配置数据卷挂载点
  • EXPOSE:声明容器运行时暴露的端口
  • CMD:定义容器启动时执行的命令,仅最后一条生效,可被 docker run 后附加命令覆盖
  • ENTRYPOINT:定义容器启动时执行的命令,仅最后一条生效,但 docker run 后附加命令会拼接到其后
  • ONBUILD:触发器,当当前镜像被其他 DockerFile 继承时,在构建子镜像前执行此指令
  • COPY:将文件复制到镜像中
  • ENV:设置环境变量

实战示例:定制 CentOS 镜像

官方 CentOS 镜像缺少一些常用工具,我们可以扩展它。

编写 DockerFile

FROM centos
MAINTAINER dev_team<dev@example.com>

RUN yum -y install vim
RUN yum -y install net-tools

ENV WORK_DIR /usr/local
WORKDIR $WORK_DIR

VOLUME /data

EXPOSE 80

CMD echo "Build completed"
CMD echo "Working dir: $WORK_DIR"
CMD /bin/bash

构建镜像

# 标准构建命令,-f 指定文件路径,-t 指定镜像名称:标签
docker build -f ./centos-custom -t mycentos:1.0 .
# 查看镜像构建历史
docker history mycentos:1.0

启动容器验证

docker run -it mycentos:1.0

进入容器后,默认路径为 /usr/local,且 ifconfigvim 均可用。

CMD 与 ENTRYPOINT 深度对比

相同点

  • 两者都定义容器启动时的执行命令
  • 优先级相同,同一类型中仅最后一条生效
  • 若同时存在,最后出现的那个指令生效

不同点

  • CMDdocker run 后附加命令会完全替换 CMD 定义
  • ENTRYPOINTdocker run 后附加命令会拼接到 ENTRYPOINT 定义的命令之后

测试场景

CMD 被替换

# DockerFile
FROM centos
CMD ["ls", "-a"]

# 运行并附加命令
docker run test-cmd echo "hello"
# 输出: hello(CMD的ls命令未执行)

ENTRYPOINT 拼接

# DockerFile
FROM centos
ENTRYPOINT ["ls", "-a"]

# 运行并附加参数
docker run test-entrypoint -l
# 实际执行: ls -a -l,输出详细目录列表

生产案例:构建 Tomcat 镜像

准备资源

  • apache-tomcat-9.0.37.tar.gz
  • jdk-8u261-linux-x64.tar.gz

编写 DockerFile

FROM centos
MAINTAINER team<team@example.com>

COPY readme.txt /usr/local/readme.txt
ADD apache-tomcat-9.0.37.tar.gz /usr/local
ADD jdk-8u261-linux-x64.tar.gz /usr/local

RUN yum -y install vim
RUN yum -y install net-tools

ENV APP_DIR /usr/local
WORKDIR $APP_DIR

ENV JAVA_HOME /usr/local/jdk1.8.0_261
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.37
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.37
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD $CATALINA_HOME/bin/startup.sh && tail -F $CATALINA_HOME/logs/catalina.out

启动容器并挂载卷

docker run -d -p 8000:8080 \
  --name tomcat-app \
  -v /host/webapps/test:/usr/local/apache-tomcat-9.0.37/webapps/test \
  -v /host/logs:/usr/local/apache-tomcat-9.0.37/logs \
  my-tomcat-image

部署测试应用

创建 WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
</web-app>

创建 index.jsp

<html>
<head><title>Test App</title></head>
<body>
    Hello from Docker!<br/>
    <%
    System.out.println("=== Access log entry ===");
    %>
</body>
</html>

访问 http://server-ip:8000/test/ 即可看到页面。通过访问挂载的日志目录 logs/catalina.out 可以查看输出信息。

注意事项

挂载数据卷时,若直接挂载到 webapps 目录层级,会覆盖容器内原有内容,导致默认应用不可用。建议挂载到具体子目录。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。