苍穹外卖Docker部署到阿里云服务器
在部署前,建议看一下黑马的Docker快速部署课程,大概3个小时左右。
PS:B站的画质有点糊,建议去找黑马官方要百度网盘资源,在B站评论区里面有说。
课程视频:
黑马程序员Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+DockerCompose项目实战一套搞定_哔哩哔哩_bilibili
课程文档:
day02-Docker - 飞书云文档
服务器选择
Vmware安装Linux虚拟机 VS 云服务器,我建议使用云服务器。本地虚拟机我也试过,但遇到的问题更多,比如镜像源、网络这些。
我这里使用的是阿里云的ECS服务器,轻量级服务器不知道可不可以用,我没试过。
关于阿里云服务器的优惠力度:
- 学生身份可以免费领取300优惠券
- 新用户注册阿里云有免费试用
- 99/年这款产品用来学习也很不错
好了,关于怎么选择阿里云服务器,大家可以去网上找一找,下面是我的配置。
服务器设置
这里需要把redis,mysql等我们要用到的端口号都添加上
服务器连接
在本地安装MobaXterm工具,使用它连接阿里云服务器,因为使用阿里云的在线控制台页面不是很友好。
MobaXterm的使用可以参考day02-Docker - 飞书云文档
项目部署
Docker安装
-
卸载旧版
首先如果系统中已经存在旧的Docker,则先卸载:
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine \ docker-selinux
-
配置Docker的yum库
首先要安装一个yum工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
安装成功后,执行命令,配置Docker的yum源(已更新为阿里云源):
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
更新yum,建立缓存
sudo yum makecache fast
-
安装Docker
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
-
启动和校验
建议分步执行下面命令测试
# 启动Docker systemctl start docker # 停止Docker systemctl stop docker # 重启 systemctl restart docker # 设置开机自启 systemctl enable docker # 执行docker ps命令,如果不报错,说明安装启动成功 docker ps
-
配置镜像加速
我这里是阿里云,使用自己的哈~
去阿里云→产品→容器→容器镜像服务ACR→管理控制台→镜像工具→镜像加速器
找到镜像工具下的镜像加速器:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传页面向下滚动,即可找到配置的文档说明:
具体命令如下:
# 创建目录 mkdir -p /etc/docker # 复制内容,注意把其中的镜像加速地址改成你自己的 tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"] } EOF # 重新加载配置 systemctl daemon-reload # 重启Docker systemctl restart docker
如果你看完了黑马的Docker快速部署3小时视频,用docker compose部署应该是最为方便的,我下面用docker compose部署方法来演示。
镜像拉取
分别拉取我们所需要的nginx,redis,mysql镜像,jdk镜像;另外还要自己制作一个后端程序的镜像。
# mysql镜像拉取
docker pull mysql
# nginx镜像拉取
docker pull nginx
# redis镜像拉取
docker pull redis
# jdk镜像拉取 这里的jdk版本看你开发时是用的哪个版本即可
docker pull openjdk:11
拉取好后,可以用 docker images命令查看
docker images
如下:
[root@iZbp1e3hvj3iwmp4gvf3lbZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 3 years ago 141MB
openjdk 11 5505a9a39df1 3 years ago 659MB
redis latest 7614ae9453d1 3 years ago 113MB
mysql latest 3218b38490ce 3 years ago 516MB
后端程序镜像制作
先将自己的项目在IDEA上打包
在打包之前需要调一下application-dev.yml文件。redis这里我没有设置密码。
由于我们使用的docker compose部署,这里用容器名字就可以了。
设置好后,去掉测试模块后点击package就可以打包了。建议在打包前先clean,我这里打包后重命名为sky.jar,默认名字实在太长。
然后还要准备一个Dockerfile文件
Dockerfile文件用于我们一键制作镜像,相当于给docker指令,让它自动制作镜像。
Dockerfile文件
# 基础镜像
FROM openjdk:11
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY sky.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
准备好这两个文件后,将这两个文件拖入我们服务器的root目录下
自动镜像制作命令
docker build -t sky .
镜像做好后docker images查看一下
到这一步,我们所有需要的镜像都有了。
使用docker compose一键部署,我们需要准备一个docker-compose.yml文件
docker-compose.yml文件
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
volumes:
- "./mysql/conf:/etc/mysql/conf.d"
- "./mysql/data:/var/lib/mysql"
- "./mysql/init:/docker-entrypoint-initdb.d"
networks:
- sky-net
redis:
image: redis
container_name: redis
ports:
- "6379:6379"
volumes:
- "./redis/data:/data"
networks:
- sky-net
sky:
image: sky
container_name: sky
ports:
- "8080:8080"
depends_on:
- mysql
networks:
- sky-net
nginx:
image: nginx
container_name: nginx
ports:
- "80:80"
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/html:/usr/share/nginx/html"
depends_on:
- sky
networks:
- sky-net
networks:
sky-net:
name: sky-net
docker-compose.yml文件做好后同样托入到root目录下
nginx
另外我们这里的前端文件需要自己创建一下挂载目录。正常来说,它会自动创建并挂载目录,但我们这里有一个nginx.conf文件,所以不手动创建是会报错的。另外,我们的前端的文件要做一些修改。
在自己电脑桌面上创建一个nginx文件夹,之后还是拖入上传到服务器的root目录下。
nginx目录下有一个html文件夹和一个nginx.conf文件。
html文件直接从黑马资料中拷贝
nginx.conf同样拷贝
拷贝过来最后如图:
对nginx.conf文件做如下修改。左边是未修改,右边是修改后。一共3个地方修改了。
然后还要做一些修改,找到我们nginx/html/sky/js目录下的app.d0aa4eb3.js文件打开,Ctrl + F搜索ws://localhost/ws/,然后将localhost改成自己服务器的公网IP地址。(这样就可以使用websocket语音提醒了)
最后把我们的整个nginx目录文件拖入服务器root目录下
docker compose 一键部署命令
docker compose up -d
# 查看运行中的容器命令
docker ps
# 停止容器命令
docker compose stop
我们停止容器后再单独启动一下mysql容器,因为我们的mysql还没有数据库
# 启动mysql容器
docker start mysql
使用Navicat连接mysql
接下来就是手动创建sky_take_out数据库了
先连接一下我们本地localhost的数据库,然后找到sky_take_out数据库,导出SQL脚本
然后再在我们的服务器数据库中创建sky_take_out数据库后新建查询
导入sql脚本后运行后就有数据了
然后启动所有的服务。
# 重启
docker compose restart
测试
管理端测试
在登录进去后,建议手动进行一下营业状态设置,这样我们的redis中就有SHOP_STATUS这个字段了。
redis测试
使用Another Redis Desktop Manager测试可以正常连接
微信小程序用户端测试
微信小程序需要做一些修改
在微信开发者工具中,找到vendor.js文件。
ctrl+f 搜索 baseUrl,将baseUrl的值修改为如下:
localhost改成服务器公网IP
然后编译运行我们的微信小程序
登录微信后查询几条数据没有任何问题
另外我们redis中的字段也有了
问题解决
问题一:redis中无status字段解决
当我们部署好所有服务后,第一次登录管理端,会有一个报错,如图:
这是因为我们的redis数据库中还没有SHOP_STATUS这个字段。
我们需要登录端后手动设置一下营业状态
这样我们的redis中就有这个字段了
然后我们退出后重新登录就没有这个500错误了。
问题二:服务器上Mysql容器中的表数据会丢失
参考解决:提升mysql容器内权限
docker-compose.yml文件参考
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306:3306"
privileged: true
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
volumes:
- "./mysql/conf:/etc/mysql/conf.d"
- "./mysql/data:/var/lib/mysql"
- "./mysql/init:/docker-entrypoint-initdb.d"
networks:
- sky-net
redis:
image: redis
container_name: redis
ports:
- "6379:6379"
volumes:
- "./redis/data:/data"
depends_on:
- mysql
networks:
- sky-net
sky:
image: sky
container_name: sky
ports:
- "8080:8080"
depends_on:
- mysql
networks:
- sky-net
nginx:
image: nginx
container_name: nginx
ports:
- "80:80"
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/html:/usr/share/nginx/html"
depends_on:
- sky
networks:
- sky-net
networks:
sky-net:
name: sky-net