当前位置: 首页 > news >正文

【docker快捷部署系列二】用docker-compose快速配置多个容器,docker部署Springboot+Vue项目和mysql数据库

1、思路

  1. docker部署项目是将项目的不同程序放入不同容器中运行,这样可以方便管理不同程序。
  2. 我的项目有Springboot、Vue、mysql三部分,Vue用nginx代理,因为nodejs太占空间了。
  3. 一开始我是用Dockerfile创建镜像再运行容器的,但发现它是基于别的镜像再创建镜像,比较占空间。
  4. 用docker-compose直接配置原镜像,用数据卷实现配置文件挂载加载,就能运行容器,不需要额外创建镜像,很快很节约,还没发现弊端。
  5. 提醒,生产环境下不建议把数据库部署在 Docker 容器内,性能、资源限制、数据迁移等都不理想。

2、编写docker-compose

  • 在总项目(包含Springboot、Vue项目)目录下再创建一个文件夹app2Docker专门放打包后的项目,在app2Docker里创建docker-compose.yml,内容如下。
version: '3'
services: mysql-container: image: mysql:5.7container_name: mysql-containerenvironment: MYSQL_ROOT_PASSWORD: "root"
#            MYSQL_DATABASE:数据库名ports: - "3306:3306"volumes: - mysql-data:/var/lib/mysqlblog_springboot: image: openjdk:8-jdkcontainer_name: blog_springbootports: - "8100:8100"volumes: 
#        目标文件夹会自动创建- ./blog_springboot:/app- ./myupload:/app/uploadworking_dir: /appcommand: java -jar simple_blog_backend-0.0.1-SNAPSHOT.jar --spring.config.location=file:./application.propertiesblog_vue_nginx: container_name: blog_vue_nginximage: nginx
# 80http端口转发到8080https端口        ports: - "80:80"- "8080:8080"volumes: - ./blog_vue/dist:/usr/share/nginx/html- ./blog_vue/SSL_test_key/mycert.crt:/etc/nginx/certs/mycert.crt- ./blog_vue/SSL_test_key/mykey.key:/etc/nginx/certs/mykey.key- ./blog_vue/my_nginx.conf:/etc/nginx/conf.d/my_nginx.conf
#调用Dockerfile的写法            
#    blog_springboot: 
#        build: 
#            dockerfile所在文件夹
#            context: ./blog_springboot
#            dockerfile:Dokerfile 名,默认的话这一项可省略
#        container_name: blog_springboot
#        ports: 
#            - "8100:8100"
#        volumes: 
#        目标文件夹会自动创建
#            - ./myupload:/app/upload
#使用容器间网络
networks: default: name: my_network#不会覆盖已有数据卷        
volumes: mysql-data: 
  • 运行docker-compose.yml
    运行前,把打包后的Springboot、Vue项目放入app2Docker里对应的子文夹里
    在这里插入图片描述
    然后把app2Docker文件夹拷贝到docker toolbox虚拟机的/home目录下
    cd /home/app2Docker进入目录,执行docker-compose up -d启动多个容器,执行docker-compose down停止并删除多个容器
  • 安装docker-compose(补充)
    但是docker toolbox虚拟机不自带docker-compose,执行如下命令下载docker-compose:
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

赋予 Docker Compose 可执行权限:

sudo chmod +x /usr/local/bin/docker-compose

3、代码分析

  • 第一段创建mysql-container容器,设置数据库密码为root,保存数据库数据到数据卷mysql-data
  • 第二段创建blog_springboot容器,加载程序和配置文件到容器内/app,挂载./myupload文件夹来保存java程序上传图片等文件资源, 'working_dir: /app’设置后面command命令的容器内工作路径,application.properties是从Springboot工程里拷贝出来修改的,java加--spring.config.location=file:./application.properties参数运行时只加载外部配置文件,在里面我修改了mysql访问地址
spring.datasource.url=jdbc:mysql://mysql-container:3306/simple_blog?serverTimezone=UTC&characterEncoding=utf-8&useSSL=true

mysql-container是容器名,在docker-compose.yml里后面定义了容器间网络my_network,所以能通过容器名加端口号来进行通信。

  • 第三段创建blog_vue_nginx容器,通过数据卷把dist加载到nginx里,同时加载https的自签名证书mycert.crtmykey.key,生成证书方法看文章链接,最后加载nginx代理的配置文件my_nginx.conf实现http转发到https。
server {listen 80;server_name 192.168.99.100;return 301 https://$host:8080$request_uri;location / {}
}
server {listen 8080 ssl;server_name 192.168.99.100;ssl_certificate /etc/nginx/certs/mycert.crt;ssl_certificate_key /etc/nginx/certs/mykey.key;# 根目录指向 /usr/share/nginx/htmllocation / {root   /usr/share/nginx/html;index  index.html index.htm;try_files $uri $uri/ /index.html;}
}

4、扩展

  • 在docker toolbox虚拟机中操作可启动虚拟机后用Xshell连接:
    主机:192.168.99.100(虚拟机的地址)
    用户名默认:docker
    密码默认:tcuser

  • 用Xftp传输文件(Xshell连接成功后并且安装了Xftp,点箭头所指就可以建立Xftp连接):
    在这里插入图片描述

  • docker toolbox里的虚拟机系统/home是临时系统,重启会清空,使用数据卷或在VirtualBox的设置中配置共享文件夹,将主机上的目录共享到虚拟机的/home或其他目录。这样,/home目录就可以作为持久存储。

  • 【docker快捷部署系列一】docker快速入门,安装docker

  • 运行时日志报错:jar Error: Unable to access jarfile …;
    因为挂载了jar程序运行的当前文件夹,可创建子文件夹来挂载。

  • 运行时日志报错:java.io.IOException: Problem reading font data.
    FROM openjdk:8-jdk-alpine 缺少字体库
    改为FROM openjdk:8-jdk

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python | Leetcode Python题解之第329题矩阵中的最长递增路径
  • 手写Redis缓存系统,第三章:持久化-增加可靠性
  • SuccBI+低代码文档中心 — 可视化分析(仪表板)(下)
  • Linux-Shell入门-05
  • 白骑士的Matlab教学实战项目篇 4.3 控制系统设计
  • 保研考研机试攻略:第一章——从零开始
  • 怎样才算精通 Excel?
  • linux之网络子系统-GRO机制分析
  • 09正弦稳态电路的分析
  • C语言学习笔记 Day10(指针--中)
  • 13.StringRedisTemplete使用
  • 巧用Array.forEach:简化循环与增强代码可读性;Array.forEach怎么用;面对大量数据时怎么提高Array.forEach的性能
  • C语言:字符函数,字符串函数
  • 《计算机网络 - 自顶向下方法》阅读笔记
  • 28. Hibernate 中的常见坑
  • 《剑指offer》分解让复杂问题更简单
  • angular学习第一篇-----环境搭建
  • ES2017异步函数现已正式可用
  • Java 最常见的 200+ 面试题:面试必备
  • jquery ajax学习笔记
  • Js基础知识(一) - 变量
  • Python 基础起步 (十) 什么叫函数?
  • Redis中的lru算法实现
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Shadow DOM 内部构造及如何构建独立组件
  • 简单数学运算程序(不定期更新)
  • 前端技术周刊 2019-01-14:客户端存储
  • 让你的分享飞起来——极光推出社会化分享组件
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 数组大概知多少
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • zabbix3.2监控linux磁盘IO
  • ​linux启动进程的方式
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #android不同版本废弃api,新api。
  • #AngularJS#$sce.trustAsResourceUrl
  • #传输# #传输数据判断#
  • (14)Hive调优——合并小文件
  • (4)(4.6) Triducer
  • (6)添加vue-cookie
  • (C)一些题4
  • (day18) leetcode 204.计数质数
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (ZT)出版业改革:该死的死,该生的生
  • (分布式缓存)Redis持久化
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (四)图像的%2线性拉伸
  • (一)基于IDEA的JAVA基础1
  • (转)EXC_BREAKPOINT僵尸错误