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

【Dockerfile】将自己的项目构建成镜像部署运行

目录

1.Dockerfile

2.镜像结构

3.Dockerfile语法

4.构建Java项目

5.基于Java8构建项目

1.Dockerfile

常见的镜像在DockerHub就能找到,但是我们自己写的项目就必须自己构建镜像了。

而要自定义镜像,就必须先了解镜像的结构才行。

2.镜像结构

镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。

我们以MySQL为例,来看看镜像的组成结构:

简单来说,镜像就是在系统函数库、运行环境基础上,添加应用程序文件、配置文件、依赖文件等

组合,然后编写好启动脚本打包在一起形成的文件。

我们要构建镜像,其实就是实现上述打包的过程。  

3.Dockerfile语法

构建自定义的镜像时,并不需要一个个文件去拷贝,打包。

我们只需要告诉Docker,我们的镜像的组成,需要哪些BaseImage、需要拷贝什么文件、需要安

装什么依赖、启动脚本是什么,将来Docker会帮助我们构建镜像。

而描述上述信息的文件就是Dockerfile文件。

Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操

作来构建镜像。每一个指令都会形成一层Layer。

更新详细语法说明,请参考官网文档: Dockerfile reference | Docker Docs  

4.构建Java项目

需求:基于Ubuntu镜像构建一个新镜像,运行一个java项目

  • 步骤1:新建一个空文件夹docker-demo

  • 步骤2:拷贝jdk、dockerfile、jar包到docker-demo

Dockerfile内容如下:

# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar# 安装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 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
  •  步骤3:运行命令 构建镜像
docker build -t javaweb:1.0 
  • 步骤4:运行容器 并且访问
docker run --name web -p 8090:8090 -d javaweb:1.0

 

5.基于Java8构建项目

虽然我们可以基于Ubuntu基础镜像,添加任意自己需要的安装包,构建镜像,但是却比较麻烦。所以大多数情况下,我们都可以在一些安装了部分软件的基础镜像上做改造。

例如,构建java项目的镜像,可以在已经准备了JDK的基础镜像基础上构建。

需求:基于java:8-alpine镜像,将一个Java项目构建为镜像

实现思路如下:

  • ① 新建一个空的目录,然后在目录中新建一个文件,命名为Dockerfile

  • ② 拷贝课前资料提供的docker-demo.jar到这个目录中

  • ③ 编写Dockerfile文件:

    • a )基于java:8-alpine作为基础镜像

    • b )将app.jar拷贝到镜像中

    • c )暴露端口

    • d )编写入口ENTRYPOINT

      内容如下:

FROM java:8-alpine
COPY ./app.jar /tmp/app.jar
EXPOSE 8090
ENTRYPOINT java -jar /tmp/app.jar
  • ④ 使用docker build命令构建镜像

  • ⑤ 使用docker run创建容器并运行

http://www.lryc.cn/news/245915.html

相关文章:

  • flink和机器学习模型的常用组合方式
  • 自动驾驶学习笔记(十二)——定位技术
  • 【MySQL系列】PolarDB入门使用
  • 第二节HarmonyOS DevEco Studio创建项目以及界面认识
  • 网页设计--第5次课后作业
  • Spring Cache框架,实现了基于注解的缓存功能。
  • CSS-鼠标属性篇
  • Fiddler弱网测试究竟该怎么做?
  • 蓝桥杯-平方和(599)
  • 从零构建属于自己的GPT系列1:预处理模块(逐行代码解读)、文本tokenizer化
  • STM32内存介绍
  • Qt::Window 、Qt::Tool是 Qt 框架中的一个窗口标志(Window Flag),用于指定窗口的类型和行为
  • 东胜物流软件 SQL注入漏洞复现
  • 第1章 爬虫基础
  • Python教程---序列--序列修改元素
  • Linux 中的 ls 命令使用教程
  • Kubernetes基础入门:Kubernetes的有关概述
  • C# 无法将“int[]“类型隐式转换为“int?[]“,无法将“string[]“类型隐式转换为“string?[]“
  • 趣链科技,HyperChain
  • 吴恩达《机器学习》9-7-9-8:综合起来、自主驾驶
  • HTTP/HTTPS
  • C语言中#ifndef的头文件保护用法和宏定义用法
  • 141.【Git版本控制-本地仓库-远程仓库-IDEA开发工具全解版】
  • OpenCV快速入门:移动物体检测和目标跟踪
  • 针对操作系统漏洞的反馈方法
  • 常见的软件测试用例设计方法有哪些?
  • 【24届校招】c++选手还有机会吗?如何选择更好的出路?
  • hvigor ERROR: Failed :entry:default@ProcessLibs...【鸿蒙开发-BUG已解决】
  • 由于没有公钥,无法验证下列签名: NO_PUBKEY
  • vue3 for循环创建的多个e-form 添加校验