要自定义镜像首先要了解什么是镜像
将镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。镜像是分层结构,每一层称为一个Layer,Entrypoint和BaseImage为基础层,一般一个镜像都包括这两层,其余为其他层
image.png
什么是Dockerfile
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer
image.png
image.png
更新详细语法说明,参阅官方文档:https://docs.docker.com/engine/reference/buider
实践案例
- 编辑Dockerfile
#指定基础镜像
FROM ubuntu:16.04
#配置环境变量,JDK的安装目录
ENV JAVA_DIR=/user/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 8080
#入口,java项目的启动命令(就是运行该镜像时要执行的命令)
ENTRPYPOINT java -jar /tmp/app.jar
- 构建镜像
docker build -t javaweb:1.0 <Dockerfile文件目录>
思考
在Dockerfile中有一大部分是配置java jdk的运行环境的,如果我们有很多个镜像,都需要做同样的一件事,那就很傻瓜了,这就有一个官方镜像帮我们配置好了java运行环境,他就是java:8-alpine镜像,使用它作为自定义镜像的基础镜像,可以省去Dockerfile的一大半命令
#指定java:8-alpine为基础镜像
FROM java:8-alpine
#拷贝java项目
COPY ./docker-demo.jar /tmp/app.jar
#暴露端口(只是给使用者查看用)
EXPOSE 8080
#入口,java项目的启动命令
ENTRPYPOINT java -jar /tmp/app.jar