Dockerfile 部署springboot 项目暨保留字指令讲解
- 一、系统环境
- 二、springboot 项目部署
- 2.1 springboot 项目准备
- 2.2 上传jar
- 2.3 编写dockerfile 文件
- 2.4 构建镜像并运行
- 三、保留字讲解
- 3.1 FROM
- 3.2 MAINTAINER 和LABEL
- 3.3 USER
- 3.4 RUN
- 3.5 CMD
- 3.6 ENTRYPOINT
- 3.7 COPY 和ADD
- 3.8 ENV
- 3.9 WORKDIR
- 3.10 EXPOSE
- 3.11 VOLUME
- 3.12 ONBUILD
- 四、总结
一、系统环境
虚拟机系统:CentOS 7.6
已安装环境:MySQL 5.7.35,MongoDB 5.0.2,Redis 6.2.5,Docker 20.10.8,docker-compose 1.29.2
该虚拟机环境继承自 Centos 7 安装系列文章,其中的MySQL、MongoDB、Redis 都来自该系列,还不会的朋友可以参考一下:
Centos 7 安装系列(3):Redis 6.2.5
Centos 7 安装系列(2):MongoDB 5.0.2
Centos 7 安装系列(1):MySQL 5.7.35
那么docker 和docker-compose 呢?这个直接参考菜鸟教程的安装步骤来就可以了,具体文章如下:
CentOS Docker 安装
Docker Compose
二、springboot 项目部署
2.1 springboot 项目准备
首先准备一个简单的springboot 项目,也不需要什么厉害的功能,能做个测试就可以了。
这是我特地新建的项目,只有一个简单的访问然后返回字符串的功能。
项目是建立了,但是我们还是得保证下它能否正常运行,编译运行下,发现是可以的:
那么,下一步就是打包了,mvn package 正常构建一个jar 包备用。
2.2 上传jar
在服务器上新建一个docker 目录,用来存放我们这次的文件:
cd /usr/local/env/
mkdir docker
cd docker/
将打包好的jar 包上传到该目录下。
2.3 编写dockerfile 文件
在命令行界面输入以下命令编写dockerfile 文件:
vi dockerfile
文件内容如下:
FROM java:8
MAINTAINER CBA "000@000.com"
USER root
RUN mkdir -p /usr/local/docker
COPY demo-0.0.1.jar /usr/local/docker/demo-0.0.1.jar
ENV my_path /usr/local/docker
WORKDIR $my_path
ENTRYPOINT ["nohup","java","-jar","/usr/local/docker/demo-0.0.1.jar","&"]
CMD echo "test"
CMD echo "docker test"
EXPOSE 8080
2.4 构建镜像并运行
在命令行界面输入以下命令构建dockerdemo 镜像:
docker build -t dockerdemo:0.1 .
注意:命令的最后有一个英文句号,其表示当前目录。
当出现这样的提示的时候,便表示构建镜像成功。
在命令行界面输入以下命令运行容器demo :
docker run -d --name demo -p 9090:8080 dockerdemo:0.1
其运行结果如下:
可以看到,容器可以正常运行,且也可以正常访问springboot 项目。
使用命令进入demo 容器内:
docker exec -it 6624cd0f0fad /bin/bash
查看当前正在运行的Java 进程:
可以明显的看到,进入容器时的默认路径是**/usr/local/docker**,容器启动时的执行命令是java -jar /usr/local/docker/demo-0.0.1.jar & /bin/sh -c echo “docker test” 。具体的含义请看下文讲解。
三、保留字讲解
3.1 FROM
FROM 命令可能是最重要的Dockerfile 命令。该命令定义了使用哪个基础镜像启动构建流程。基础镜像可以为任意镜像。如果基础镜像没有被发现,Docker 将试图从Docker image index 来查找该镜像。
FROM命令必须是Dockerfile的首个命令。
FROM java:8
3.2 MAINTAINER 和LABEL
这个命令用于声明镜像的作者与其邮箱,理论上它可以放置于Dockerfile 的任意位置,但是为了阅读方便,推荐还是放在FROM 的后面。
MAINTAINER CBA “000@000.com”
与之有类似功能的命令是LABEL,但是LABEL 更加灵活,其可以设置任何需要设置的元数据,并且可以轻松查看,例如我们可以使用以下命令替换MAINTAINER 命令:
LABEL maintainer=“CBA”
3.3 USER
USER 指令设置运行镜像时要使用的用户名(或 UID)以及可选的用户组(或 GID),默认是root 用户。但是在为用户指定组时,用户将仅具有指定的组成员身份,任何其它已配置的组成员身份将被忽略。
USER root
3.4 RUN
RUN指令会在前一条命令创建出的镜像的基础上创建一个容器,并在容器中运行命令,在命令结束运行后提交容器为新镜像,新镜像被Dockerfile中的下一条指令使用。
RUN mkdir -p /usr/local/docker
3.5 CMD
CMD指令有3种格式。
- CMD < command> (shell格式)
- CMD [“executable”, “param1”, “param2”] (exec格式,推荐使用)
- CMD [“param1”, “param2”] (为ENTRYPOINT指令提供参数)
在使用shell 和exec 格式时,命令在容器中的运行方式与RUN指令相同。
但是,RUN指令在构建镜像时执行命令,并生成新的镜像;CMD指令在构建镜像时并不执行任何命令,而是在容器启动时默认将CMD指令作为第一条执行的命令。
如果用户在命令行界面运行docker run 命令时指定了命令参数,则会覆盖CMD 指令中的命令。
一个Dockerfile 中可以有多条CMD 指令,但只有最后一条CMD 指令有效。
CMD echo “test”
CMD echo “docker test”
3.6 ENTRYPOINT
ENTRYPOINT指令有两种格式。
- ENTRYPOINT < command> (shell格式)
- ENTRYPOINT [“executable”, “param1”, “param2”] (exec格式,推荐格式)
ENTRYPOINT 指令和CMD 类似,它也可用户指定容器启动时要执行的命令。
但如果dockerfile 中也有CMD 指令,CMD 中的参数会被附加到ENTRYPOINT 指令的后面。
如果这时docker run 命令带了参数,这个参数会覆盖掉CMD 指令的参数,并也会附加到ENTRYPOINT 指令的后面。
可以看出,相对来说ENTRYPOINT 指令优先级更高。
ENTRYPOINT [“java”,"-jar","/usr/local/docker/demo-0.0.1.jar"]
3.7 COPY 和ADD
ADD 指令的功能是将主机构建环境(上下文)目录中的文件和目录、以及一个URL 标记的文件 拷贝到镜像中。
- 如果源是个归档文件(压缩文件),则docker 会自动解压。
- 如果源是一个URL,那该URL 的内容将被下载并复制到容器中,下载后的文件权限自动设置为600 。
- 如果目标路径不存在,则会自动创建目标路径。
COPY 指令和ADD 指令功能和使用方式类似,但是COPY 只支持本地文件且不会做自动解压工作。
COPY demo-0.0.1.jar /usr/local/docker/demo-0.0.1.jar
3.8 ENV
ENV 指令用来在镜像构建过程中设置环境变量,这些变量会永久地保存到该镜像创建的任何容器中。
通过ENV 定义的环境变量,可以被后面的所有指令中使用,但不能被docker run 的命令参数引用。
ENV my_path /usr/local/docker
3.9 WORKDIR
WORKDIR 指令用于指定容器的一个目录, 容器启动时所有执行的命令会在该目录下执行。如果这个工作目录不存在,则会自动创建一个。
WORKDIR 指令可在dockerfile 中多次使用。如果提供了相对路径,则它将相对于上一个WORKDIR 指令的路径。例如:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
输出结果是 /a/b/c。
3.10 EXPOSE
EXPOSE 指令声明docker 容器在运行时侦听的网络端口。也可以指定端口是侦听协议是TCP 还是UDP,如果未指定协议,则默认值为TCP。
这个指令仅仅是声明容器打算使用什么端口而已,并不会自动在宿主机进行端口映射,尽管它可以这么做,但这个做法并不值得推荐。
EXPOSE 8080
3.11 VOLUME
通过dockerfile 的 VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点。其作用与使用docker run -v 命令相同。
但是通过这种方式创建的挂载点,无法指定主机上对应的目录,是自动生成的。
3.12 ONBUILD
当我们在一个dockerfile 文件中加上ONBUILD指令,该指令对利用该dockerfile构建镜像(比如为A镜像)不会产生实质性影响。
但是当我们编写一个新的dockerfile 文件来基于A 镜像构建一个镜像(比如为B镜像)时,这时构造A 镜像的dockerfile 文件中的ONBUILD 指令就生效了,在构建B 镜像的过程中,首先会执行ONBUILD 指令指定的指令,然后才会执行其它指令。
四、总结
好了,本文到此截至,主要介绍了如何使用dockerfile 构建镜像以部署springboot 项目,并介绍了dockerfile 中的保留字指令的用途。
我是陈冰安,一个学习者。欢迎关注我的公众号【暗星涌动】,愿与你一同进步。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)