当前位置: 首页 > news >正文

详解 Dockerfile:从入门到实践

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.lryc.cn/news/482079.html

相关文章:

  • 随机变量的概率分布
  • Kafka生产者如何提高吞吐量?
  • mysql:解决windows启动失败无报错(或长时间未响应)
  • 【山——回文判断】
  • FPGA学习笔记#7 Vitis HLS 数组优化和函数优化
  • 欧几里得算法python
  • 【layui】echart的简单使用
  • ios打包文件上传App Store windows工具
  • vue2项目启用tailwindcss - 开启class=“w-[190px] mr-[20px]“ - 修复tailwindcss无效的问题
  • mysql中数据不存在却查询到记录?
  • vue3+elementplus+虚拟树el-tree-v2+多条件筛选过滤filter-method
  • 【C#设计模式(4)——构建者模式(Builder Pattern)】
  • LabVIEW实验室液压制动系统
  • 解决:Loading class `com.mysql.jdbc.Driver‘. This is deprecated
  • 【寻找重复数字】——脑筋急转弯...
  • AI基础知识
  • ubuntu 22.04 硬件配置 查看 显卡
  • 【计算机网络】网络框架
  • linux nvidia/cuda安装
  • 硬件设备网络安全问题与潜在漏洞分析及渗透测试应用
  • #渗透测试#SRC漏洞挖掘#CSRF漏洞的防御
  • C++ | Leetcode C++题解之第542题01矩阵
  • RabbitMQ 不公平分发介绍
  • 测试实项中的偶必现难测bug--一键登录失败
  • 危!这些高危端口再不知道问题就大了
  • Redis集群模式之Redis Sentinel vs. Redis Cluster
  • Leetcode 罗马数字转整数
  • 东方通TongWeb替换Tomcat的踩坑记录
  • ceph介绍和搭建
  • 树莓派安装FreeSWITCH