使用docker部署苍穹外卖到云服务器中
- 一、docker自定义网络
- 1. 原因:
- 2. 原理作用
- 3. docker创建网络
- 4. 举例说明(举个例子,不用操作)
- 二、部署MySQL
- 1. 创建本地目录
- 2. 使用xftp、MobaXerm等应用程序将mysql这个文件夹复制到服务器的/root目录下
- 3. 创建MySQL容器,完成本地目录挂载
- 4. docker展示部署结果
- 5. 使用navicat连接服务器上部署的MySQL
- 三、部署redis
- 1. 创建并运行redis容器
- 2. docker展示部署结果
- 3. redis可视化工具连接服务器上的redis容器
- 四、部署java后端
- 1. 创建jdk镜像
- 2. 修改后端项目的配置信息
- 3. 将苍穹外卖后端项目打包(.jar包)
- 4. 编写DockerFile文件
- 5. 创建苍穹外卖后端项目的镜像
- 6. 创建苍穹外卖后端项目容器
- 7. docker查看苍穹外卖后端项目容器
- 8. 浏览器浏览器访问后端项目。
- 五、部署nignx前端项目(文末提供了nginx相关的资源)
- 1. 修改nginx.conf文件
- 2. 修改websocket请求连接的url
- 3. 创建nginx容器
- 4. docker查看nginx容器
- 5. 浏览器运行前端项目
- 六、部署微信小程序
- 1. 修改axios请求的url
- 2. 运行微信小程序
- 七、资料
无需上线微信小程序,一站式部署部署微信小程序、java后端代码、nginx等。
推荐看本篇前,先观看黑马docker快速入门到部署3小时,看完视频再看本篇,苍穹外卖100%部署成功,并且理解透彻每一步。
苍穹外卖使用jdk11或jdk17进行编译,以下部署都是根据jdk11或jdk17来部署的。可以使用其他版本的jdk,只需要拉取到对应jdk的镜像即可。
一步一步跟着走,保证没问题!
一、docker自定义网络
1. 原因:
由于创建部署的每个容器的ip地址都会改变,且一些容器的私网ip地址不在同一个网段(网络或局域网)中,这就造成容器与容器之间的访问变得困难。比如:java后端连接mysql时,如果java后端项目这个容器和mysql容器不在同一个局域网中,它们之间是无法访问的,给每个容器配置公网ip也不现实。
2. 原理作用
自定义网络,就是创建一个局域网,将每一个容器都添加到这个局域网中,每个容器都有这个局域网的固定私网ip;同时,访问各个容器时,直接使用容器名代替容器的私网ip。
3. docker创建网络
docker network create heima
创建一个网络名为黑马的局域网。各个容器在创建运行时,可以加入这个heima局域网中。
4. 举例说明(举个例子,不用操作)
- 创建java后端项目容器(demo项目)并加入heima局域网中。
使用--network heima
加入heima局域网中
docker run -d --name demo --network heima -p 8080:8080 demo
- 创建mysql容器并加入heima局域网中。
使用--network heima
加入heima局域网中
docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 --network heima mysql
- java项目连接mysql
因为java项目和mysql在同一个局域网heima中,并且可以使用容器名代替容器的ip地址。那么,连接mysql的url为
url = jdbc:mysql://mysql:3306/数据库名
二、部署MySQL
先将MySQL容器于本地目录进行挂载,挂载后,MySQL的数据所在的文件路径就可以清晰的展示出来,可以直接通过宿主机(云服务器)所挂载的本地目录查找MySQL数据。
同时,下次再创建MySQL容器时,可以继续使用本地目录进行挂载,这样新创建的MySQL容器就会有本地目录的表数据了。
1. 创建本地目录
创建mysql文件夹,里面包含了conf文件夹和init文件夹
文末提供了mysql文件夹,可以直接使用提供的myslq文件夹,跳过这个步骤。
init文件夹中可以放入苍穹外卖数据的sql文件,这样在docker创建mysql容器时,可以自动执行sql文件,创建苍穹外卖的数据库。
conf文件夹中含有配置文件,用来确定数据库编码的文件
sky-take-out文件内容为
[client]
default_character_set=utf8mb4
[mysql]
default_character_set=utf8mb4
[mysqld]
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
2. 使用xftp、MobaXerm等应用程序将mysql这个文件夹复制到服务器的/root目录下
3. 创建MySQL容器,完成本地目录挂载
原理:
- 挂载/root/mysql/data到容器内的/var/lib/mysql目录
- 挂载/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录(初始化的SQL脚本目录)
- 挂载/root/mysql/conf到容器内的/etc/mysql/conf.d目录(这个是MySQL配置文件目录)
docker命令:
docker run -d \--name mysql \-p 3306:3306 \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=123 \-v ./mysql/data:/var/lib/mysql \-v ./mysql/conf:/etc/mysql/conf.d \-v ./mysql/init:/docker-entrypoint-initdb.d \mysql
其中,–name mysql的mysql是创建的MySQL的容器名; 最后一行的mysql是mysql镜像名,不加版本号就默认是mysql最新版的镜像。
4. docker展示部署结果
如下结果,则说明MySQL容器创建成功
连接成功,如下:
5. 使用navicat连接服务器上部署的MySQL
连接
三、部署redis
1. 创建并运行redis容器
docker命令:
docker run -d --name redis -p 6379:6379 --network heima --requirepass root redis
其中第一个redis是redis容器名,可更改;第二个redis是redis镜像名,不加版本号默认是最新的redis镜像。root表示的是redis的密码。-p后面的就是开放的端口号,redis默认6379.
2. docker展示部署结果
3. redis可视化工具连接服务器上的redis容器
使用Another Redis Desktop Manager等redis可视化工具连接:
连接成功就会显示出ip地址和redis,可以新增key试试有没有效果。连接成功则说明redis部署成功。
四、部署java后端
1. 创建jdk镜像
选项一:导入openjdk11的压缩包,创建jdk11镜像
可以使用这里提供的openjdk11的压缩包(资源在文末),
将jdk.tar赋值到/root目录下,在/root目录下执行docker命令,将压缩包(.tar包)加载成jdk11镜像
docker load -i jdk.tar
jdk11镜像:
选项二:使用国内镜像源,拉取openjdk17的镜像
可以在openjdk17国内镜像源里面获取openjdk17镜像源地址。
使用docker命令
docker pull 国内镜像地址
openjdk17镜像下载后:
将该镜像添加别名,下载的镜像名太长了。
docker tag 旧镜像名 新镜像名
这里将openjdk17添加的别名为:
docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/openjdk:17-slim openjdk:17-jdk-slim
2. 修改后端项目的配置信息
idea打开苍穹外卖项目,修改application-dev.yml中的配置信息。
修改一下内容即可:
3. 将苍穹外卖后端项目打包(.jar包)
跳过maven测试,直接打包:
这个样子的jar包:
4. 编写DockerFile文件
编写DockerFile文件(文件没有后缀),创建苍穹外卖后端项目的镜像。
# 基础镜像
FROM openjdk:17-jdk-slim
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY sky-server-1.0-SNAPSHOT.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
需要注意的是,sky-server-1.0-SNAPSHOT.jar是苍穹外卖打成jar包的名字,根据打成的jar包名字进行更改。同时按照jdk的版本进行更改:
- jdk11编译的苍穹外卖,将openjdk:17-jdk-slim修改为openjdk:11.0-jre-buster
- jdk17编译的苍穹外卖,则不用修改
5. 创建苍穹外卖后端项目的镜像
将DockerFile文件和jar包复制到云服务器的/root目录下
在/root目录下,执行DockerFile命令:
docker build -t sky .
注意:sky为后端项目的镜像名。
6. 创建苍穹外卖后端项目容器
docker命令:
docker run -d --name sky-take-out --network heima -p 8080:8080 sky
7. docker查看苍穹外卖后端项目容器
docker ps
8. 浏览器浏览器访问后端项目。
地址栏输入:http://云服务器ip地址:8080/doc.html
五、部署nignx前端项目(文末提供了nginx相关的资源)
苍穹外卖管理端资源部署在nginx中。因此,访问管理端资源,必须在云服务器中部署nginx。
如果你的后端项目的容器名是sky-take-out,可以使用这里提供的nginx文件夹,跳过下面1和2,无需修改nginx的相关配置,直接跳到的:3. 创建nginx容器
1. 修改nginx.conf文件
第一处修改:
替换以下内容:
location / {root html/sky;index index.html index.htm;}
替换为:
location / {root /usr/share/nginx/html/sky;}
第二处修改:
将nginx/conf/nginx.conf文件,修改nginx.conf::
2. 修改websocket请求连接的url
在nginx中找到app.d0aa4eb3.js文件
编辑器进入该文件,ctl+f搜索ws://localhost/ws/
将localhost修改为云服务器的ip地址。
这样修改后,通过WebSocket协议,用户下单后,管理端就可以实时接收到下单提醒和催单提醒。
3. 创建nginx容器
第一步:创建文件夹nginx,包含了苍穹外卖资源的nginx的html文件夹和刚刚修改的nginx.conf文件。
第二步:将nginx文件夹复制到云服务器的/root目录下
这一步的作用是:为创建nginx容器时完成本地目录挂载提供本地目录资源。
第三步:创建nginx容器
docker run -d \--name nginx \-p 80:80 \-v /root/nginx/html:/usr/share/nginx/html \-v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \--network heima \nginx
4. docker查看nginx容器
5. 浏览器运行前端项目
浏览器地址栏输入:云服务器ip地址
六、部署微信小程序
微信小程序对应苍穹外卖的用户端。微信小程序无需上线,修改小程序发送axios的url就可以在微信开发者工具中,使微信小程序访问到部署到云服务器上的苍穹外卖。
1. 修改axios请求的url
原来微信小程序的axios请求
在微信开发者工具中,找到vendor.js文件。
ctrl+f 搜索 baseUrl,将baseUrl的值修改为如下:
修改后,微信小程序发送的请求就会到部署到云服务器上的nginx上,由nginx代理转发到后端容器中。
2. 运行微信小程序
七、资料
苍穹外卖部署资料
喜欢的话就点赞和关注吧!!!