镜像结构

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

Dockerfile语法

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

指令

说明

示例

FROM

指定基础镜像

FROM centos:6

ENV

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

ENV key value

COPY

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

COPY ./mysql-5.7.rpm /tmp

RUN

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

RUN yum install gcc

EXPOSE

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

EXPOSE 8080

ENTRYPOINT

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

ENTRYPOINT java -jar xx.jar

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

构建Java项目

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

步骤1:在虚拟机/云服务器新建一个空文件夹docker-demo                                                              步骤2:拷贝课前资料中的docker-demo.jar文件到docker-demo这个目录                                      步骤3:拷贝课前资料中的jdk8.tar.gz文件到docker-demo这个目录                                                步骤4:拷贝课前资料提供的Dockerfile到docker-demo这个目录                                                    步骤5:进入docker-demo                                                                                                                步骤6:运行命令:

docker build -t javaweb:1.0

-t:tag版本号的意思,后面跟上 镜像名:版本号

最后访问 http://虚拟机ip:8090/hello/count


优化后:基于java:8-alpine镜像(优化了Dockerfile文件中的指令),将一个Java项目构建为镜像

  

# 基于Ubuntu镜像下的Dockerfile文件
# 指定基础镜像
 FROM ubuntu:16.04# 配置环境变量,JDK的安装目录
 ENV JAVA_DIR=/usr/local# 拷贝jdk和java项目的包
 COPY ./jdk8.tar.gz $JAVA_DIR/ # 安装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 #拷贝java项目的包
 COPY ./docker-demo.jar /tmp/app.jar
 # 暴露端口
 EXPOSE 8090
 # 入口,java项目的启动命令
 ENTRYPOINT java -jar /tmp/app.jar
                                       

                                                 # 基于java:8-alpine镜像的Dockerfile文件
# 指定基础镜像
 FROM java:8-alpine
#拷贝java项目的包
 COPY ./docker-demo.jar /tmp/app.jar # 暴露端口
 EXPOSE 8090
 # 入口,java项目的启动命令
 ENTRYPOINT java -jar /tmp/app.jar

 我们可以发现拷贝java项目之前的指令都是在安装JDK,那我们每一次构建微服务是都要执行完整的流程,且前面的流程都是不会变的。

所以,我们就将前面安装JDK的流程构建好做一个镜像。就是我们这里用到的java:8-alpine镜像

将更新后的Dockerfile文件将之前的Dockerfile文件覆盖后再次运行该java项目

docker build -t javaweb:2.0


总结:

  1. Dockerfile的本质是一个文件,通过指令描述镜像的构建过程
  2. Dockerfile的第一行必须是FROM,从一个基础镜像来构建
  3. 基础镜像可以是基本操作系统,如Ubuntu。也可以是其他人制作好的镜像,例如:java:8-alpine