美文网首页挨踢(IT)
自动化部署--Jenkins--Docker构建(十)

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

作者: 无剑_君 | 来源:发表于2019-10-18 21:02 被阅读0次

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

    相关文章

      网友评论

        本文标题:自动化部署--Jenkins--Docker构建(十)

        本文链接:https://www.haomeiwen.com/subject/uumjmctx.html