一、SpringBoot配置
在项目src/main中创建docker目录:
- Dockerfile内容:
# 指定以openjdk:8-jre 为基础镜像,来构建此镜像,可以理解为运行的需要基础环境
FROM openjdk:8-jre
# 创建挂载点
VOLUME /tmp
# 将当前nevo-register.jar 复制到容器根目录下
ADD nevo-register.jar nevo-register.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/nevo-register.jar"]
或
# 基于openjdk:8
FROM openjdk:8
# 指定当前操作目录
WORKDIR /work/project
# 容器启动后执行的操作
CMD java -jar nevo-register.jar
pom.xm插件
<!--docker-maven-plugin插件(带Dockerfile文件)-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<imageName>${project.name}:${project.version}</imageName>
<!--Dockerfile文件位置-->
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
- Docker插件
# docker构建
mvn clean package docker:build
# 跳过测试
mvn docker:build -Dmaven.test.skip
- 执行shell运行镜像
docker images | grep nevo-register
echo "启动容器----->"
docker run -d -p 8001:9001 nevo-register
echo "启动服务成功!"
当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。
本地主机的 49155 被映射到了容器的 5000 端口。
二、创建任务
-
创建一个Maven项目
-
源码管理
-
项目构建
clean package -pl nevo-register -am -Dmaven.test.skip=true
-
构建后执行脚本
简单构建
# 切换到模块目录
cd /var/lib/jenkins/workspace/nevo-register-test/nevo-register
# 只执行 build 操作
mvn clean package docker:build
# 执行 build 完成后 push 镜像
mvn clean package docker:build -DpushImage
[root@localhost nevo-register]# docker images
# 先删除之前的容器
docker ps -a | grep nevo-register | awk '{print $1}'| xargs docker rm -f
# 删除之前的镜像
docker rmi nevo-register
# 构建镜像
mvn clean package docker:build
# 打印当前镜像
echo "当前 docker 镜像"
docker images | grep nevo-register
# 启动容器
docker run -p 8001:9003 -d nevo-register
# 打印当前容器
docker ps -a | grep nevo-register
echo "服务启动成功!"
查看镜像:
[root@localhost ~]# docker images
三、发布镜像到仓库
附:
- 将可运行的jar包 制作成docker image镜像
DockerFile:
# 指定以openjdk:8-jre 为基础镜像,来构建此镜像,可以理解为运行的需要基础环境
FROM openjdk:8-jre
#
VOLUME /tmp
# 将当前nevo-register.jar 复制到容器根目录下
ADD nevo-register.jar nevo-register.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/nevo-register.jar"]
增加了一个VOLUME指向”/tmp”,因为那是Spring Boot应用程序为Tomcat创建的默认工作目录。
作用是在你的主机”/var/lib/docker”目录下创建一个临时的文件,并且链接到容器中的”/tmp”目录。
ADD nevo-register.jar nevo-register.jar 打包最终的成包名称,别名为nevo-register.jar,ENTRYPOINT 执行项目 nevo-register.jar。为了缩短 Tomcat 启动时间,添加一个系统属性指向 “/dev/urandom” 作为 Entropy Source。
- Dockerfile 指令 VOLUME:
1)容器是基于镜像创建的,最后的容器文件系统包括镜像的只读层+可写层,容器中的进程操作的数据持久化都是保存在容器的可写层上。一旦容器删除后,这些数据就没了,除非我们人工备份下来(或者基于容器创建新的镜像)。能否可以让容器进程持久化的数据保存在主机上呢?这样即使容器删除了,数据还在。
2)当我们在开发一个web应用时,开发环境是在主机本地,但运行测试环境是放在docker容器上。
这样的话,我在主机上修改文件(如html,js等)后,需要再同步到容器中。这显然比较麻烦。
3)多个容器运行一组相关联的服务,如果他们要共享一些数据怎么办?
对于这些问题,我们当然能想到各种解决方案。而docker本身提供了一种机制,可以将主机上的某个目录与容器的某个目录(称为挂载点、或者叫卷)关联起来,容器上的挂载点下的内容就是主机的这个目录下的内容,这类似linux系统下mount的机制。 这样的话,我们修改主机上该目录的内容时,不需要同步容器,对容器来说是立即生效的。 挂载点可以让多个容器共享。
通过dockerfile的 VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点。
还有一个区别是,通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。
#test
FROM ubuntu
MAINTAINER hello1
VOLUME ["/data1","/data2"]
上面的dockfile文件通过VOLUME指令指定了两个挂载点 /data1 和 /data2.
我们通过docker inspect 查看通过该dockerfile创建的镜像生成的容器,可以看到如下信息
"Mounts": [
{
"Name": "d411f6b8f17f4418629d4e5a1ab69679dee369b39e13bb68bed77aa4a0d12d21",
"Source": "/var/lib/docker/volumes/d411f6b8f17f4418629d4e5a1ab69679dee369b39e13bb68bed77aa4a0d12d21/_data",
"Destination": "/data1",
"Driver": "local",
"Mode": "",
"RW": true
},
{
"Name": "6d3badcf47c4ac5955deda6f6ae56f4aaf1037a871275f46220c14ebd762fc36",
"Source": "/var/lib/docker/volumes/6d3badcf47c4ac5955deda6f6ae56f4aaf1037a871275f46220c14ebd762fc36/_data",
"Destination": "/data2",
"Driver": "local",
"Mode": "",
"RW": true
}
],
可以看到两个挂载点的信息。
ENTRYPOINT 指令
ENTRYPOINT 的格式和 RUN 指令格式一样,分为 exec 格式和 shell 格式。WORKDIR指令
用来指定当前工作目录(或者称为当前目录)
当使用相对目录的情况下,采用上一个WORKDIR指定的目录作为基准
相当与cd 命令,但不同的是指定了WORKDIR后,容器启动时执行的命令会在该目录下执行docker build 构建镜像
在pom.xml中引入插件(不使用Dockerfile文件)
<!-- docker-maven-plugin插件(不带Dockerfile文件) -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<!--用于指定镜像名称-->
<imageName>${project.name}:${project.version}</imageName>
<!--用于指定基础镜像,相当于Dockerfile中的FROM指令-->
<baseImage>java</baseImage>
<!--相当于Dockerfile的ENTRYPOINT指令-->
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<!--用于指定需要复制的根目录,${project.build.directory}表示target目录-->
<directory>${project.build.directory}</directory>
<!--用于指定需要复制的文件。${project.build.finalName}.jar指的是打包后的jar包文件。-->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
- 清除特定images
以镜像名为<none>的垃圾镜像为例,删除名字为<none>的images的命令如下:
docker images | grep <none> | awk '{print $3}' | xargs docker rmi -f
或:
docker rmi -f $(docker images | grep <none> | awk '{print $3}')
查看当前运行的容器:
[root@localhost nevo-register]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d4a73fa01e06 register "java -jar /nevo-r..." 14 minutes ago Up 14 minutes 0.0.0.0:8001->9003/tcp agitated_lumiere
# 对于已退出的容器,可以使用如下命令进行查看:
docker ps -a
# 停止容器
docker stop 容器id
# 删除容器
docker rm 容器id
# 删除镜像
docker image rm 镜像名
- 将Eureka客户端部署到Docker,并注册到Eureka注册中心
使用cat /etc/hosts命令查看容器的IP地址:
[root@localhost nevo-register]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.77.129 localhost
将ip地址写到eureka客户端的配置文件:
#注册中心
eureka.register.port=9003
eureka.register.host=192.168.77.129
#显示IP
eureka.instance.preferIpAddress=true
eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
#注册中心地址
eureka.client.serviceUrl.defaultZone=http://${eureka.register.host}:${eureka.register.port}/eureka/
使用 docker run -p 9000:9000 -d nevo-register启动镜像,并在网页刷新eureka注册中心,看客户端是否加载上去。