自动化部署--Jenkins--Docker构建(十)

一、SpringBoot配置

在项目src/main中创建docker目录:

  1. 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>
  1. Docker插件
# docker构建
mvn clean package docker:build
# 跳过测试
mvn docker:build -Dmaven.test.skip
  1. 执行shell运行镜像
docker images | grep nevo-register
echo "启动容器----->"
docker run -d  -p 8001:9001 nevo-register
echo "启动服务成功!"

当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。
本地主机的 49155 被映射到了容器的 5000 端口。

二、创建任务

发布流程
  1. 创建一个Maven项目


    创建一个Maven项目
  2. 源码管理


    新增源码管理
  3. 项目构建


    项目构建
clean package -pl nevo-register -am -Dmaven.test.skip=true
  1. 构建后执行脚本


    构建后执行脚本

    简单构建

# 切换到模块目录
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

三、发布镜像到仓库

附:

  1. 将可运行的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。

  1. 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
        }
    ],

可以看到两个挂载点的信息。

  1. ENTRYPOINT 指令
    ENTRYPOINT 的格式和 RUN 指令格式一样,分为 exec 格式和 shell 格式。

  2. WORKDIR指令
    用来指定当前工作目录(或者称为当前目录)
    当使用相对目录的情况下,采用上一个WORKDIR指定的目录作为基准
    相当与cd 命令,但不同的是指定了WORKDIR后,容器启动时执行的命令会在该目录下执行

  3. docker build 构建镜像

  4. 在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>
  1. 清除特定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  镜像名

  1. 将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注册中心,看客户端是否加载上去。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351

推荐阅读更多精彩内容