1.pom.xml添加Docker依赖
<properties>
<docker.image.prefix>ramer</docker.image.prefix>
</properties>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.11</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
注意:在添加docker插件时,可能会出现安装不了的情况,这是因为 com.spotify插件没在maven白名单中,在setting.xml文件中添加:
<pluginGroups>
<pluginGroup>com.spotify</pluginGroup>
</pluginGroups>
2.容器化应用
在项目目录src/main下新建文件夹,创建Dockerfile文件(该文件没有后缀): src/main/docker/Dockerfile,内容如下
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD home-page-interface-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 9090
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
Dockerfile文件语法说明
FROM:
指定了当前镜像继承的基础镜像。
文件中:表示使用 Jdk8 环境 为基础镜像,如果镜像不是本地的会从 DockerHub 进行下载。
VOLUME:
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
Volume设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。我们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令。
ADD:
从当前工作目录复制文件到镜像目录中去。
EXPOSE:
EXPOSE
指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在Dockerfile
中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是docker run -P
时,会自动随机映射EXPOSE
的端口。
要将EXPOSE
和在运行时使用-p <宿主端口>:<容器端口>
区分开来。-p
,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问,而EXPOSE
仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。
ENTRYPOINT:
配置容器启动时自动执行的命令。
这里:为了缩短 Tomcat 的启动时间,添加java.security.egd
的系统属性指向/dev/urandom
作为 ENTRYPOINT。
3. 创建docker镜像
在cmd.exe中进入自己项目的目录:执行mvn package -Dmaven.test.skip=true docker:build
这里要确保已经将maven添加到path环境变量中,并且已经开启docker。
4. 运行docker容器
docker run --name=docker-demo -p 9090:9090 -t ramer/demo
运行后,会在cmd.exe中出现标志性的springboot启动标志,表示启动完成。此时可以在浏览器等访问项目。
5. 启动/关闭/重启/删除docker容器
cmd: docker start/stop/restart/rm CONTAINER_ID/NAME
其中:
CONTAINER_ID: 是容器id,执行 docker ps 可查看
NAME: 是容器的名称,也就是docker run –name后面的名字