首页 > 其他分享 >Dockerfile语法,自定义镜像

Dockerfile语法,自定义镜像

时间:2024-07-02 20:30:34浏览次数:19  
标签:java 自定义 demo jar 镜像 docker Dockerfile

我们一直在使用别人准备好的镜像,那如果我要部署一个Java项目,把它打包为一个镜像该怎么做呢?

镜像结构

要想自己构建镜像,必须先了解镜像的结构。

镜像之所以能让我们快速跨操作系统部署应用而忽略其运行环境、配置,就是因为镜像中包含了程序运行需要的系统函数库、环境、配置、依赖。

因此,自定义镜像本质就是依次准备好程序运行的基础环境、依赖、应用本身、运行配置等文件,并且打包而成。

举个例子,我们要从0部署一个Java应用,大概流程是这样:

  • 准备一个linux服务(CentOS或者Ubuntu均可)

  • 安装并配置JDK

  • 上传Jar包

  • 运行jar包

那因此,我们打包镜像也是分成这么几步:

  • 准备Linux运行环境(java项目并不需要完整的操作系统,仅仅是基础运行环境即可)

  • 安装并配置JDK

  • 拷贝jar包

  • 配置启动脚本

上述步骤中的每一次操作其实都是在生产一些文件(系统运行环境、函数库、配置最终都是磁盘文件),所以镜像就是一堆文件的集合

但需要注意的是,镜像文件不是随意堆放的,而是按照操作的步骤分层叠加而成,每一层形成的文件都会单独打包并标记一个唯一id,称为Layer)。这样,如果我们构建时用到的某些层其他人已经制作过,就可以直接拷贝使用这些层,而不用重复制作。

例如,第一步中需要的Linux运行环境,通用性就很强,所以Docker官方就制作了这样的只包含Linux运行环境的镜像。我们在制作java镜像时,就无需重复制作,直接使用Docker官方提供的CentOS或Ubuntu镜像作为基础镜像。然后再搭建其它层即可,这样逐层搭建,最终整个Java项目的镜像结构如图所示:

我们尝试pull一个redis镜像就会发现最顶层的镜像显示已经存在

最顶层的我们一般称为入口。

Dockerfile:

由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能。我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可。

而这种记录镜像结构的文件就称为Dockerfile,其对应的语法可以参考官方文档:

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

其中的语法比较多,比较常用的有:

指令

说明

示例

FROM

指定基础镜像

FROM centos:6

ENV

设置环境变量,可在后面指令使用

ENV key value

COPY

拷贝本地文件到镜像的指定目录

COPY ./xx.jar /tmp/app.jar

RUN

执行Linux的shell命令,一般是安装过程的命令

RUN yum install gcc

EXPOSE

指定容器运行时监听的端口,是给镜像使用者看的

EXPOSE 8080

ENTRYPOINT

镜像中应用的启动命令,容器运行时调用

ENTRYPOINT java -jar xx.jar

例如,要基于Ubuntu镜像来构建一个Java应用,其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 /tmp/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"]

以后我们会有很多很多java项目需要打包为镜像,他们都需要Linux系统环境、JDK环境这两层,只有上面的3层不同(因为jar包不同)。如果每次制作java镜像都重复制作前两层镜像,是不是很麻烦。

所以,就有人提供了基础的系统加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"]

构建镜像

当Dockerfile文件写好以后,就可以利用命令来构建镜像了。

# 进入镜像目录
cd /root/demo
# 开始构建
docker build -t docker-demo:1.0 .

命令说明:

  • docker build : 就是构建一个docker镜像

  • -t docker-demo:1.0-t参数是指定镜像的名称(repositorytag

  • . : 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.代表当前目录,也可以直接指定Dockerfile目录:

    # 直接指定Dockerfile目录
    docker build -t docker-demo:1.0 /root/demo

    查看镜像列表:

    # 查看镜像列表:
    docker images
    # 结果
    REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
    docker-demo   1.0       d6ab0b9e64b9   27 minutes ago   327MB
    nginx         latest    605c77e624dd   16 months ago    141MB
    mysql         latest    3218b38490ce   17 months ago    516MB

    然后尝试运行该镜像:

# 1.创建并运行容器
docker run -d --name dd -p 8080:8080 docker-demo:1.0
# 2.查看容器
dps
# 结果
CONTAINER ID   IMAGE             PORTS                                                  STATUS         NAMES
78a000447b49   docker-demo:1.0   0.0.0.0:8080->8080/tcp, :::8090->8090/tcp              Up 2 seconds   dd
f63cfead8502   mysql             0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   Up 2 hours     mysql

# 3.访问
curl localhost:8080/hello/count
# 结果:
<h5>欢迎访问黑马商城, 这是您第1次访问<h5>

标签:java,自定义,demo,jar,镜像,docker,Dockerfile
From: https://blog.csdn.net/qq_50684356/article/details/140111836

相关文章

  • 周下载量3000多万的npm包---nanoid(uuid的竞争对手),生产随机字符串,体积更小,可以自定义
    https://www.npmjs.com/package/nanoid体积更小,可以自定义字符集<scriptsetup>import{onMounted}from'vue'import{nanoid,customAlphabet}from'nanoid'onMounted(()=>{letid1=nanoid()console.log(id1)letcustomNanoid......
  • LabVIEW的自定义按钮
    下载几张图片:选用windows风格按钮控件进行自定义,自定义的图片分别放入这6个位置,我们来搞清楚它们的对应关系:(1)当我们设置按钮机械状态为默认(自复位):(2)但我们改变按钮机械状态为按下不自动弹起:其他的几个对应的设置与效果:......
  • BPI-M4 Berry 烧录镜像
    使用balenaEtcher烧录Linux镜像1、准备好要烧录的img,可以在香蕉派的wiki(https://docs.banana-pi.org/en/BPI-M4_Berry/BananaPi_BPI-M4_Berry#_linux_2)下载。(不需要解压,balenaEtcher能识别压缩包,并进行解压)2、下载并安装,后续要使用的软件:balenaEtcher(https://etcher.balena.io/)......
  • 聊聊gitlab ci如何构建以时间为版本号的docker镜像
    前言最近朋友他们部门有部分内部项目,打算用gitlabci来做项目持续集成部署,他们有个需求,构建docker镜像的时候,版本需要是以当前时间作为版本。其格式为yyyymmddhhmm一开始朋友翻阅官方文档,发现gitlabci有个变量CI_COMMIT_TIMESTAMP,可以生成时间戳,他默认生成的格式是ISO-8601。就......
  • Kubernetes Node删除镜像
    目录KubernetesNode删除镜像步骤1:连接到节点步骤2:查看节点上的镜像列表步骤3:删除镜像步骤4:验证删除注意事项结论KubernetesNode删除镜像本篇博客将介绍如何在Kubernetes集群中删除节点上的镜像。Kubernetes是一个开源的容器编排平台,可用于以高效的方式管理容器化......
  • 从这几个优点了解快速自定义表单开发开源
    要实现提质增效的办公,需要应用什么软件平台?可以一起了解低代码技术平台、自定义表单开发开源。它们具有其他平台没有的优势特点,如可视化操作界面、更灵活、好操作、易维护等,因此,在竞争激烈的社会中,得到了各中大型企业的喜爱与支持。本文将罗列它的几个优势特点,让您清楚了解快速自......
  • centos7 docker 配置阿里云镜像加速
    1、安装docker1.1卸载原有dockeryumremovedockerdocker-clientdocker-client-latestdocker-commondocker-latestdocker-latest-logrotatedocker-logrotatedocker-engine1.2 部署docker依赖yuminstall-yyum-utils1.3配置阿里云镜像加速yum-config-manage......
  • WordPress 5.5+ 如何自定义XML 站点地图功能
    关键要点在WordPress5.5中,WordPress将导出一个站点地图索引文件/wp-sitemap.xml。这是主要的XML文件,其中包含WordPress网站公开的所有站点地图页面的列表。该站点地图索引最多可容纳50000个站点地图,单个站点地图最多可容纳2000个条目(可过滤)。默认情况下,将为所有公开和可公开查......
  • ubuntu制作本地镜像(类似yum本地)
     1.原文件备份root@11g:/mnt#cd/etc/apt/root@11g:/etc/apt#cpsources.listbak_sources.list 2.挂载安装盘镜像mkdir-p/media/cdrom/root@11g:/soft/ios#cd/soft/iosroot@11g:/soft/ios#mountubuntu-18.04.6-desktop-amd64.iso-oloop/media/cdrommount:/media......
  • EasyExcel 自定义表头颜色
    publicvoidexport(ObjectDTOdto,HttpServletResponseresponse){try{if(ObjectUtils.isEmpty(dto.getObjNumberList())){thrownewBusinessException("编号不允许为空");}ListRespresult=o......