Dockerfile简介
-
Dokcerfile的作用
Dockerfile用来构建一个镜像。
Dokcerfile也叫镜像构建文件或镜像描述文件。 -
Dokcer的使用架构图
-
Docker构建镜像原理
- 先在一个空目录下创建一个Dockerfile文件
执行build命令 - Docker打包当前目录下的所有文件。当前目录被称为上下文目录(context)。
- 逐行执行命令,每一行命令生成一个镜像文件,被称为临时镜像文件,保持在docker cache中。临时镜像文件的作用是方便下次执行快速 生成。可以指定 --no-cache 不使用临时镜像。
- 执行最后一行命令时才生成一个最终的镜像文件
结构如下
- 先在一个空目录下创建一个Dockerfile文件
Dockerfile使用
-
创建一个目录
创建一个存放dockerfile的目录
mkdir dockerfiles -
创建dockerfile文件
建议文件名就叫Dockerfile -
FROM指令
第一行必须是FROM指令,且必须大写
格式为- FROM 镜像名 --latest版本
- FROM 镜像名:tag --指定tag
- FROM 镜像名:@<摘要>
创建一个最基本的Dockerfile
vim Dockerfile
输入下列内容并保存
FROM centos:7
-
构建镜像
docker build -t mycentos7:01 ./
-t 后面的参数表示镜像名和tag
./ 表示当前目录 需要注意这个目录下的所有文件都将打包为镜像,所以无关文件不要放在该目录下。也可以添加 .dockerignore 文件来指定要过滤的文件
此时会生成一个镜像
镜像生成完成 -
交互模式启动一个容器
docker run -it 镜像名称:tag
该命令可以直接进入到容器中,并阻塞容器关闭
以上面创建的镜像为例
docker run -it mycentos7:01
exit 命令退出容器 -
RUN 命令
上面构建的mycentos7:01 镜像没有vim指令
在Dockerfile中添加RUN命令安装vim功能FROM centos:7 RUN yum -y install vim
重新构建一个镜像
docker build -t mycentos7:02 ./
再以交互模式运行一个容器
docker run -it mycentos7:02
此时可以在容器中使用vim命令 -
EXPOSE 命令
指定容器要暴露出来的端口FROM centos:7 RUN yum -y install vim EXPOSE 8080 EXPOSE 9090
只有暴露了容器的端口,在启动容器时才能通过 -p 参数映射宿主机端口
-
WORKDIR 命令
指定进入容器时目录路径FROM centos:7 RUN yum -y install vim EXPOSE 8080 EXPOSE 9090 WORKDIR /data
如果 /data 路径不存在 将自动创建,此时再进入容器时的落脚点就是 /data 路径
还有一种指定相对路径的方式FROM centos:7 RUN yum -y install vim EXPOSE 8080 EXPOSE 9090 WORKDIR /data WORKDIR aa
上面的 aa 路径是相对于 /data 目录的,此时再进入该镜像生成的容器时的落脚点就是 /data/aa
-
COPY 命令
拷贝文件到容器中
先在Dockerfile同目录中创建一个 a1.txt 并随便添加一些内容FROM centos:7 RUN yum -y install vim EXPOSE 8080 EXPOSE 9090 WORKDIR /data WORKDIR aa COPY a1.txt /data/aa
再创建镜像 并运行一个容器。进入的是 /data/aa目录,目录中有a1.txt文件,文件内容和宿主机中的内容一样
-
ADD 命令
ADD 命令有和COPY相同的功能
同时ADD命令有解压缩包的功能FROM centos:7 RUN yum -y install vim EXPOSE 8080 EXPOSE 9090 WORKDIR /data WORKDIR aa ADD apache-tomcat-8.5.64.tar.gz /data/aa
此时再创建镜像并运行一个容器,将在 /data/aa目录下存在apache-tomcat-8.5.64.tar.gz文件
ADD 命令还可以通过URL地址下载,但下载的压缩包不会自动解压
FROM centos:7 RUN yum -y install vim EXPOSE 8080 EXPOSE 9090 WORKDIR /data WORKDIR aa ADD https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-8/v8.5.64/bin/apache-tomcat-8.5.64.tar.gz /data/aa RUN tar -zvxf apache-tomcat-8.5.64.tar.gz RUN mv apache-tomcat-8.5.64.tar.gz tomcat WORKDIR tomcat
上面的Dockerfile创建的镜像在运行为一个容器时,会直接进入到tomcat路径下
此时做一个试验,把上面最后一行换成 RUN cd tomcat 是不是一样的效果呢?
试验结果表明并不会进入到 tomcat目录,因为 RUN 命令是在构建镜像是执行的,和运行容器时是两回事 -
VOLUME 命令
指定容器可以挂载出来的目录
当镜像中没有使用VOLUME命令指定可以挂载的目录,而在启动容器时使用-v参数指定了数据卷,将挂载不成功FROM centos:7 RUN yum -y install vim EXPOSE 8080 EXPOSE 9090 WORKDIR /data WORKDIR aa ADD https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-8/v8.5.64/bin/apache-tomcat-8.5.64.tar.gz /data/aa RUN tar -zvxf apache-tomcat-8.5.64.tar.gz RUN mv apache-tomcat-8.5.64.tar.gz tomcat WORKDIR tomcat VOLUME /data/aa/tomcat/webapps
此时可以使用-v参数挂载容器中的 /data/aa/tomcat/webapps 目录
-
ENV 命令
指定环境变量 在使用环境变量时要加 $前缀FROM centos:7 RUN yum -y install vim EXPOSE 8080 EXPOSE 9090 WORKDIR /data WORKDIR aa ENV BASE_DIR /data/aa ADD https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-8/v8.5.64/bin/apache-tomcat-8.5.64.tar.gz $BASE_DIR RUN tar -zvxf apache-tomcat-8.5.64.tar.gz RUN mv apache-tomcat-8.5.64.tar.gz tomcat WORKDIR tomcat VOLUME $BASE_DIR/tomcat/webapps
-
ENTRYPOINT 命令
执行一条linux指令FROM centos:7 RUN yum -y install vim EXPOSE 8080 EXPOSE 9090 WORKDIR /data WORKDIR aa ENV BASE_DIR /data/aa ADD https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-8/v8.5.64/bin/apache-tomcat-8.5.64.tar.gz $BASE_DIR RUN tar -zvxf apache-tomcat-8.5.64.tar.gz RUN mv apache-tomcat-8.5.64.tar.gz tomcat WORKDIR tomcat VOLUME $BASE_DIR/tomcat/webapps ENTRYPOINT ls /data/aa/tomcat
ENTRYPOINT指令将屏蔽掉 -it 交互模式
ENTRYPOINT指令可以有多条
可以在运行容器时替换掉 ENTRYPOINT 指定的指令
docker run --entrypoint=ls mycentos7:09 ls /data/aa
docker run --entrypoint=echo mycentos7:09 echo “hello” -
CMD 命令
和ENTRYPOINT命令一样也是执行一条linux指令
但是当写了多条CMD命令时,只有最后一条生效FROM centos:7 RUN yum -y install vim EXPOSE 8080 EXPOSE 9090 WORKDIR /data WORKDIR aa ENV BASE_DIR /data/aa ADD https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-8/v8.5.64/bin/apache-tomcat-8.5.64.tar.gz $BASE_DIR RUN tar -zvxf apache-tomcat-8.5.64.tar.gz RUN mv apache-tomcat-8.5.64.tar.gz tomcat WORKDIR tomcat VOLUME $BASE_DIR/tomcat/webapps CMD ls /data/aa/tomcat
在启动容器时可以替换掉CMD指定的命令
docker run mycentos7:10 ls /data/aa/tomcat/webapps
docker run mycentos7:10 echo “hello”
CMD命令也会屏蔽掉 -it 交互模式 -
ENTRYPOINT与CMD配合使用
ENTRYPOINT指定不变的命令
CMD指定可变的参数
但是必须以JSON数组的方式传参FROM centos:7 RUN yum -y install vim EXPOSE 8080 EXPOSE 9090 WORKDIR /data WORKDIR aa ENV BASE_DIR /data/aa ADD https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-8/v8.5.64/bin/apache-tomcat-8.5.64.tar.gz $BASE_DIR RUN tar -zvxf apache-tomcat-8.5.64.tar.gz RUN mv apache-tomcat-8.5.64.tar.gz tomcat WORKDIR tomcat VOLUME $BASE_DIR/tomcat/webapps ENTRYPOINT ["ls"] CMD ["/data"]
以默认方式启动 docker run mycentos7:11,会输出 /data 目录下的内容
以 docker run mycentos7:11 /data/aa/tomcat ,会输出 /data/aa/tomcat 目录下的内容,此时并没有指定 ls 这个指令
Dockerfile构建SpringBoot应用
-
创建Springboot项目并打成jar包
先准备好要运行的jar包,设置好程序运行的端口。该程序提供一个 /hello 接口,随意输出一些内容。 -
选择基础镜像
这里运行的是jar文件,所以依赖jre的镜像
在dockerhub官网上搜索 java,点进去的是openjdk。如果搜索JDK,显示的是OracleJDK,这是收费版本。这里使用的是openjdk:8-jre镜像 -
创建Dockerfile文件
先创建一个空目录 mkdir proj_docker
上传jar包到 proj_docker 目录中
编写 Dockerfile 文件FROM openjdk:8-jre #基于openjdk:8-jre构建 WORKDIR /apps #容器的工作目录,也是进入容器时的落脚点目录 ADD my-usestarter-0.0.1-SNAPSHOT.jar app.jar #拷贝jar包到容器中的 /apps 工作目录 并改名 EXPOSE 8080 #暴露8080端口 ENTRYPOINT ["java","-jar"] #执行jar包启动命令 CMD ["app.jar"] #指定jar包的名字
-
构建镜像
docker build -t myapp:01 . -
运行容器
docker run -d -p 8080:8080 myapp:01 -
验证
在外部访问 http://ip:8080/hello 可正常返回内容,表示镜像创建成功
IDEA安装Docker插件和配置远程服务器连接
- 安装Docker插件
直接在idea插件管理界面搜索安装 Docker 插件
安装完成后,在项目路径下创建一个Dockerfile文件
在文件中编写Docker命令时会有提示,表示插件安装成功 - 配置远程服务器连接
点击菜单栏的 Tools->Deployement->Browse Remote Host
在配置远程连接信息
配置成功后可以获取到远程服务器的文件列表
此后就可以直接在Idea上面编写Dockerfile文件和上传jar包文件到服务器上 - 注意的地方
在idea上编写完Dockerfile文件后,还要做一个同步的操作,才能把Dockerfile同步到服务器上
- 生成镜像
最后就可以在服务器上通过命令生成镜像了。减少了向服务器上传的步骤和增加了Dockerfile命令的提示。