Dockerfile 部署springboot 项目暨保留字指令讲解

2023-05-16

Dockerfile 部署springboot 项目暨保留字指令讲解

  • 一、系统环境
  • 二、springboot 项目部署
    • 2.1 springboot 项目准备
    • 2.2 上传jar
    • 2.3 编写dockerfile 文件
    • 2.4 构建镜像并运行
  • 三、保留字讲解
    • 3.1 FROM
    • 3.2 MAINTAINER 和LABEL
    • 3.3 USER
    • 3.4 RUN
    • 3.5 CMD
    • 3.6 ENTRYPOINT
    • 3.7 COPY 和ADD
    • 3.8 ENV
    • 3.9 WORKDIR
    • 3.10 EXPOSE
    • 3.11 VOLUME
    • 3.12 ONBUILD
  • 四、总结

一、系统环境

虚拟机系统:CentOS 7.6
已安装环境:MySQL 5.7.35,MongoDB 5.0.2,Redis 6.2.5,Docker 20.10.8,docker-compose 1.29.2

该虚拟机环境继承自 Centos 7 安装系列文章,其中的MySQL、MongoDB、Redis 都来自该系列,还不会的朋友可以参考一下:
Centos 7 安装系列(3):Redis 6.2.5
Centos 7 安装系列(2):MongoDB 5.0.2
Centos 7 安装系列(1):MySQL 5.7.35
那么docker 和docker-compose 呢?这个直接参考菜鸟教程的安装步骤来就可以了,具体文章如下:
CentOS Docker 安装
Docker Compose

二、springboot 项目部署

2.1 springboot 项目准备

首先准备一个简单的springboot 项目,也不需要什么厉害的功能,能做个测试就可以了。
在这里插入图片描述
这是我特地新建的项目,只有一个简单的访问然后返回字符串的功能。
项目是建立了,但是我们还是得保证下它能否正常运行,编译运行下,发现是可以的:
在这里插入图片描述
那么,下一步就是打包了,mvn package 正常构建一个jar 包备用。

2.2 上传jar

在服务器上新建一个docker 目录,用来存放我们这次的文件:

cd /usr/local/env/
mkdir docker
cd docker/

将打包好的jar 包上传到该目录下。

2.3 编写dockerfile 文件

在命令行界面输入以下命令编写dockerfile 文件:

vi dockerfile

文件内容如下:

FROM java:8

MAINTAINER CBA "000@000.com"

USER root

RUN mkdir -p /usr/local/docker
COPY demo-0.0.1.jar /usr/local/docker/demo-0.0.1.jar

ENV my_path /usr/local/docker
WORKDIR $my_path

ENTRYPOINT ["nohup","java","-jar","/usr/local/docker/demo-0.0.1.jar","&"]

CMD echo "test"
CMD echo "docker test"

EXPOSE 8080

2.4 构建镜像并运行

在命令行界面输入以下命令构建dockerdemo 镜像:

docker build -t dockerdemo:0.1 .

注意:命令的最后有一个英文句号,其表示当前目录。
在这里插入图片描述
当出现这样的提示的时候,便表示构建镜像成功。
在命令行界面输入以下命令运行容器demo :

docker run -d --name demo -p 9090:8080 dockerdemo:0.1

其运行结果如下:
在这里插入图片描述
可以看到,容器可以正常运行,且也可以正常访问springboot 项目。
使用命令进入demo 容器内:

docker exec -it 6624cd0f0fad /bin/bash

查看当前正在运行的Java 进程:
在这里插入图片描述
可以明显的看到,进入容器时的默认路径是**/usr/local/docker**,容器启动时的执行命令是java -jar /usr/local/docker/demo-0.0.1.jar & /bin/sh -c echo “docker test” 。具体的含义请看下文讲解。

三、保留字讲解

3.1 FROM

FROM 命令可能是最重要的Dockerfile 命令。该命令定义了使用哪个基础镜像启动构建流程。基础镜像可以为任意镜像。如果基础镜像没有被发现,Docker 将试图从Docker image index 来查找该镜像。
FROM命令必须是Dockerfile的首个命令。

FROM java:8

3.2 MAINTAINER 和LABEL

这个命令用于声明镜像的作者与其邮箱,理论上它可以放置于Dockerfile 的任意位置,但是为了阅读方便,推荐还是放在FROM 的后面。

MAINTAINER CBA “000@000.com”

与之有类似功能的命令是LABEL,但是LABEL 更加灵活,其可以设置任何需要设置的元数据,并且可以轻松查看,例如我们可以使用以下命令替换MAINTAINER 命令:

LABEL maintainer=“CBA”

3.3 USER

USER 指令设置运行镜像时要使用的用户名(或 UID)以及可选的用户组(或 GID),默认是root 用户。但是在为用户指定组时,用户将仅具有指定的组成员身份,任何其它已配置的组成员身份将被忽略。

USER root

3.4 RUN

RUN指令会在前一条命令创建出的镜像的基础上创建一个容器,并在容器中运行命令,在命令结束运行后提交容器为新镜像,新镜像被Dockerfile中的下一条指令使用。

RUN mkdir -p /usr/local/docker

3.5 CMD

CMD指令有3种格式。

  • CMD < command> (shell格式)
  • CMD [“executable”, “param1”, “param2”] (exec格式,推荐使用)
  • CMD [“param1”, “param2”] (为ENTRYPOINT指令提供参数)

在使用shell 和exec 格式时,命令在容器中的运行方式与RUN指令相同。
但是,RUN指令在构建镜像时执行命令,并生成新的镜像;CMD指令在构建镜像时并不执行任何命令,而是在容器启动时默认将CMD指令作为第一条执行的命令。
如果用户在命令行界面运行docker run 命令时指定了命令参数,则会覆盖CMD 指令中的命令。
一个Dockerfile 中可以有多条CMD 指令,但只有最后一条CMD 指令有效。

CMD echo “test”
CMD echo “docker test”

3.6 ENTRYPOINT

ENTRYPOINT指令有两种格式。

  • ENTRYPOINT < command> (shell格式)
  • ENTRYPOINT [“executable”, “param1”, “param2”] (exec格式,推荐格式)

ENTRYPOINT 指令和CMD 类似,它也可用户指定容器启动时要执行的命令。
但如果dockerfile 中也有CMD 指令,CMD 中的参数会被附加到ENTRYPOINT 指令的后面。
如果这时docker run 命令带了参数,这个参数会覆盖掉CMD 指令的参数,并也会附加到ENTRYPOINT 指令的后面。
可以看出,相对来说ENTRYPOINT 指令优先级更高。

ENTRYPOINT [“java”,"-jar","/usr/local/docker/demo-0.0.1.jar"]

3.7 COPY 和ADD

ADD 指令的功能是将主机构建环境(上下文)目录中的文件和目录、以及一个URL 标记的文件 拷贝到镜像中。

  • 如果源是个归档文件(压缩文件),则docker 会自动解压。
  • 如果源是一个URL,那该URL 的内容将被下载并复制到容器中,下载后的文件权限自动设置为600 。
  • 如果目标路径不存在,则会自动创建目标路径。

COPY 指令和ADD 指令功能和使用方式类似,但是COPY 只支持本地文件且不会做自动解压工作。

COPY demo-0.0.1.jar /usr/local/docker/demo-0.0.1.jar

3.8 ENV

ENV 指令用来在镜像构建过程中设置环境变量,这些变量会永久地保存到该镜像创建的任何容器中。
通过ENV 定义的环境变量,可以被后面的所有指令中使用,但不能被docker run 的命令参数引用。

ENV my_path /usr/local/docker

3.9 WORKDIR

WORKDIR 指令用于指定容器的一个目录, 容器启动时所有执行的命令会在该目录下执行。如果这个工作目录不存在,则会自动创建一个。
WORKDIR 指令可在dockerfile 中多次使用。如果提供了相对路径,则它将相对于上一个WORKDIR 指令的路径。例如:

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

输出结果是 /a/b/c。

3.10 EXPOSE

EXPOSE 指令声明docker 容器在运行时侦听的网络端口。也可以指定端口是侦听协议是TCP 还是UDP,如果未指定协议,则默认值为TCP。
这个指令仅仅是声明容器打算使用什么端口而已,并不会自动在宿主机进行端口映射,尽管它可以这么做,但这个做法并不值得推荐。

EXPOSE 8080

3.11 VOLUME

通过dockerfile 的 VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点。其作用与使用docker run -v 命令相同。
但是通过这种方式创建的挂载点,无法指定主机上对应的目录,是自动生成的。

3.12 ONBUILD

当我们在一个dockerfile 文件中加上ONBUILD指令,该指令对利用该dockerfile构建镜像(比如为A镜像)不会产生实质性影响。
但是当我们编写一个新的dockerfile 文件来基于A 镜像构建一个镜像(比如为B镜像)时,这时构造A 镜像的dockerfile 文件中的ONBUILD 指令就生效了,在构建B 镜像的过程中,首先会执行ONBUILD 指令指定的指令,然后才会执行其它指令。

四、总结

好了,本文到此截至,主要介绍了如何使用dockerfile 构建镜像以部署springboot 项目,并介绍了dockerfile 中的保留字指令的用途。

我是陈冰安,一个学习者。欢迎关注我的公众号【暗星涌动】,愿与你一同进步。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dockerfile 部署springboot 项目暨保留字指令讲解 的相关文章

随机推荐

  • 相机内参的标定方法

    简介 摄像机标定 Camera calibration 简单来说是从世界坐标系换到图像坐标系的过程 xff0c 也就是求最终的投影矩阵 PP 的过程 xff0c 下面相关的部分主要参考UIUC的计算机视觉的课件 xff08 网址Spring
  • python中的函数、类和对象、模块和包都是啥意思?

    python中的函数 类 对象 包都是啥意思 xff1f 1 函数 重复的事情不做两次 函数还是比较好理解的吧 xff0c 数学中就学到过函数 xff0c 就是用来解决某一些问题的过程 为啥要写函数 xff1f 首先是方便代码重用 xff0
  • E3ZG_D62传感器 STM32C8T6

    E3ZG D62传感器 在STM32C8T6的简单应用 该图便是E3ZG D62传感器的样子 第一个旋钮是灵敏度调节旋钮的 xff0c 第二个旋钮是改变模式 xff0c 在L时 xff0c 长灭 xff0c 检测到 xff0c 为亮 xff
  • Learning High-Speed Flight in the Wild 环境安装

    有许多问题可以去github项目内的issues查找一下 xff0c 里面有相当一部分问题的解决方案 也可参考论文学习 Learning High Speed Flight in the Wild 一 环境安装 论文程序github地址 x
  • AES加密算法

    密钥类型 AES 128 xff1a 128位比特 xff08 16字节 xff09 AES 192 xff1a 192位比特 xff08 24字节 xff09 AES 256 xff1a 256位比特 xff08 32字节 xff09 一
  • Ros noetic : XTDrone安装

    一 安装参考 安装过程绝大部分参考如下的文件语雀 xff1a 仿真平台基础配置 进行配置 二 出现的错误以及需要注意的问题 这里的配置如下 xff1a ROS noetic Ubuntu20 04 python3 8 2 1 依赖安装 在
  • DQN、DDQN、Dueling DQN tensorflow2.0

    一 tensorflow2 0 实现DQN算法 算法代码如下 span class token keyword import span numpy span class token keyword import span tensorflo
  • PG-REINFORCE tensorflow 2.0

    REINFORCE 算法实现 REINFORCE算法是策略梯度算法最原始的实现算法 xff0c 这里采用tensorflow2 0进行实现 span class token keyword import span tensorflow sp
  • DDPG tensorflow 2.0

    DDPG算法的tensorflow2 0实现 算法的详细解析可以看DDPG解析 span class token keyword import span tensorflow span class token keyword as span
  • MADDPG tensorflow2.0

    MADDPG 的 tensorflow2 0实现 环境 MPE 对MPE环境进行了一些简单的修改 xff0c 目前只在MPE中的simple spread上进行了简单的测试 MADDPG代码 代码由于是自己写的 xff0c 可能有一些错误
  • 最短探索时间的一种想法——MADDPG

    前言 最近在做maddpg相关的项目时候 xff0c 涉及到了一些在固定地图的场景下 xff0c 采取何种探索方式 xff0c 能够使在最短的时间内 xff0c 探索尽可能多的地图内容 xff0c 对此做了一些努力 xff0c 一些朋友对此
  • 在NVIDIA Jetson Xavier NX上使用tensorflow-gpu

    在NVIDIA Jetson Xavier NX上使用tensorflow gpu 目前所做的项目需要在NVIDIA Jetson Xavier NX的ubuntu18 04的系统下配置ROS xff0c python3以及tensorfl
  • CSDN最全数学公式

    CSDN中的数学公式 1 加减乘除 a 43 b a 43 b a 43 b xff1a a 43 b a
  • 数据结构体系复构

    1 数组 数组是可以再内存中连续存储多个元素的结构 xff0c 在内存中的分配也是连续的 xff0c 数组中的元素通过数组下标进行访问 xff0c 数组下标从0开始 数组运算 xff1a 遍历 xff1a 遍历所有元素并进行打印 插入 xf
  • 指向void的指针

    万能指针 一个指向任何对象类型的指针都可以赋值给类型为void 的变量 xff0c void 可以赋值给另外一个void xff0c 俩个void 可以比较相等与否 xff0c 而且可以显式地将void 转换到另一个类型 其他操作都是不安全
  • nano 命令

    Nano命令指南 打开文件与新建文件 使用nano打开或新建文件 xff0c 只需键入 xff1a 代码 1 1 打开或新建文件 nano 文件名 Nano是一种单模式编辑器 xff0c 你可以直接输入文字 如果你要编辑一个像 etc fs
  • 四轴飞控pid simulink仿真

    今天是我写的第一篇博客hhh xff0c 可能文章思路混乱 xff0c 大家海涵 最近想自己用stm32搞一个四轴飞行器的飞控 xff0c 现在进展比较缓慢 xff0c 主要受制于想做一个wifi无线透传的视频实时传递 用了一个新的模块 x
  • 蓝桥杯嵌入式客观题总结

    一 CPU芯片 xff1a STM32F103RBT6 STM32 xff1a 32位的MCU xff08 ST 意法半导体公司 M xff1a 微控制器 32 xff1a 32bit xff09 F 61 通用类型 103 xff1a 中
  • 大学Python编程试卷真题!用python循环,输出1+11+111+1111+11111的值

    你用过的Python的库有哪些 分别用于工作中什么场景 这个是上一期讲的面试题拓展 那今天来再拓展一下 xff0c 讲一个算法题 利用python循环 xff0c 输出1 43 11 43 111 43 1111 43 11111的值 这个
  • Dockerfile 部署springboot 项目暨保留字指令讲解

    Dockerfile 部署springboot 项目暨保留字指令讲解 一 系统环境二 springboot 项目部署2 1 springboot 项目准备2 2 上传jar2 3 编写dockerfile 文件2 4 构建镜像并运行 三 保