之前学习了docker,今天就来试试将这个项目打包成docker镜像并通过运行一个镜像来运行项目。这里使用的项目是el-admin。是一个开源的springboot后端管理框架(前端vue),有兴趣的小伙伴可以去看看。

网址:https://el-admin.vip

关于docker的入门可以查看我之前的博客:https://www.cnblogs.com/pluto-charon/p/14118514.html

需要使用到的容器有:mysql、redis、nginx

1.打包后端代码

在这里使用的是springboot多模块的代码。所以打包还是有点麻烦的,在网上找了好久,试了好几种方式,都不行。

1.模块结构

整个项目的摸块结构如下图所示:eladmin为父摸块,但这个模块出来pom没有其他的代码。

  • eladmin-common 为系统的公共模块,各种工具类,公共配置存在该模块
  • eladmin-system 为系统核心模块也是项目入口模块,也是最终需要打包部署的模块
  • eladmin-logging 为系统的日志模块,其他模块如果需要记录日志需要引入该模块
  • eladmin-tools 为第三方工具模块,包含:图床、邮件、云存储、本地存储、支付宝
  • eladmin-generator 为系统的代码生成模块,代码生成的模板在 system 模块中

  1. 在父pom.xml里加上maven的编译插件

     <build>
    <plugins>
    <!-- 打包时跳过测试 -->
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
    <skip>true</skip>
    </configuration>
    </plugin>
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <configuration>
    <source>${java.version}</source>
    <target>${java.version}</target>
    </configuration>
    </plugin>
    <plugins>
    <build>
  2. 在eladmin-system(项目入口模块)的pom.xml文件里添加:

    <build>
    <plugins>
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
    <!-- 指定该Main Class为全局的唯一入口 -->
    <mainClass>me.zhengjie.AppRun</mainClass>
    <layout>ZIP</layout>
    </configuration>
    <executions>
    <execution>
    <goals>
    <goal>repackage</goal><!--可以把依赖的包都打包到生成的Jar包中-->
    </goals>
    </execution>
    </executions>
    </plugin>
    </plugins>
    </build>
  3. 其他的模块不变,不需要在pom.xml里面添加build内容。

2.打包

如果配置没有问题的话,那双击maven的package打包就可以成功了。建议是先clean一下,然后在package打包。

打包成功后,就可以在eladmin-system(项目入口模块)的pom同级目录下找到jar包。

3.上传代码并编写dockerfile文件

3.1 启动虚拟机的docker

[root@localhost ~]# systemctl start docker
# 开启docker的远程访问
[root@localhost ~]# vi /lib/systemd/system/docker.service
# 修改ExecStart这一行为
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
# 查看防火墙的状态
[root@localhost system]# systemctl status firewalld
# 如果是开启的,则需要关闭防火墙并且禁用
[root@localhost system]# systemctl stop firewalld & systemctl disable firewalld

3.2 将eladmin-system-2.6.jar上传到/home/el-admin下。并在同级目录下编写Dockerfile文件。

[root@localhost el-admin]# vi Dockerfile
# 文件内容
FROM java:8 ARG JAR_FILE=./*.jar
COPY ${JAR_FILE} el-admin.jar
ENV TZ=Asia/Shanghai
ENTRYPOINT ["java","-jar","el-admin.jar"]

3.3 构建镜像

docker build -f Dockerfile -t eladmin .

3.4 结果

[root@localhost el-admin]# docker build -f Dockerfile -t eladmin .
Sending build context to Docker daemon 113.4MB
Step 1/5 : FROM java:8
---> d23bdf5b1b1b
Step 2/5 : ARG JAR_FILE=./*.jar
---> Running in 677b700688ee
Removing intermediate container 677b700688ee
---> 208bd80b9acf
Step 3/5 : COPY ${JAR_FILE} el-admin.jar
---> e7887c62df96
Step 4/5 : ENV TZ=Asia/Shanghai
---> Running in fa7e28fecfb1
Removing intermediate container fa7e28fecfb1
---> f26c5e02d2d0
Step 5/5 : ENTRYPOINT ["java","-jar","el-admin.jar"]
---> Running in a54176bb6a60
Removing intermediate container a54176bb6a60
---> b71ac32872f0
Successfully built b71ac32872f0
Successfully tagged eladmin:latest

3.5 查看镜像

[root@localhost el-admin]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
eladmin latest b71ac32872f0 About a minute ago 750MB

2.打包前端代码

2.1 将.env.product 中的接口地址改为 '/'

直接在前端代码的根目录下,运行命令打包npm run build:prod,打包完成后,将dist文件夹上传到 /home/el-admin/nginx/html/eladmin 目录下(后面配置nginx时会挂载)。

3.安装redis和mysql镜像

1.安装redis

[root@localhost el-admin]# docker run -itd --name redis --restart=always -p 6379:6379 redis

2.安装mysql

这里使用的是mariadb镜像,并且将mariadb数据文件挂载到宿主机的/home/el-admin/mysql目录下

[root@localhost el-admin]# docker run -v /home/el-admin/mysql/:/var/lib/mysql \
-p 3306:3306 -e MYSQL_ROOT_PASSWORD=root \
--privileged=true --restart=always --name mariadb -d mariadb

mysql启动后,可以使用navicat连接mysql,初始化数据。在Java的父模块下有个sql文件,新建一个eladmin的数据库。将里面的eladmin.sql执行一下。

查看

[root@localhost el-admin]# docker container ls --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6c390c6dc475 mariadb "docker-entrypoint.s…" 5 minutes ago Up 5 minutes 0.0.0.0:3306->3306/tcp mariadb
2e465ca985d8 redis "docker-entrypoint.s…" 8 minutes ago Up 8 minutes 0.0.0.0:6379->6379/tcp redis

4.安装与配置nginx容器

1.安装nginx

docker run -d \
--name nginx --restart always \
-p 80:80 -p 443:443 \
-e "TZ=Asia/Shanghai" \
-v /home/el-admin/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /home/el-admin/nginx/conf.d:/etc/nginx/conf.d \
-v /home/el-admin/nginx/logs:/var/log/nginx \
-v /home/el-admin/nginx/cert:/etc/nginx/cert \
-v /home/el-admin/nginx/html:/usr/share/nginx/html \
nginx:alpine

2.配置文件

  • /home/el-admin/nginx/conf.d使用存放配置文件
  • / home/el-admin/nginx / cert用于存放https证书
  • / home/el-admin/nginx / html用于存放网页文件
  • / home / el-admin/nginx / logs用于存放日志

在nginx目录下创建如下文档:

使用nginx反向代理访问后端服务,由于容器内部通信,因此需要使用容器的ip,也就是127.0.0.1。在/home/el-admin/nginx/conf.d创建一个eladmin.conf的配置文件。文件内容如下:

server
{
listen 80;
server_name 域名/外网IP;
index index.html;
root /usr/share/nginx/html/eladmin/dist; #dist上传的路径 # 避免访问出现 404 错误
location / {
try_files $uri $uri/ @router;
index index.html;
} location @router {
rewrite ^.*$ /index.html last;
} # 接口
location /api {
proxy_pass http://172.17.0.1:8000;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
} # 授权接口
location /auth {
proxy_pass http://172.17.0.1:8000;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
} # WebSocket 服务
location /webSocket {
proxy_pass http://172.17.0.1:8000;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
} # 头像
location /avatar {
proxy_pass http://172.17.0.1:8000;
} # 文件
location /file {
proxy_pass http://172.17.0.1:8000;
}
}

3.启动nginx容器

[root@localhost nginx]# docker start nginx

4 启动java容器

docker run -d \
--name eladmin --restart always \
-p 8000:8000 \
-e "TZ=Asia/Shanghai" \
-e DB_HOST=172.17.0.1 \
-e DB_PWD=root \
-e REDIS_HOST=172.17.0.1 \
-v /home/el-admin/data/:/home/eladmin/ \
eladmin

下面是我访问我的程序:

在浏览器上输入: 192.168.189.156:80 登录(admin/123456)后,我在部门管理页面添加了两条数据,然后在navicat 上查询sys_dept表可以看到新增了两条数据。

到这里,整个项目就部署完成了。

5.上传到阿里云

阿里云上创建镜像仓库

然后操作指南里操作就行了。上传成功后,可在该仓库下的镜像版本中查看是否上传成功。

参考文章:

el-admin部署文档:https://el-admin.vip/guide/xmbs.html

docker部署 springboot 多模块项目+vue的更多相关文章

  1. 使用Docker部署Spring-Boot+Vue博客系统

    在今年年初的时候,完成了自己的个Fame博客系统的实现,当时也做了一篇博文Spring-boot+Vue = Fame 写blog的一次小结作为记录和介绍.从完成实现到现在,也断断续续的根据实际的使用 ...

  2. 转 使用Docker部署 spring-boot maven应用

    转自:https://blog.csdn.net/u011699931/article/details/70226504/ 使用Docker部署 spring-boot maven应用 部署过程分为以 ...

  3. Mac下 Docker部署SpringBoot应用

    一.安装Docker环境 使用 Homebrew 安装 macOS 我们可以使用 Homebrew 来安装 Docker. Homebrew 的 Cask 已经支持 Docker for Mac,因此 ...

  4. 详解docker部署SpringBoot及如何替换jar包

    关于docker的安装和使用,可以看看之前这两篇文章.Docker从安装部署到Hello World和Docker容器的使用和连接.这篇文章主要介绍如何在docker上部署springboot项目.关 ...

  5. SpringBoot多模块项目打包问题

    项目结构图如下: 在SpringBoot多模块项目打包时遇见如下错误: 1.repackage failed: Unable to find main class -> [Help 1] 解决步 ...

  6. 2017-09-26 发布 SpringBoot多模块项目实践(Multi-Module)

    https://segmentfault.com/a/1190000011367492?utm_source=tag-newest 2017-09-26 发布 SpringBoot多模块项目实践(Mu ...

  7. Docker 部署Dotnet Core MVC项目

    原文:Docker 部署Dotnet Core MVC项目 1.dotnet core创建项目 dotnet new mvc -o myweb cd myweb 然后就是业务代码的编辑,增删改查乱七八 ...

  8. 使用IDEA构建Spring-boot多模块项目配置流程

    使用IDEA构建Spring-boot多模块项目配置流程 1.创建项目 点击Create New Project 在左侧选中Spring Initializer,保持默认配置,点击下一步. 在Grou ...

  9. docker部署springboot项目

    本文介绍一下docker如何部署springboot项目. 前提条件: 1.可以运行jar包的环境 2.机器上已经安装了docker 3.准备部署的springboot的jar包 4.Dockerfi ...

随机推荐

  1. Docker-ce Centos8 笔记一:安装Docker-ce

    Docker是一个建设企业及数据中心服务仓库的进程,通过裸金属机和虚拟机承载的MAC.windows和linux系统提供本地和远程软件服务,涉及应用软件镜像.系统镜像.虚拟化仓库(虚拟机).它承载着灵 ...

  2. 初识sa-token,一行代码搞定登录授权!

    前言 在java的世界里,有很多优秀的权限认证框架,如Apache Shiro.Spring Security 等等.这些框架背景强大,历史悠久,其生态也比较齐全. 但同时这些框架也并非十分完美,在前 ...

  3. 串口使用Pipeline时诡异的ReadOnlySequence问题

    借鉴之前的Pipeline的操作方式,现在目标是给串口读取操作也使用上Pipeline.稍微改造一下,以下代码可以直接运行. 协议为使用连续的4个0XFF作为结尾,没有头标志.数据总长为68位定长. ...

  4. 萌新入门之python基础语法

    首先我们先了解一些python最最基础的入门 1.标识符 定义:我们写代码的时候自己取得名字比如项目名,包名,模块名这些: 规范:1.数字/字母/下划线组成,不能以数字开头 2.起名字要见名知意 3. ...

  5. HTML5表格详细教程

    HTML5表格 文章目录 HTML5表格 5.1 定义表格 5.1.1 普通表格.列标题 5.1.2 表格标题 5.1.3 表格行分组.表格列分组 5.2 表格属性 5.2.1 单线表格.分离单元格 ...

  6. kafka(三)原理剖析

    一.生产者消息分区机制原理剖析 在使用Kafka 生产和消费消息的时候,肯定是希望能够将数据均匀地分配到所有服务器上.比如很多公司使用 Kafka 收集应用服务器的日志数据,这种数据都是很多的,特别是 ...

  7. mysql5.5 升级至5.7

    mysql5.5 升级至5.7 1.下载mysql5.7.32 官方下载地址 解压 tar xvf mysql.tar.gz mysql/ 2. 进入旧的mysql的bin目录下导出mysql的数据 ...

  8. 如何创建一个 PostgreSQL 数据库?

    PostgreSQL 官网截图 PostgreSQL 是什么? PostgreSQL 是一个功能非常强大的,历史悠久,开源的关系数据库.PostgreSQL支持大部分的SQL标准并且提供了很多其他现代 ...

  9. 入门OJ:扫雪

    扫雪1 题目描述 大雪履盖了整个城市,市政府要求冬季服务部门尽快将一些街道(列在一份清单中)的积雪清除掉以恢复交通,整个城市由许多交叉路口和街道构成,当然任意两个交叉路口都是直接或间接连通的,清单给出 ...

  10. 24V转5V稳压芯片,高效率的同步降压DC-DC变换器3A输出电流

    PW2330开发了一种高效率的同步降压DC-DC变换器3A输出电流.PW2330在4.5V到30V的宽输入电压范围内工作集成主开关和同步开关,具有非常低的RDS(ON)以最小化传导损失.PW2330采 ...