• 微服务项目的docker自动化部署流程


    微服务的Docker自动化部署

    如何将一个微服务打包成一个可以独立运行的Docker镜像呢?需要完成两个任务:
    (1)JDK环境的Docker化
    (2)微服务的Docker化

    制作JDK1.8的Docker镜像

    Docker常用命令介绍

    (1)查看Docker本地仓库中已经下载好的镜像

    docker images
    

    (2)搜索远程仓库中相关镜像

    docker search [imageName]
    

    (3)查看所有被创建的容器(Container)

    docker ps -a
    

    (4)查看所有正在运行的容器(Container)

    docker ps
    

    (5) 创建并启动一个容器

    #创建后台进程
    docker run -di --name=[containerName] -p [port]:[port] [imageId或者image的name]
    

    (6)设置开机后,容器自启动

    docker update [containerName/containerId] --restart=always 
    

    (7)查看容器启动日志文件

    docker logs [containerName/containerId] 
    

    (8)删除容器

    docker rm [containerName/containerId]
    

    (9)删除镜像

    # 必须先停止容器,在删除容器,最后删除镜像
    docker rmi [imagesName/imagesId]
    

    (10)启动、重启、停止容器

    #启动
    docker start [containerName/conatainerId]
    #重启
    docker restart [containerName/conatainerId]
    #停止
    docker stop [containerName/conatainerId]
    

    制作image的一般流程

    JDK无法单独运行,必须依赖于相应的操作系统,因此需要Ubuntu或者Centos等系统的image,同时还要linux版本的jdk,制作步骤如下所示:
    Step1: 下载Centos:7的Docker镜像、linux版本的dk1.8包
    Step2: 编写Dockerfile的执行脚本,并和jdk1.8置于同一目录下。

    #依赖镜像名称和ID
    FROM centos:7
    #指定镜像创建者信息
    MAINTAINER ITCAST
    #切换工作目录
    WORKDIR /usr
    RUN mkdir /usr/local/java
    #ADD 是相对路径jar,把java添加到容器中
    ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
    #配置java环境变量
    ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
    ENV JRE_HOME $JAVA_HOME/jre
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
    ENV PATH $JAVA_HOME/bin:$PATH
    

    Step3: 执行Docker 的build命令生成镜像文件

    docker build -t='jdk1.8' .
    ## [注]-t表示生成的镜像名  . 表示docker的images仓库所在的根目录,
    ##该命令执行完成之后,就会将jdk安装到一个centos:7上,并且配置了java的环境变量
    

    [注意]上述步骤可以看成在Centos:7系统上安装jdk1.8,并且配置了相关java环境


    将本地的image上传至私人仓库

    (1)搭建私人仓库

    #从远程仓库拉去相关镜像
    docker pull registry
    #创建并且运行容器
    docker run ‐di ‐‐name=registry ‐p 5000:5000 registry
    # 修改并配置私人容器的IP地址
    vi /etc/docker/daemon.json
    # {"insecure‐registries":["192.168.184.135:5000"]}
    #重启Docker容器
    systemctl restart docker 
    

    (2)将镜像上传至私人仓库

    docker tag [resourceImages] ip/tag
    #如 dockers tag jdk1.8 192.168.56.3:5000/jdk1.8
    # 标记后的镜像名字包含了私人仓库的的访问ip和端口
    

    (3)使用push命令上传至私人仓库

    docker push 192.168.56.3:5000/jdk1.8 
    #如 dockers tag jdk1.8 192.168.56.3:5000/jdk1.8
    

    使用Maven插件实现自动化docker部署

    (1)在使用Docker-Maven插件之前需要先设置宿主机,使其能被远程访问。

    vi /lib/systemd/system/docker.service
    

    其中ExecStart=后添加配置‐H tcp://0.0.0.0:2375 ‐H unix:///var/run/docker.sock
    这个设置的含义为:开启docker的任意ip地址和2375端口,则任意一台远程及其可以通过该宿主机的ip:2375访问dockers。
    (2)配置微服务项目的POM.XML文件,主要是添加项目构建、打包、部署的插件。包含两大主要插件:

    • spring-boot-maven-plugin
    • docker-maven-plugin
    <project>
    <build>
            <!-- 打包后jar包名称 -->
            <finalName>app</finalName>
            <plugins>
                <!--Maven插件,编译,打包,部署等相关工作  -->
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
                <!-- docker的maven插件,官网:https://github.com/spotify/docker-maven-plugin -->
                <!-- Maven工具和Docekr进行连接的插件 -->
                <plugin>
                    <groupId>com.spotify</groupId>
                    <artifactId>docker-maven-plugin</artifactId>
                    <version>0.4.13</version>
                    <!-- 配置文件 -->
                    <configuration>
                        <!-- docker所构建的镜像的名字 -->
                        <imageName>192.168.56.3:5000/${project.artifactId}:${project.version}</imageName>
                        <!-- 构建所需要的基础镜像,上面所构建的jdk1.8镜像文件,也就是在该镜像文件的基础上再包裹一层,故其可以看作一个完整的最小运行系统 -->
                        <baseImage>jdk1.8</baseImage>
                        <!--创建和启动容器时所执行的命令:jar -jar /app.jar -->
                        <entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint>
                        <resources>
                            <resource>
                                <!-- 生成的jar包在当前项目的根目录下,该pom.xml文件同级 -->
                                <targetPath>/</targetPath>
                                <!-- target文件夹下面 -->
                                <directory>${project.build.directory}
                                </directory>
                                <!-- 使用app.jar包来制作镜像 -->
                                <include>${project.build.finalName}.jar</include>
                            </resource>
                        </resources>
                        <!-- 要上传的docker地址,个人的docker私人仓库和端口(上面步骤已经开放) -->
                        <dockerHost>http://192.168.56.3:2375</dockerHost>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>
    

    以上的配置实际上就是生成了一个Dockerfile文件

    FROM jdk1.8
    ADD app.jar /
    ENTRYPOINT ["java","‐jar","/app.jar"]
    

    (3)命令行窗口进入该项目根目录下面,使用Maven工具或者插件(Maven命令)完成编译、打包、制作镜像、上传镜像等一系列步骤。

    # 清除项目、打包成jar包,使用docker:build制作镜像文件,上传该镜像文件至私人仓库,所有的配置信息均来自上述配置的pom.xml文件
    mvn clean package docker:build ‐DpushImage
    

    在实际项目中,使用jar命令打包,导致jar包没有相关的元文件,无法直接部署,必须使用maven的package打包才行


    实际上是将使用package打包好的jar包(使用jar -jar /app.jar 命令是可以直接运行的)复制到原来的jdk1.8镜像文件中,使用该镜像文件创建并启动容器执行相jar命令调用jdk环境运行jar吧
    (4)使用该镜像就可以创建容器,启动容器,会执行设置好的命令:jar -jar app.jar。微服务项目也就顺利启动起来。至此,微服务项目的docker化已经介绍完毕

  • 相关阅读:
    用记事本编写一个Servlet项目
    Servlet开发(一)
    41、java与mysql乱码的问题
    40、JDBC相关概念介绍
    mysql-5.7.12-winx64安装版配置、使用
    39、集合线程安全问题
    38、各Set实现类的性能分析
    电脑取随机数是什么原理,是真正的随机数吗?转自知乎.
    创建Car类,实例化并调用Car类计算运输的原料量是否足够
    用Random类输出验证码
  • 原文地址:https://www.cnblogs.com/Thinker-Bob/p/12965652.html
Copyright © 2020-2023  润新知