详解 Dockerfile:从入门到实践

devtools/2024/11/13 12:26:07/

Docker 是一个开源的应用容器引擎,它允许开发者将应用及其依赖包打包到一个可移植的容器中,然后发布到任何流行的 Linux 机器或 Windows 机器上,也可以实现虚拟化。Dockerfile 是一个文本文件,其中包含了一系列命令,用户可以调用 docker build 来创建一个镜像。本文将详细介绍 Dockerfile 的基本语法和最佳实践,并通过一个具体的示例来帮助你更好地理解 Dockerfile 的编写方法。

Dockerfile 基本语法

Dockerfile 是一个文本文件,每一行包含一个指令。Docker 在构建镜像时会逐行执行这些指令。Dockerfile 的指令非常直观,

其对应的语法可以参考官方文档:

https://docs.docker.com/engine/reference/builder/

下面是一些常用的指令:

Dockerfile 编写流程

  1. 选择基础镜像

    • 选择一个合适的官方基础镜像,如 node:14python:3.8 等。
  2. 设置工作目录

    • 使用 WORKDIR 指令设置应用的工作目录。
  3. 复制必要的文件

    • 使用 COPY 或 ADD 指令将应用的源代码、配置文件等复制到工作目录中。
  4. 安装依赖

    • 使用 RUN 指令安装应用所需的依赖。
  5. 设置环境变量

    • 使用 ENV 指令设置环境变量。
  6. 声明端口

    • 使用 EXPOSE 指令声明应用运行时需要监听的端口。
  7. 指定启动命令

    • 使用 CMD 或 ENTRYPOINT 指令指定容器启动时执行的命令。

示例:编写一个简单的 java 应用的 Dockerfile 

1.Dockerfile标准写法

# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
ENV TZ=Asia/Shanghai
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /app.jar
# 设定时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 安装JDK
RUN cd $JAVA_DIR \&& tar -xf ./jdk8.tar.gz \&& mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 指定项目监听的端口
EXPOSE 8080
# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]

2.简化写法(就有人提供了基础的系统加JDK环境,我们在此基础上制作java镜像,就可以省去JDK的配置了)

# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

ps:jdk版本下载链接:Java Downloads | Oracle 中国

希望你喜欢这篇文章!请点关注和收藏吧。你的关注和收藏会是我努力更新的动力,祝关注和收藏的帅哥美女们今年都能暴富。如果有更多问题,欢迎随时提问 


http://www.ppmy.cn/devtools/133342.html

相关文章

map映射

一、Scala的map的分类:不可变,可变 二、Scala的map的常见操作:添加元素,删除元素,查询元素,修改元素,遍历。 三、Scala的不可变map 查询有两种方法:①get方法.输入key,如果找到,就…

微信小程序运营日记(第四天)

2024年11月6日-星期三-2024年45周 {微信小程序的时间板块进行一个增加,增加:2024年第45周|共53周,星期三,今年时间剩余,本周时间剩余} 开源竞争: 开源竞争(当你无法掌握一个技术就开源这个技术…

简简单单的UDP

前言 上一篇了解了TCP的三次握手过程,目的、以及如何保证可靠性、序列号与ACK的作用,最后离开的时候四次挥手的内容,这还只是TCP内容中的冰山一角,是不是觉得TCP这个协议非常复杂,这一篇我们来了解下传输层另外一个协…

PyQt5入门级超详细教程中篇

PyQt5入门级超详细教程 中篇:信号槽机制与表格数据展示 接上篇: 第4部分:事件处理与信号槽机制 4.1 什么是信号与槽? 在 PyQt5 中,信号(Signal) 和 槽(Slot) 是处理事…

conda环境迁移,修改conda路径(附带脚本)

方法1 现将文件夹移动到对应用户的~目录下(或其他目录)mv /home/asushiro/miniconda3 /root/miniconda3建立软链接 然后创建软链接,相当于快捷方式ln -s /root/miniconda3 /home/aushiro/miniconda3方法2 将对应miniconda中的文件路径全部改…

golang 实现比特币内核:实现基于椭圆曲线的数字签名和验证

我们已经展示了,给定生成点 G,并选择一个足够大的标量 e,我们可以轻松计算出 P=e*G,但是当你拥有 G 和 P 时,几乎不可能得到 e。这是椭圆曲线加密的基础。 所选择的标量 k 被称为私钥,而 Q 是公钥。注意,k 是一个256位的整数,而 Q 包含两部分:一个是 x 坐标,另一个是…

联合物种分布模型HMSC开展单物种和多物种分析技术细节及HMSC包的实际应用;群落生态学数据分析、物种分布预测、假说验证等

目录 专题1:R/Rstudio简介及入门 夯实基础 专题2:群落生态学及数据统计分析概述 专题3:联合物种分布模型Hmsc及群落数据贝叶斯统计 专题4:单物种(物种水平)/单变量Hmsc贝叶斯统计 专题5:多…

ESLint 使用教程(四):ESLint 有哪些执行时机?

前言 ESLint 作为一个静态代码分析工具,可以帮助我们发现和修复代码中的问题,保持代码风格的一致性。然而,ESLint的最佳实践不仅仅在于了解其功能,更在于掌握其执行时机。本文将详细介绍ESLint在不同开发阶段的执行时机&#xff…