Docker(二):部署springboot项目

Dockerfile概述

Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。

Docker可以通过读取来自 Dockerfile的指令自动构建镜像。 Dockerfile是一个文本文档,其中包含用户可以在命令行上调用、组合容器的所有命令。使用docker build 可以构建连续执行的多个指令集。

接下来用一个简单的示例来感受一下 Dockerfile 是如何用来构建镜像启动容器。我们以docker部署springboot项目为例。

准备springboot项目

首先我们通过spring initializr来构建一个springboot工程,只添加了一个HelloController,代码如下:

1
2
3
4
5
6
7
@RestController
public class HelloDockerController {
@RequestMapping("/hello")
public String hello() {
return "hello, " + LocalDateTime.now();
}
}

可以使用docker构建插件来构建镜像,可以查考纯洁的微笑的博客来构建,这里我们直接将springboot工程打成jar包,来构建docker镜像。

首先将之前构建的springboot工程打包,这样我们就得到了一个hello-docker-0.0.1-SNAPSHOT.jar,然后我们再准备一个Dockerfile,内容如下

1
2
3
4
FROM java:8
VOLUME /tmp
ADD hello-docker-0.0.1-SNAPSHOT.jar hello-docker.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/hello-docker.jar"]

其中

  • FROM ,表示使用 Jdk8 环境 为基础镜像,如果镜像不是本地的会从 DockerHub 进行下载
  • VOLUME ,VOLUME 指向了一个/tmp的目录,由于 Spring Boot 使用内置的Tomcat容器,Tomcat 默认使用/tmp作为工作目录。这个命令的效果是:在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录
  • ADD ,拷贝文件并且重命名
  • ENTRYPOINT ,为了缩短 Tomcat 的启动时间,添加java.security.egd的系统属性指向/dev/urandom作为 ENTRYPOINT

构建镜像

1
docker build -t image-name .

然后我们通过docker images就能看见我们制作的docker镜像

1
2
3
4
5
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-docker latest 417dca81c225 8 minutes ago 672 MB
docker.io/mysql 5.7 563a026a1511 2 weeks ago 372 MB
docker.io/nginx latest c82521676580 2 months ago 109 MB
docker.io/java 8 d23bdf5b1b1b 20 months ago 643 MB

这样我们可以启动该镜像

1
docker run -p 8080:8080 -t hello-docker

如果出现了端口映射错误,可以暂时关闭防火墙systemctl stop firewalld.service,然后重启docker服务service docker restart,重新启动镜像即可。

通过docker ps可以查看正在运行的项目

1
2
3
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
caa44939f959 hello-docker "java -Djava.secur..." 14 seconds ago Up 13 seconds 0.0.0.0:8080->8080/tcp trusting_brattain
f80f9ed36b71 mysql:5.7 "docker-entrypoint..." 7 days ago Up 2 hours 0.0.0.0:3306->3306/tcp, 33060/tcp mysql-dev

然后通过访问http://your-ip:8080/hello,返回

1
hello, 2018-09-25T13:38:53.246

即部署成功。

参考

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×