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

Docker部署镜像 发布容器 容器网络互联 前端打包

准备工作

 导入相关依赖

        <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.7</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.7</version></dependency><!--模板引擎--><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version></dependency><!--knife4j--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>4.5.0</version></dependency>

配置数据库相关信息(这里注意我直接配虚拟机的ip 192.168.168.168 了)

spring.datasource.url=jdbc:mysql://192.168.168.168:3306/blue?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&connectTimeout=10000&socketTimeout=30000&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

 创建一个表以及它的实体类,控制器,服务类,mapper接口

在控制器中写一个测试接口

@RestController
@RequestMapping("/employee")
public class EmployeeController {@Resourceprivate EmployeeService employeeService;@GetMapping("/getAll")public Object test01(){return employeeService.list();}
}

修改pom文件中的skip为false

 先clean再打包

生成我们需要的jar包

配置好docker环境,需要装载好jdk,mysql,nginx的镜像

至此,准备工作完成

docker部署数据库 

虚拟机中执行命令,创建数据库容器

命令格式

docker run -id --name=数据库容器名 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -e TZ=Asia/Shanghai --privileged=true --restart=always mysql的镜像版本

  • -d--detach 的缩写,表示在后台运行容器,并在创建容器完成后打印容器 ID。

  • -i--interactive的缩写,表示提供交互式对话。所谓交互式对话,就是在容器运行时,可以通过terminal输入命令进行对话。

  • -p:表示绑定端口  格式为: 宿主机端口:容器端口   由于mysql的默认端口为3306,所以都填3306即可

  • -e  (environment) 表示配置环境变量   MYSQL_ROOT_PASSWORD=root  指定root用户的密码为root   TZ=Asia/Shanghai  指定时区(timezone)为亚洲上海

  •  --privileged  表示赋予容器额外的权限

  • --restart=always  docker服务重启时自动重启容器

[root@localhost ~]# docker run -id --name=mysql_master -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -e TZ=Asia/Shanghai --privileged=true --restart=always mysql:8.0.29
3331c9b871bad3944b68b35762646c33011b134e9a8e508e40bb89c3327eb33e
[root@localhost ~]#

连接远程数据库

配置数据库连接,虚拟机的ip地址为192.168.168.168

 运行sql文件

至此,我们已经成功在mysql_master容器内创建了数据库,并导入了sql文件,生成了数据表 

测试一下控制器的接口

创建一个dockerfile文件,配置相关信息

 

点击run,等待容器运行起来,输入网址,请求接口

结果符合我们的预期

基于docker-compose.yml发布容器

上面是用Dockerfile创建容器,用docker-compose.yml文件创建容器,会更加方便,从鲸鱼图标上的集装箱也可以看出来。

创建容器

# 版本为3
version: '3'
# 服务 即要创建的容器
services:db-demo01:# 指定容器的镜像image: testdockerenv01:0.0.1# 指定容器的名字container_name: db-demo01# 指定容器的端口绑定(可指定多个)    宿主机端口:容器端口ports:- "8081:8080"db-demo02:image: testdockerenv01:0.0.1container_name: db-demo02ports:- "8082:8080"- "8083:8080"

 run一下,可以看到创建了两个容器

访问一下,发现8082和8083端口都能访问db-demo02容器,符合预期

创建服务(本质上还是创建容器)

准备工作

1.先把前面创建的mysql_master容器删了

2. 虚拟机中创建 /opt/nginx/html  目录

/usr/share/nginx/html 是Nginx容器内默认存放网页文件的目录。

创建 /opt/nginx/html 的目的是为了将两者映射起来  (注意 /opt/nginx/html  是推荐的存放位置,实际是可以改的 。但是不要把页面放到/root,因为这是root用户的根目录,nginx用户权限不够,会报403

现在  /opt/nginx/html  中只有一个index.html(这个index.html目录是我们自己写的),尝试打印它

写docker-compose-base.yml 文件 

# 版本
version: '3'
# 服务(即创建的容器们)
services:# mysql服务mysql:# 指定镜像   (镜像名:版本号)image: mysql:8.0.29# 容器名container_name: mysql_master# 环境变量environment:- MYSQL_ROOT_PASSWORD=root # root账户的密码- TZ=Asia/Shanghai  # 时区- MYSQL_CHARSET=utf8mb4 # 字符集编码# 端口绑定 宿主机端口:容器端口  mysql的默认端口为3306ports:- "3306:3306"# 添加额外的权限privileged: true# docker服务重启是启动容器restart: always
# nginx服务nginx:image: nginx:latestcontainer_name: nginx# volumes 允许你将宿主机上的目录或文件挂载到容器内的指定位置,这样就实现了宿主机和容器间目录的双向绑定,容器就可以访问或修改宿主机上的数据了。volumes:# 将宿主机上的 /opt/nginx/html 目录挂载到容器内的 /usr/share/nginx/html 目录。# 这里,/opt/nginx/html 是宿主机上的路径,而 /usr/share/nginx/html 是Nginx容器内默认存放网页文件的目录。- /opt/nginx/html:/usr/share/nginx/html# nginx的默认端口为80ports:- "80:80"restart: always

注意这里面nginx的数据卷的挂载

 

这里我们把我们刚才创建的 /opt/nginx/html 文件夹 和 nginx容器下的 /usr/share/nginx/html文件夹绑定起来,这样我们就可以通过操作 /opt/nginx/html 里面的文件资源实现 nginx里面绑定的文件夹的同步更新

同样的,也可以通过命令行挂载数据卷

 运行结果

 nginx容器已经跑起来了,现在通过terminal去找我们在虚拟机的index.html文件是否被成功挂载了

 结果符合我们的预期 它果然在/usr/share/nginx/html  目录下

现在去访问网页

为什么会这样呢?

原来访问192.168.168.168,应该是下面这个页面

 但是由于我们进行了挂载,我们的index.html直接覆盖了它原有的html文件

容器网络互联

docker容器操作的命令

案例 

现在我有如下5个可运行的容器,他们都在doc_default网络下

注意这里的ip

现在进入nginx的控制台,试着ping一下nacos

(没有ping命令:apt-get update  然后 apt install iputils-ping)

 发现ping 容器名字或者ip都可以ping通,这是因为他们在同一个网络里面

************************************

现在创建一个db-demo01容器 (操作网络的时候关闭它)

 

通过 docker inspect db-demo01查看网络详情信息  由于在创建容器的文件中没有指定网络,它自动被放到doc_default网络

通过docker network disconnect 让db-demo01容器离开doc_default 

现在我们创建一个名为demo的网络,把他加进来 

创建网络

容器加入网络

 

现在我们重启一下容器 

发现同一个网络里面容器的ip是会变的,我们通过ping 容器名的优势就体现出来了,不需要每次记住容器的ip

现在启动db-demo01 尝试ping一下nacos

发现ping不通,这是因为它们不属于同一网络 

************************************************

用nginx容器 通过容器名ping一下nacos,仍然能ping通,这是因为它们处于同一网络(即doc_default)

ps:一个容器可以隶属于多个网络 

前端打包

我们的前端界面要进行打包,部署到nginx服务器上

两种方式进行打包:

1.

2.

打包的结果放在一个名为dist的文件夹中,里面有一堆js文件(页面的打包结果)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Spring Boot项目:多模块还是单模块?架构师的一次深思熟虑!
  • 重修设计模式-结构型-门面模式
  • MySQL 5.7.42升级到MySQL 8.4.2
  • uniapp child.onFieldChange is not a function
  • js 3个事件监听器 EventListeners
  • Android Studio 安装配置教程(Windows最详细版)
  • 镀金引线---
  • 【楚怡杯】职业院校技能大赛 “云计算应用” 赛项样题四
  • 港迪技术IPO上市实施募投项目,带动公司多维度能力综合提升
  • Java 之多线程高级
  • 安卓13系统导航方式分析以及安卓13修改默认方式为手势导航 android13修改导航方式
  • 828华为云征文|华为Flexus云服务器搭建Cloudreve私人网盘
  • Java中的红黑树(如果想知道Java中有关红黑树的知识点,那么只看这一篇就足够了!)
  • 【渗透测试】-vulnhub源码框架漏洞-Os-hackNos-1
  • 运维工程师面试整理-数据库
  • [数据结构]链表的实现在PHP中
  • 3.7、@ResponseBody 和 @RestController
  • 4个实用的微服务测试策略
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • ES2017异步函数现已正式可用
  • js继承的实现方法
  • Kibana配置logstash,报表一体化
  • React-生命周期杂记
  • Spring核心 Bean的高级装配
  • Vultr 教程目录
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 给初学者:JavaScript 中数组操作注意点
  • 关于for循环的简单归纳
  • 前言-如何学习区块链
  • 如何选择开源的机器学习框架?
  • 软件开发学习的5大技巧,你知道吗?
  • 小程序01:wepy框架整合iview webapp UI
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 正则学习笔记
  • 第二十章:异步和文件I/O.(二十三)
  • ![CDATA[ ]] 是什么东东
  • #{}和${}的区别是什么 -- java面试
  • #DBA杂记1
  • #在 README.md 中生成项目目录结构
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (9)STL算法之逆转旋转
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (纯JS)图片裁剪
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (十三)MipMap
  • (四)鸿鹄云架构一服务注册中心
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .ai域名是什么后缀?
  • .bat批处理(一):@echo off
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET Framework 3.5安装教程