常见的镜像在DockerHub就能找到,但是我们自己写的项目(比如SpringBoot项目)就必须自己构建镜像了。
而要自定义镜像,就必须先了解镜像的结构
镜像结构简单来说,镜像就是在系统函数库、运行环境基础上,添加应用程序文件、配置文件、依赖文件等组合,然后编写好启动脚本打包在一起形成的文件。
我们以MySQL为例,来看看镜像的组成结构:
我们要构建镜像,其实就是实现上述分层并打包的过程。
Dockerfile语法构建自定义的镜像时,并不需要一个个文件去拷贝,打包。
我们只需要告诉Docker,我们的镜像的组成,需要哪些BaseImage、需要拷贝什么文件、需要安装什么依赖、启动脚本是什么,将来Docker会帮助我们构建镜像。
而描述上述信息的文件就是Dockerfile文件
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。
更新详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder
构建Java项目 基于Ubuntu/Centos构建Java项目需求:基于Ubuntu镜像构建一个新镜像,运行一个java项目
这个意思是在你的虚拟机/服务器上先创建一个ubuntu/centos镜像, 在基于这个镜像创建java镜像, 和你虚拟机本身是什么系统无关
-
新建一个空文件夹docker-demo
-
拷贝课前资料中的docker-demo.jar, jdk8.tar.gz, Dockerfile 三个文件到docker-demo目录下
其中Dockerfile文件的内容如下:
# 指定基础镜像 FROM centos:7 # 配置环境变量,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
Dockerfile里设置的这些目录(如RUN, ENV)都是dokcer镜像里的目录, 不是我们虚拟机里的目录
COPY的目录: 前一个目录是虚拟机的目录, 后一个是docker镜像里的目录
-
将准备好的docker-demo上传到虚拟机/服务器任意目录,然后进入docker-demo目录下
-
构建docker镜像"javaweb":
docker build -t javaweb:1.0 .
javaweb是镜像名称, 1.0是镜像版本(随便填), 后面是路径, 点’.'表示当前目录
java项目的docker镜像就构建成功了(只是构建没有运行), 通过docker images可以查看
-
创建容器"mj"运行镜像"javaweb":
docker run --name mj -p 8090:8090 -d javaweb
通过docker -ps 查看正在运行的容器:
通过 http://192.168.150.101:8090/hello/count可以访问到,其中的ip改成你的虚拟机ip
虽然我们可以基于Ubuntu基础镜像,添加任意自己需要的安装包,构建镜像,但是却比较麻烦。所以大多数情况下,我们都可以在一些安装了部分软件的基础镜像上做改造。
例如,构建java项目的镜像,可以在已经准备了JDK的基础镜像基础上构建, 这个基础镜像名叫java:8-alpine
实现思路如下:
-
新建一个空的目录,然后在目录中新建一个文件,命名为Dockerfile
-
拷贝课前资料提供的docker-demo.jar到这个目录中
-
编写Dockerfile文件, 内容有下面几点:
-
基于java:8-alpine作为基础镜像
-
将app.jar拷贝到镜像中
-
暴露端口
-
编写入口ENTRYPOINT
最后Dockerfile内容如下(省略了前面配置jdk的步骤):
FROM java:8-alpine COPY ./app.jar /tmp/app.jar EXPOSE 8090 ENTRYPOINT java -jar /tmp/app.jar
-
-
使用docker build命令构建镜像
docker build -t javaweb:1.0 .
-
使用docker run创建容器并运行


![[Docker笔记-3] Dockerfile [Docker笔记-3] Dockerfile](http://www.mshxw.com/aiimages/31/862165.png)
