Dockerfile自定义镜像
常见的镜像在DockerHub就能找到,但是我们自己写的项目就必须自己构建镜像了。
而要自定义镜像,就必须先了解镜像的结构才行。
镜像结构
镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。
我们以MySQL为例,来看看镜像的组成结构:
简单来说,镜像就是在系统函数库、运行环境基础上,添加应用程序文件、配置文件、依赖文件等组合,然后编写好启动脚本打包在一起形成的文件。
我们要构建镜像,其实就是实现上述打包的过程。
Dockerfile语法
构建自定义的镜像时,并不需要一个个文件去拷贝,打包。
我们只需要告诉Docker,我们的镜像的组成,需要哪些BaseImage、需要拷贝什么文件、需要安装什么依赖、启动脚本是什么,将来Docker会帮助我们构建镜像。
而描述上述信息的文件就是Dockerfile文件。
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。因此每一条指令的内容,就是描述该层应当如何构建。
更新详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder
案例1
基于tomcat创建一个镜像,里面要有一个index.html,并写入Hello Docker。
1、在宿主机创建一空白目录:
mkdir -p /usr/local/docker/demo1
2、在该目录下,创建一文件Dockerfile:
vim Dockerfile
3、其内容为:
FROM tomcat //指定tomcat最新版本镜像
RUN echo 'Hello qfnj Docker'>/usr/local/tomcat/webapps/ROOT/index.html
这个Dockerfile很简单,一共就两行。涉及到了两条指令,FROM和RUN。
4、构建镜像
docker build -t demo1 .
-t :指定要创建的目标镜像名
. :点代表Dockerfile文件所在目录,也就是当前目录,可以指定Dockerfile的绝对路径。
5、运行镜像所在容器
docker run --rm --name demo1-8080 -p 8080:8080 -d demo1
访问浏览器即可成功该问。
案例2
案例:基于上一个镜像(基于tomcat)将ROOT内多余的文件都删除。只保留index.html
1 基于如上修改Dockerfile
FROM tomcat //指定tomcat最新版本镜像
WORKDIR /usr/local/tomcat/webapps/ROOT/ //切换到该目录下
RUN rm -rf * //将当前目录的文件都删掉
RUN echo 'Hello qfnj Docker'>/usr/local/tomcat/webapps/ROOT/index.html
WORKDIR 用来切换工作目录的。而不是用RUN。
2、 构建镜像
docker build –t 镜像名 . //Dockerfile上下文路径
案例3
案例:基于上一个镜像(基于tomcat)外部复制一个文件(图片),并复制到容器中并能访问。
1 基于如上修改Dockerfile
FROM tomcat //指定tomcat最新版本镜像
WORKDIR /usr/local/tomcat/webapps/ROOT/ //切换到该目录下
RUN rm -rf * //将当前目录的文件都删掉
COPY 1.png /usr/local/tomcat/webapps/ROOT/
RUN echo 'Hello qfnj Docker'>/usr/local/tomcat/webapps/ROOT/index.html
2、 构建镜像
docker build –t 镜像名 . //Dockerfile上下文路径
案例4
使用docker部署springboot项目,首先将jar包复制到一个文件夹里边。
1 cd到该目录下
2 新建Dockerfile文件
vim Dockerfile
3 添加命令
FROM java:8
VOLUME /tmp
ADD boot-0.0.1-SNAPSHOT.jar exam.jar
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/exam.jar"]
4 执行构建命令
docker build -t bootdemo .
5 根据镜像构建容器即可访问。