1传统的部署方法

传统手动部署:
首先基于源码打包生成jar包(或war包),将jar包(或war包)上传至虚 拟机并拷贝至JDK容器。
2. 通过Maven插件自动部署: 对于数量众多的微服务,手动部署无疑是非常麻烦的做法,并且容易出错。所以
我们这 里学习如何自动部署,这也是企业实际开发中经常使用的方法。

配置maven环境变量

docker node应用 自动化部署 docker项目自动化部署_docker

修改Docker配置

(1)修改宿主机的docker配置,让其docker服务可以远程访问, 暴露的docker服务端口号 2375

vim /lib/systemd/system/docker.service

在 ExecStart= 后添加加配置
0.0.0.0 代表所有 ip ,也可指定 ip。修改后如下:

-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

docker node应用 自动化部署 docker项目自动化部署_端口号_02


验证是否生效,访问:http://192.168.10.11:2375/version , 响应如下内容则成功:

docker node应用 自动化部署 docker项目自动化部署_docker node应用 自动化部署_03

修改maven的config目录下面的setting.xml文件

(加入下面server的内容,账号对应的是阿里云账号,密码对应的是阿里云设置的仓库密码,不是登录密码)

docker node应用 自动化部署 docker项目自动化部署_端口号_04

<server>
	  <!--maven的pom中可以根据这个id找到这个server节点的配置-->  
	  <id>docker-aliyun</id>
	  <!--这里是在阿里云注册的账号-->
	  <username>在阿里云注册的账号</username>
	  <!--这里是在阿里云注册的密码-->
	  <password>在阿里云注册的密码</password>
	</server>

修改springcloud的config配置文件中心的pom文件内容

docker node应用 自动化部署 docker项目自动化部署_docker node应用 自动化部署_05


在 下面加入

<build>
    <finalName>app</finalName>
    <plugins>
        <!-- 插件一定要在其他构建插件之上,否则打包文件会有问题。 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <!-- docker的maven插件,官网:
              https://github.com/spotify/docker-maven-plugin -->
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>1.0.0</version>
            <!--生成镜像相关配置-->
            <configuration>
                <!-- 将forceTags设为true,这样就会覆盖构建相同标签的镜像  -->
                <forceTags>true</forceTags>
                <!-- 远程 docker 宿主机地址, 端口号是/lib/systemd/system/docker.service所暴露的端口号, 生成镜像到docker中 -->
                <dockerHost>http://192.168.10.11:2375</dockerHost>
                <!--内容是之前修改的maven的settings.xml配置文件中,server节点的id-->
                <serverId>docker-aliyun</serverId>
                <!-- 镜像名:阿里云镜像仓库地址
                            ${project.artifactId}引用当前工程名,
                            ${project.version}引用当前工程版本号
                            registry.cn-hangzhou.aliyuncs.com/mengxuegu/demo:0.0.1-SNAPSHOT -->
                <imageName>registry.cn-hangzhou.aliyuncs.com/mengxuegu/${project.artifactId}:${project.version}</imageName>
                <!--基础镜像-->
                <!--<baseImage>jdk1.8</baseImage>-->
                <baseImage>java</baseImage>
                <!--类似于Dockerfile的ENTRYPOINT指令-->
                <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
                <resources>
                    <resource>  <!-- 指定打包的资源文件 -->
                        <targetPath>/</targetPath> <!-- 指定要复制的目录路径,这里是当前目录 -->
                        <directory>${project.build.directory}</directory> <!-- 指定要复制的根目录,这里是target目录 -->
                        <include>${project.build.finalName}.jar</include> <!-- 这里指定最后生成的jar包 -->
                    </resource>
                </resources>
            </configuration>
        </plugin>
    </plugins>
</build>

值得注意的是

<imageName>registry.cn-hangzhou.aliyuncs.com/mengxuegu/${project.artifactId}:${project.version}</imageName>

仓库名+版本号

docker node应用 自动化部署 docker项目自动化部署_docker_06{project.version}

docker node应用 自动化部署 docker项目自动化部署_maven_07


对microservice-cloud-11-config-server-5001使用idea进行打包

打开idea窗口

docker node应用 自动化部署 docker项目自动化部署_端口号_08


运行下面这个打包命令:

mvn clean package docker:build -DpushImage

docker node应用 自动化部署 docker项目自动化部署_docker node应用 自动化部署_09


docker node应用 自动化部署 docker项目自动化部署_maven_10


使用docker images查看刚刚打包上传的镜像

docker node应用 自动化部署 docker项目自动化部署_docker node应用 自动化部署_11


查看阿里云镜像仓库可看到已经上传

docker node应用 自动化部署 docker项目自动化部署_maven_12


在docker利用打包的镜像配置容器

运用-it使得生成的容器启动且不退出容器

-p端口号映射

因为一般是采用的是镜像名:版本号,但是这个太长就采用镜像id拉取,直接右键就行

docker run -it --name=config_services_5001 -p 5001:5001 镜像ID

docker node应用 自动化部署 docker项目自动化部署_端口号_13


访问这个网址就能查看他的dev测试环境的配置

docker node应用 自动化部署 docker项目自动化部署_端口号_14

http://192.168.10.11:5001/microservice-config-product-dev.yml

docker node应用 自动化部署 docker项目自动化部署_docker_15


这样就可以通过5001查看github上面的远程配置文件

docker node应用 自动化部署 docker项目自动化部署_端口号_16

打包Eureka注册中心Server6001

1.修改bootstrap.yml里面配置中心的ip

docker node应用 自动化部署 docker项目自动化部署_docker node应用 自动化部署_17

cls清理terminal(清屏)

打包镜像并上传到阿里云

mvn clean package docker:build -DpushImage

docker node应用 自动化部署 docker项目自动化部署_maven_18


docker node应用 自动化部署 docker项目自动化部署_docker_19


查看运行容器的日志信息

docker logs 容器id

在docker容器中开启mysql,RabittMq, Eureka服务,以及GitHub上面托管的配置中心。config-server四个服务

docker node应用 自动化部署 docker项目自动化部署_docker node应用 自动化部署_20


配置eureka中的生产者并打包到docker容器

1GitHub上面修改配置文件的注册中心,mysql的端口号(docker容器对外暴露的是33306),mysql密码,mysqlIP信息

2.在idea端修改文件的配置中心IP以及RabbitMQ的IP

3加入下面的配置文件,打包的时候阿里云会自动创建仓库

docker node应用 自动化部署 docker项目自动化部署_docker_21

<build>
        <finalName>app</finalName>
        <plugins>
            <!-- 插件一定要在其他构建插件之上,否则打包文件会有问题。 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!-- docker的maven插件,官网:
                  https://github.com/spotify/docker-maven-plugin -->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.0.0</version>
                <!--生成镜像相关配置-->
                <configuration>
                    <!-- 将forceTags设为true,这样就会覆盖构建相同标签的镜像  -->
                    <forceTags>true</forceTags>
                    <!-- 远程 docker 宿主机地址, 端口号是/lib/systemd/system/docker.service所暴露的端口号, 生成镜像到docker中 -->
                    <dockerHost>http://192.168.10.11:2375</dockerHost>
                    <!--内容是之前修改的maven的settings.xml配置文件中,server节点的id-->
                    <serverId>docker-aliyun</serverId>
                    <!-- 镜像名:阿里云镜像仓库地址
                                ${project.artifactId}引用当前工程名,
                                ${project.version}引用当前工程版本号
                                registry.cn-hangzhou.aliyuncs.com/mengxuegu/demo:0.0.1-SNAPSHOT -->
                    <imageName>registry.cn-hangzhou.aliyuncs.com/jianghaojie/${project.artifactId}:${project.version}</imageName>
                    <!--基础镜像-->
                    <!--<baseImage>jdk1.8</baseImage>-->
                    <baseImage>java</baseImage>
                    <!--类似于Dockerfile的ENTRYPOINT指令-->
                    <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
                    <resources>
                        <resource>  <!-- 指定打包的资源文件 -->
                            <targetPath>/</targetPath> <!-- 指定要复制的目录路径,这里是当前目录 -->
                            <directory>${project.build.directory}</directory> <!-- 指定要复制的根目录,这里是target目录 -->
                            <include>${project.build.finalName}.jar</include> <!-- 这里指定最后生成的jar包 -->
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>

4.拉取microservice-cloud-14-product-config-8001并使用命令如下进行打包操作

mvn clean package docker:build -DpushImage

5但是遇到了一些问题Could not resolve dependencies for project

docker node应用 自动化部署 docker项目自动化部署_端口号_22

1.maven 打包Could not resolve dependencies for project

最近项目上使用的是idea ide的多模块话,需要模块之间的依赖,比如说系统管理模块依赖授权模块进行认证和授权,而认证授权模块需要依赖系统管理模块进行,然后,我就开始相互依赖,然后出现这样的问题:

“Could not resolve dependencies for project”,让我百思不得其解,最后网络搜了搜,最后给的解决方案是:

我也碰到这个问题,需要把parent工程,也就是package是pom的那个工程先install一下

然后我就找parent下面的pom,找到标签里是pom的那个包,然后install了一下,就好了。原因未知,但是的确救了很多碰到相似问题的人

简单一句话:对着父项目先 clean install 然后子项目clean package发布 ok

1先把注册的父工程 clean install 一下

docker node应用 自动化部署 docker项目自动化部署_maven_23


2再把pom文件中依赖的工程clean install 一下

docker node应用 自动化部署 docker项目自动化部署_端口号_24


docker node应用 自动化部署 docker项目自动化部署_docker node应用 自动化部署_25


再使用下面命令便可以打包到docker容器中成为镜像了

mvn clean package docker:build -DpushImage

docker node应用 自动化部署 docker项目自动化部署_端口号_26


这样便能通过docker部署容器啦

docker node应用 自动化部署 docker项目自动化部署_docker node应用 自动化部署_27


docker node应用 自动化部署 docker项目自动化部署_端口号_28


这样就部署完成,

注意:(1)因为microservice-cloud-14-product-config-8001的配置文件信息在microservice-cloud-11-config-server-5001上面

microservice-cloud-14-product-config-8001注册到microservice-cloud-13-eureka-config-6001的eureka注册中心上,所以这两个容器要启动

因为microservice-cloud-14-product-config-8001的mysql还需要RabbitMQ做消息推送,信息都在在docker容器上,所以mysql和RabbitMQ容器都要启动

(2)microservice-cloud-14-product-config-8001因为属于子类Module工程,所以需要把父类打成jar包,因为microservice-cloud-14-product-config-8001依赖microservice-cloud-02-api的Api文件,所以也需要把microservice-cloud-02-api打成包,同样mevan clean和install一下就行