DockerFile打包项目实战解析,一文读懂dockerfile打包

news2024/12/28 6:01:27

文章目录

  • 一、简介
  • 二、DockerFile基础
    • 1. DockerFile的作用和特点
    • 2. DockerFile语法介绍
    • 3. 基本指令:FROM、RUN、COPY、ADD等
  • 三、编写具体项目使用DockerFile
  • 四、构建镜像
    • 1.项目构建
      • 默认命令dockerfile文件
      • 非默认命令dockerfile文件
        • 小知识
    • 2. 使用ENTRYPOINT和CMD指定容器启动命令
    • 3. 容器与宿主机的文件共享和挂载
  • 五、总结

一、简介

现在项目部署都不在是简单的打包推送了,而是容器化管理这样也便于扩充服务动态运维。很是优雅,所以呢对于现在经常使用的docker打包项目进行部署就写一篇详解,这里呢是我们项目很早就用上docker了,所以我就以一个简单的demo进行说明。

二、DockerFile基础

1. DockerFile的作用和特点

DockerFile是一种用于定义Docker镜像构建过程的文件。它的作用是描述镜像的组成部分和构建过程,包括从基础镜像开始,逐步添加软件包、依赖项和配置,最终生成一个新的、可用的镜像。DockerFile具有以下特点:

  1. 可追溯性:DockerFile中的每一条指令都可以追溯到具体的操作步骤,使得整个构建过程可被重新创建或修改。

  2. 可重复性:通过编写DockerFile,可以确保在不同的环境中反复构建出相同的镜像。这样可以减少因环境差异导致的构建错误和依赖问题。

  3. 版本控制:DockerFile可以与代码存储在同一个版本控制系统中,方便进行版本管理和团队协作。

  4. 自动化构建:通过DockerFile,可以实现镜像的自动构建,减少手动操作的繁琐性,并提高构建效率。

2. DockerFile语法介绍

DockerFile使用一系列指令来定义构建步骤,每个指令占据一行并以大写字母开头。
在这里插入图片描述

3. 基本指令:FROM、RUN、COPY、ADD等

在DockerFile中,可以使用多个指令来定义镜像的构建过程。下面是一些常用的指令及其说明:

  1. FROM:指定基础镜像。例如:FROM ubuntu:latest表示以最新版的Ubuntu镜像为基础构建。

  2. RUN:在镜像中执行命令。例如:RUN apt-get update && apt-get install -y python3表示在镜像中执行更新并安装Python3的命令。

  3. COPY:复制本地文件到镜像中。例如:COPY . /app表示将当前目录中的所有文件复制到镜像中的/app目录下。

  4. ADD:类似于COPY指令,但还可以自动解压缩文件。例如:ADD app.tar.gz /表示将压缩包解压并复制到镜像根目录下。

  5. WORKDIR:设置工作目录。例如:WORKDIR /app表示将/app目录设置为工作目录。

  6. EXPOSE:声明容器运行时要监听的端口。例如:EXPOSE 80表示声明容器要监听的端口号为80。

  7. CMD:指定容器启动时要执行的命令。该指令只能在DockerFile中出现一次。例如:CMD ["python", "app.py"]表示容器启动时执行Python脚本app.py。

  8. ENTRYPOINT:类似于CMD指令,但它提供了固定的执行命令,并可以与CMD指令结合使用。例如:ENTRYPOINT ["nginx"]表示容器启动时将执行nginx命令。

  9. ENV:设置环境变量。例如:ENV API_KEY=123456表示在镜像中设置一个名为API_KEY的环境变量,并赋值为123456。

  10. ARG:定义构建参数。例如:ARG ENVIRONMENT=production表示定义一个名为ENVIRONMENT的构建参数,默认值为production。

这些是DockerFile中常用的一些指令,每个指令都有特定的功能和语法。通过组合和使用这些指令,可以编写出具有特定功能和要求的Docker镜像构建过程。

三、编写具体项目使用DockerFile

#使用jdk11作为基础镜像
FROM openjdk:11
#
# 将jar包添加到容器中,并命名为 demo.jar
ADD testDemo.jar /home/admin/Demo.jar
# 指定Java的运行大小内存,也是设置变量,这个变量值是可以通过启动容器的时候重新指定的。
ENV JAVA_OPTS="-Xmx128m -Xms128m"
ENTRYPOINT java -jar /home/admin/Demo.jar
# SpringBoot项目配置的端口号为8090,需要将8090暴露出去
EXPOSE 8090

在这里插入图片描述

# 指示在容器启动时运行java -jar /home/admin/Demo.jar命令
ENTRYPOINT java -jar /home/admin/Demo.jar

四、构建镜像

1.项目构建

默认命令dockerfile文件

docker build --tag test1:v1.0 .

这条命令使用了 docker build 命令来构建一个 Docker 镜像,并给该镜像设置了名称和标签。

  • --tag myapp:v1.0 指定了镜像的名称和标签为 myapp:v1.0。可以根据自己的需要更改名称和标签来唯一标识该镜像,以便后续使用和管理。
  • . 表示当前目录,它是 docker build 命令的 PATH 参数。这意味着当前目录中必须存在 Dockerfile 文件,因为 Docker 将在该文件中查找构建指令和配置信息来生成镜像。

当执行该命令时,Docker会读取当前目录中的 Dockerfile 文件,并遵循其中的指令进行镜像构建。构建过程涉及到依赖项的安装、环境配置、复制文件等操作,具体动作由 Dockerfile 中的指令定义。

最终,构建成功后的镜像将被打上指定的名称和标签(myapp:v1.0),可以通过该名称和标签来引用和部署镜像。

非默认命令dockerfile文件

另一种dockerfile文件的名字不叫Dokcerfile并且Dockerfile和要被构建的jar不在一个目录下使用这中

docker build --tag myapp:v1.0 -f /dockerTest/DockerfileS /dockerTest 

这条命令是使用 Docker 构建镜像的命令,并且使用了自定义的 Dockerfile 文件。

  • docker build 是构建镜像的命令。
  • --tag myapp:v1.0 指定了镜像的名称和标签为 myapp:v1.0。可以根据需要修改名称和标签来唯一标识该镜像。
  • -f /dockerTest/DockerfileS 使用了 -f 参数来指定了自定义的 Dockerfile 文件的路径。这里的路径是 /dockerTest/DockerfileS,请注意大小写以及文件名的准确性。
  • /dockerTest 是构建上下文的路径,指定了构建过程中 Docker 将查找文件和目录的位置。在该命令中,Docker 将在 /dockerTest 目录中查找构建所需的文件和目录,包括指定的 Dockerfile 文件。

执行该命令后,Docker 将读取指定路径下的 Dockerfile 文件,并遵循其中的构建指令和配置信息来生成镜像。镜像将会被打上指定的名称和标签(myapp:v1.0)。

小知识

可以看到我构建的这个镜像过程程序打印出来一共5个步骤,是不是在正好对应了我上面自定义的dockefile文件中的5条命令,这是因为docker根据这dockerfile文件命令构建镜像时一个命令执行就是一次镜像的生成,而后面的命令执行实在上一次命令打好的镜像基础上执行的,可以理解为套娃

在这里插入图片描述

2. 使用ENTRYPOINT和CMD指定容器启动命令

ENTRYPOINT指定容器启动时要执行的命令,CMD指定默认参数。

在 Dockerfile 中,ENTRYPOINTCMD 都是用来指定容器启动时要执行的命令。但它们之间有一些关键的差异:

  • ENTRYPOINT 指令用于设置容器的入口点,即容器启动时要执行的命令或可执行文件。ENTRYPOINT 可以接受参数,并且这些参数将被视为要运行的命令的参数。在一个 Dockerfile 中只能使用一条 ENTRYPOINT 指令,如果有多个 ENTRYPOINT 指令,则只有最后一条生效。

  • CMD 指令用于设置容器启动时默认执行的命令。与 ENTRYPOINT 不同的是,CMD 可以被 docker run 命令行中指定的参数覆盖。在一个 Dockerfile 中可以使用多个 CMD 指令,但只有最后一个生效。

在你的例子中,使用了 ENTRYPOINT 指令将 java -jar /home/admin/Demo.jar 作为容器的入口点。这表示每次启动容器时,都会执行该命令并运行 Demo.jar

如果你想添加一个默认参数,可以在 ENTRYPOINT 后面使用 CMD 来指定:

ENTRYPOINT java -jar /home/admin/Demo.jar
CMD ["--some-option"]

这样,在运行容器时如果没有显示指定参数,就会默认使用 --some-option 参数。

总的来说,ENTRYPOINTCMD 的区别在于命令参数是否可以被覆盖。ENTRYPOINT 是容器的入口点,不会被覆盖,而 CMD 是默认执行的命令,可以被 docker run 命令行指定的参数覆盖。

3. 容器与宿主机的文件共享和挂载

使用VOLUME指令或docker run命令的-v参数,实现容器与宿主机之间的文件共享和挂载。
在这里插入图片描述
现在我们看一在服务器下的/home/admin/dockerTest/应该有一个名字叫 demo.jar 的jar包

五、总结

Docker和Dockerfile是现代化软件开发和部署的重要工具。通过使用Docker,可以实现快速、可靠和可移植的应用部署。而通过制作高质量的Dockerfile,可以确保镜像的可靠性和可维护性。掌握Docker和Dockerfile的使用和最佳实践,将极大地提高开发和部署效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/995182.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++11 新特性 ⑥ | 智能指针 unique_ptr、shared_ptr 和 weak_ptr

目录 1、引言 2、unique_ptr 3、shared_ptr 4、weak_ptr 5、shared_ptr循环引用问题(面试题) VC常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/detai…

Java之List集合的解析及泛型的概述

4.List集合的实现类 4.1List集合子类的特点【记忆】 ArrayList集合 底层是数组结构实现,查询快、增删慢 LinkedList集合 底层是链表结构实现,查询慢、增删快 4.2LinkedList集合的特有功能【应用】 特有方法 方法名说明public void addFirst(E e)在该…

小白备战大厂算法笔试(五)——树

文章目录 二叉树常用术语初始化插入与删除常见类型满二叉树完全二叉树完满二叉树平衡二叉树 二叉树退化二叉树遍历层序遍历前序、中序、后序遍历 数组表示二叉树表示完美二叉树表示任意二叉树 二叉搜索树查找节点插入节点删除节点遍历有序搜索效率常见应用 二叉树 二叉树是一种…

Dynamic CRM开发 - 实体窗体(一)

CRM创建一个实体以及实体字段后,在实体窗体里拖动字段和简单配置,就可以实现一个新增和编辑实体数据的表单,这种无代码的操作形式对非程序员非常的友好。 实体有四种类型的窗体:主窗体、快速视图窗体、快速创建窗体、卡窗体。 窗体区别如下: 窗体操作说明: 1、启用安全…

Windows定时任务实现开机自启动

Windows定时任务实现S11开机自启动 Windows键加 r 键打开运行窗口,然后输入control打开控制面板。

Linux内核分析与应用2-内存寻址

本系列是对 陈莉君 老师 Linux 内核分析与应用[1] 的学习与记录。讲的非常之好,推荐观看 留此记录,蜻蜓点水,可作抛砖引玉 2.1 内存寻址 数据连续存储和选择读取思想,是目前我们使用的几乎所有机器运行背后的灵魂 计算机体系结构中的核心问题之一,就是如…

python28种极坐标绘图函数总结

文章目录 基础图误差线等高线polar场图polar统计图非结构坐标图 📊python35种绘图函数总结,3D、统计、流场,实用性拉满 matplotlib中的画图函数,大部分情况下只要声明坐标映射是polar,就都可以画出对应的极坐标图。但…

深入浅出AXI协议(6)——传输属性

一、前言 在之前的文章中,我们介绍的主要内容是AXI协议的数据读写结构和读写响应结构,主要讲述了当遇到各种特殊情况时,AXI如何完成数据的读写操作,最后介绍了读写响应的4种类型。 在本文中,我们将介绍AXI协议的传输属性。 二、传…

centos7的yum修改为阿里源

yum修改为阿里源 1.安装wget yum install -y wget2.备份与下载源 cd /etc/yum.repos.d mv -f CentOS-Base.repo CentOS-Base.repo.backup wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo mv epel.repo epel.repo.backup # 有些系…

C++引用与移动语义

目录 一.引用分类 1.名词解释 1).左右值 二.引用(左值引用) 1.左值引用(Lvalue Reference): 2.本质 3.形式 4.注意 5.示例 1)引用做左值 2)引用做函数返回值 三.右值引用 1.右值引…

代码随想录算法训练营day|139.单词拆分|多重背包基础力理论| 背包总结

139.单词拆分 力扣题目链接 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明: 拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1&#xff1a…

centos 端口被占用的快速排查方式

问题笔记 centos 端口被占用的快速排查方式 centos 端口被占用的快速排查方式 这里说一个我刚刚遇到的问题,解决步骤用来记录,方便以后自己查询。 nginx配置完index.html测试文件,发现一直显示的404页面。 我跑到服务器上想重启一下nginx …

如何从Git上拉取项目

1.Git的概念 Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。它实现多人协作的机制是利用clone命令将项目从远程库拉取到本地库,做完相应的操作后再利用push命令从本地库将项目提交至远程库。 2.Git的工作流程 …

Meshmixer在数字牙科的实践

数字牙科(Digital Dentistry)在口腔健康领域获得越来越多的空间,如何使用 Meshmixer 软件在数字牙科中创建 3D 模型对于该领域的专业人士来说是一项宝贵的技能。 在本文中,拟将学习如何掌握这个强大的工具并创建令人惊叹的 3D 模型…

本地MQTT服务器搭建(EMQX)

一、下载EMQX 下载地址:EMQ (emqx.com) 打开官网后,选择右边的免费试用按钮 然后单击EMQX Enterprise标签,然后选择下面的EMQX开源版,选择开源版的系统平台为Windows,单击免费下载。 在新页面下单击立即下载 二、安装…

第1章_瑞萨MCU零基础入门系列教程之单片机程序的设计模式

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id728461040949 配套资料获取:https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总: ht…

华为云云耀云服务器L实例评测|安装Java8环境 配置环境变量 spring项目部署 【!】存在问题未解决

目录 引出安装JDK8环境查看是否有默认jar上传Linux版本的jar包解压压缩包配置环境变量 上传jar包以及运行问题上传Jar包运行控制台开放端口访问失败—见问题记录关闭Jar的方式1.进程kill -92.ctrl c退出 问题记录:【!】未解决各种方式查看端口情况联系工程师最后排查…

自学Python05-学会Python中的函数定义

亲爱的同学们,今天我们将开始学习 Python 中的函数。函数就像一个魔法盒子,可以让我们在程序中执行一段代码,并且可以反复使用。这样,我们的程序就可以变得更加简洁和易于理解。现在,让我们一起来学习如何使用函数吧&a…

无涯教程-JavaScript - OCT2HEX函数

描述 OCT2HEX函数将八进制数转换为十六进制。 语法 OCT2HEX (number, [places])争论 Argument描述Required/OptionalNumber 您要转换的八进制数。 数字不得超过10个八进制字符(30位)。数字的最高有效位是符号位。其余的29位是幅度位。 负数使用二进制补码表示。 RequiredPl…

报考浙江工业大学MBA项目如何选择合适的辅导班?

浙江工业大学MBA项目每年有数百人报考,在浙江省内除了浙大以外算是人数比较多的一个项目。2023级的招生中第一志愿也通过复试刷掉了百来人,在省内其实作为第一志愿报考的风险在逐渐增大,考生们如果坚持报考,则在针对联考初试的备考…