准备工作
导入相关依赖
<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 {
@Resource
private 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.1
container_name: db-demo02
ports:
- "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的默认端口为3306
ports:
- "3306:3306"
# 添加额外的权限
privileged: true
# docker服务重启是启动容器
restart: always
# nginx服务
nginx:
image: nginx:latest
container_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的默认端口为80
ports:
- "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文件(页面的打包结果)