Dockerfile自定义镜像

 

一、镜像结构

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

以MySQL为例:

 

 

如上图所示,镜像由多个层(Layer)构成,每个层包含不同的内容。

另外,某些层可以单独抽出,组成一个镜像,作为其他自定义镜像的基础镜像来使用

而,每执行 Dockerfile 中一条命令,则会形成一个层(Layer)

 

二、Dockerfile

1. 什么是 Dockerfile

  它本质上是一个无扩展名的文本文件,其中包含构建镜像所需的指令每个指令执行后都会形成一个层

 

2. 基本指令

 

 

 更新详细语法说明,请参考:官网文档

 

三、示例:基于 Ubuntu 构建自定义 Java 项目镜像

1. 在 Linux 系统中 创建一个目录,此处目录名以 docker-demo 为例

mkdir docker-demo

 

2. 将构建 Java 项目镜像所需的文件 copy 到 docker-demo 中

此处用到了:

  1. jdk8.tar.gz
  2. docker-demo.jar
  3. Dockerfile

其中,1 为 jdk 安装包,2 为一个 SpringBoot 项目编译成的 jar 包,3 为自定义的 Dockerfile。

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 -f [dockerfile文件路径及名称] -t javaweb:1.0 .

-f:指定构建镜像的 dockerfile 文件

-t:指定镜像 Tag,如上命令中的 javaweb:1.0  。再次强调,tag 由两部分组成,名称:版本

最后一个 “ . ” :表示当前目录,注意,与当前指定的 Tag 之间有个空格

 

四、基于 Java8 镜像构建 Java 项目

  上个示例基于Ubuntu基础镜像构建自定义镜像,需要自己构建 JDK 相关内容,略显麻烦。所以大多数情况下,我们可以基于一个安装好 JDK 的镜像之上,来构建自定义镜像。

  例如,java:8-alpine 镜像就是一个他人基于基础镜像(操作系统)构建好的JDK镜像,假如我们以此为基础镜像构建自定义镜像,则可以省略 JDK 安装步骤。

  Dockerfile 将简化成这样:

# 指定基础镜像
FROM java:8-alpine

# 拷贝java项目的包(为什么要考虑一下java包暂不理解,可能构建镜像后,使用的java包会被删除,或者说挪到构建的镜像中,待验证)
COPY ./docker-demo.jar /tmp/app.jar

# 暴露端口
EXPOSE 8090

# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

  接下来再次使用构建镜像的命令来构建镜像即可。

 

posted @ 2021-11-24 22:05    阅读(62)  评论(0编辑  收藏  举报