通过之前的文章我们已经熟悉了Docker的基本操作,当然Docker除了可以帮助我们搭建一些项目所需要的环境以外,还可以帮助我们实现项目的部署,本章我们就来讲解下如何使用Docker进行项目的部署。
1.Dokcerfile是如何实现项目部署的
首先我们要知道Docker的主要操作就是通过下载或制成镜像,然后使用镜像创建容器运行和管理容器来达到一个环境安装部署的。同样的Docker可以帮助我们部署项目也是离不开这两个重要的组件。Docker部署我们的java项目的思路过程也不难,实现过程如下:
(1)通过一定的方式把java项目的部署包(例如:jar文件),制作为Docker镜像文件;
(2)然后使用制作好的镜像文件创建并运行容器,这样java项目自然也就跑起来了。
而上述第一步提到的通过一定的方式常见的就是使用Dockerfile文件来实现了。
2.Dokcerfile文件介绍
Dockerfile 是一个用来构建镜像的文件,里面包含了一系列的组合成镜像文件的指令,Docker通过读取和解析Dockerfile中的指令来构建镜像文件。
2.1Dokcerfile文件介绍和编写
首先我们先创建一个Dockerfile文件,不需要后缀名,如图所示:
然后我们再编写构建镜像的相关指令,Dockerfile文件中的指令一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
因为Dockerfile的很多指令我们构建镜像的时候不需要,所以这里就不再详细介绍了,这里就以jar包构建镜像为例来介绍下构建的相关指令。
FROM指令:指定构建当前镜像需要基于的基础镜像,必须为指令的第一行。这里的“FROM java:8”指的是基于jdk8镜像环境。
MAINTAINER指令:维护者的信息。
VOLUME指令:定义容器挂载目录,这样通过该镜像创建的容器就有了默认挂载目录。这里“VOLUME /tmp”表示容器挂载到主机的目录为 /temp目录。
ADD指令:将本地的文件添加到容器中,这里“ADD eureka-server-1.0.jar app.jar”表示把主机上当前目录下的文件eureka-server-1.0.jar 拷贝到容器中命名为 app.jar。
ENTRYPOINT指令:主要用来配置容器启动时需要运行的一些命令以及命令携带的一些参数,比如我们jar包运行需要调用jdk相关的命令等。
格式如下:
ENTRYPOINT ["executable", "param1", "param2",...]
这里“ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]”表示运行java命令,并且java命令携带了参数“-Djava.security.egd=file:/dev/./urandom”、“-jar”和参数“/app.jar”,这样组合起来就是jar包运行的整个命令了。
EXPOSE指令:只是声明使用的端口,为了让使用者更好的理解这个镜像应该映射端口而已,并不会在启动容器时开启这个端口,当然如果docker run的时候-P没有指定端口,那么会随机指定EXPOSE的端口。
3.使用docker部署项目
我们可以使用jar部署包+Dockerfile文件的命令进行部署java项目。
Docker 通过 docker build命令执行Dockerfile文件里的指令来构建镜像文件,语法如下:
docker build [OPTIONS] PATH
其中参数 OPTIONS 常用参数如下:
l-t或--tag: 镜像的名字及标签,通常 name:tag 或者 name 格式;
可以在一次构建中为一个镜像设置多个标签
l-f或--file: 指定要使用的Dockerfile路径;
PATH 指的是构建的jar和Dockerfile文件所在路径。
我们将准备好的jar包和Dockerfile文件放到同一个目录下,使用docker build命令构建镜像,然后使用docker run的命令创建并运行容器即可,我们也可以将这个过程写成简单的shell脚本,如下:
docker_build.sh
当脚本运行完之后我们可以通过docker logs -f 命令查看项目启动运行情况。
当然对于java项目部署,我们同样可以使用IDEA工具提供的Docker插件配置来进行一键式项目打包、构建镜像、创建和运行容器,但是需要对Docker进行配置CA证书安全访问不然只能在开发环境中使用,不能使用到生产环境中,这个我们会在后面单独来讲一下。