镜像结构
镜像是由应用程序及其需要的系统函数库、环境、配置、依赖打包而成
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
总结:
- Dockerfile的本质是一个文件,通过指令描述镜像的构建过程
- Dockerfile的第一行必须是FROM,从一个基础镜像来构建
- 基础镜像可以是基本操作系统,如Ubuntu。也可以是其他人制作好的镜像,例如:java:8-alpine