这里我用的是springboot作为后端服务+Vue3写前端服务+MySQL
准备Linux服务器/虚拟机-centos7.9
文章参考:
20-项目部署(Docker) - 飞书云文档 (feishu.cn)
安装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库
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
配置镜像加速(直接全部复制过去执行就行了)
# 创建目录
rm -f /etc/docker/daemon.json
# 复制内容
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://mirrors.tuna.tsinghua.edu.cn",
"http://mirrors.sohu.com",
"https://ustc-edu-cn.mirror.aliyuncs.com",
"https://ccr.ccs.tencentyun.com",
"https://docker.m.daocloud.io",
"https://docker.awsl9527.cn"
]
}
EOF
# 重新加载配置
systemctl daemon-reload
# 重启Docker
systemctl restart docker
至此,docker安装完毕
部署前端(nginx)
示例:
# 第1步,去DockerHub查看nginx镜像仓库及相关信息
# 第2步,拉取Nginx镜像 (比较耗时)
docker pull nginx:1.20.2
# 第3步,查看镜像
docker images
# 第4步,创建并允许Nginx容器
docker run -d --name nginx -p 80:80 nginx
# 第5步,查看运行中容器
docker ps
# 也可以加格式化方式访问,格式会更加清爽
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 第6步,访问网页,地址:http://虚拟机地址
# 第7步,停止容器
docker stop nginx
# 第8步,查看所有容器
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 第9步,再次启动nginx容器
docker start nginx
# 第10步,再次查看容器
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 第11步,查看容器详细信息
docker inspect nginx
# 第12步,进入容器,查看容器内目录
docker exec -it nginx bash
# 或者,可以进入MySQL
docker exec -it mysql mysql -uroot -p
# 第13步,删除容器
docker rm nginx
# 发现无法删除,因为容器运行中,强制删除容器
docker rm -f nginx
示例中只挂载了html数据卷,但是使用nginx一般还需要挂载conf配置文件
我按照上面的配置配置好后出现的问题是启动nginx后,进入项目页面后刷新页面会出现404,需要配置一下nginx.conf文件
参考:
解决方案:
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html -v conf.d:/etc/nginx/conf.d nginx:1.20.2
这样进行数据挂载后,在 /var/lib/docker/volumes 这个路径下出现了两个文件
我们把前端打包好的项目放到html里面_data目录下,在conf.c文件夹中_data文件夹有一个default文件
在这个文件中添加一行,然后保存,再让nginx重启或重新加载配置文件
try_files $uri $uri/ /index.html;
docker exec nginx nginx -s reload
重新加载配置文件
当然,这里可以进行添加网络,我最开始忘了添加网络,导致最后测试不同,所以可以在原来的命令中添加
--network 网络名
我这里在最后添加
至此,nginx就安装完成,可以在外部网络通过Ip:80进行访问
部署MySQL
-
挂载
/root/mysql/data
到容器内的/var/lib/mysql
目录 -
挂载
/root/mysql/init
到容器内的/docker-entrypoint-initdb.d
目录(初始化的SQL脚本目录) -
挂载
/root/mysql/conf
到容器内的/etc/mysql/conf.d
目录(这个是MySQL配置文件目录)
docker run -d \
--name mysql \
-p 3307:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e TZ=Asia/Shanghai \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
-v /root/mysql/conf:/etc/mysql/conf.d \
mysql:8
在 /root/mysql 这个目录下分别创建三个文件夹,data、init、conf文件夹即可,执行命令后会进行自动挂载
此时,我们的数据库就已经安装完成并且数据挂载好了,然后在我打算用本地DataGrip连接远程的MySQL时又遇见新的问题
问题:远程无法连接,然后连接上又无法进行增删改查操作
解决方案:继续来服务器这里配置:
参考:
https://www.cnblogs.com/diamondhehua/p/15260708.html
https://blog.youkuaiyun.com/weixin_62524256/article/details/144243676
https://blog.youkuaiyun.com/m0_74825409/article/details/144299081
执行:
docker exec -it mysql bash
进入MySQL容器内部
mysql -uroot -p
然后输入我们的密码
123456
进入MySQL的服务
继续执行:
use mysql;
update user set host='%' where user='root' and host='localhost';
执行这句sql后出现了Error
查询:
select host,user from user where user='root';
发现存在这个用户,但是修改不知道为什么会失败
再次进入MySQL服务,然后执行添加用户的操作
create USER 'root1' identified by '123456';
这里可以看到受影响的行数为0,这里我问chatGPT,他回答的是,这里不会返回受影响的条数,只要没有报错就是执行成功。
GRANT ALL PRIVILEGES ON *.* TO 'root1'@'%' WITH GRANT OPTION;
继续执行这段代码进行授权
然后执行
FLUSH PRIVILEGES;
最后退出
后续,发现,还是没有增删改查的权限
再次进入MySQL服务,查询有这条数据
SELECT User, Host FROM mysql.user WHERE User = 'root';
然后再次授权
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
然后重复面的刷新操作
FLUSH PRIVILEGES;
然后再次退出
这次,我重启了MySQL(服务)容器
docker restart mysql
然后就好了,可以在本地连接和操作远程数据库
这里也需要将mysql添加到固定的网络中,我同样也是在最后添加
部署jdk以及后端服务
将数据库的数据源配置成docker中mysql的服务名即可,密码也修改成对应的密码
然后运行maven的打包插件,打成一个jar包
然后找到下载jdk17
然后准备一个Dockerfile
内容:
# 使用 CentOS 7 作为基础镜像
FROM centos:7
# 设置维护者信息
LABEL maintainer="wangjunwei"
# 添加 JDK 到镜像中
COPY jdk17.tar.gz /usr/local/
RUN tar -xzf /usr/local/jdk17.tar.gz -C /usr/local/ && rm /usr/local/jdk17.tar.gz
# 设置环境变量
ENV JAVA_HOME=/usr/local/jdk-17.0.10
ENV PATH=$JAVA_HOME/bin:$PATH
# 创建应用目录
RUN mkdir -p /pfms
WORKDIR /pfms
# 复制应用 JAR 文件到容器
COPY pfms-0.0.1-SNAPSHOT.jar pfms-0.0.1-SNAPSHOT.jar
# 暴露端口
EXPOSE 8080
# 运行命令
ENTRYPOINT ["java","-jar","/pfms/pfms-0.0.1-SNAPSHOT.jar"]
然后将准备好的三个文件上传到服务器的:/root/pfms目录下,
然后开始构建项目镜像
docker build -t pfms:2.0 .
构建好后通过:docker images可以查看到刚创建的pfms
启动容器
docker run -d --name pfms-server -p 8080:8080 pfms:2.0
这样项目就部署成功了
> 补充 :挂载日志
docker run -d --name pfms -v /utils/docker/pfms/log:/var/log -p 8081:8081 pfms:2.4
可以通过这个命令查看日志
docker logs -f 容器名
全部启动成功后,联调会发现上面的网络问题,由于没有添加到同一个网络中,所以,容器之间无法通信,
docker network create pfms-sys
docker network connect pfms-sys nginx
docker network connect pfms-sys pfms-server
docker network connect pfms-sys mysql
将三个容器添加到同一个网络后,再次联调没有问题了,另外,除了容器内部端口要开放外,还要在安全组中选择端口开放,要开放服务器的端口而不是容器内部端口。
项目链接:个人理财管理系统
到这里本文就进入尾声了,后续会发现问题还会持续更新...