一、学习经历
学习地址(黑马程序员):01.Docker课程介绍_哔哩哔哩_bilibili
对应文档位置:Docs
先通过上面的视频对docker有一定的了解后,下面的讲解也会容易理解。
二、部署项目过程
注:以下通过ruoyi-plus进行部署
- 搭建基本的容器
- 创建自定义网络
docker network create pxh
- 创建数据库镜像和容器
docker run -d \
--name mysql \
-p 3307:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=sx123456 \
-v /docker/mysql/data:/var/lib/mysql \
-v /docker/mysql/conf:/etc/mysql/conf.d \
-v /docker/mysql/init:/docker-entrypoint-initdb.d \
--network pxh\
mysql:5.7.36
创建时要注意数据库的root密码,后期可以直接使用。
映射地址要提前建立,否则程序会报错。
如果外网连接不到:
- 防火墙没开
- 没有使用映射的端口,上面访问数据应该用3307
- 账号root没有给权限访问,这可以百度一下有相应的解决办法
- 其他
- 创建redis镜像和容器
docker run \
--restart=always \
--log-opt max-size=100m \
--log-opt max-file=5 \
-p 16379:6379 \
--name redis \
-v /docker/redis/conf/redis.conf:/etc/redis/redis.conf \
-v /docker/redis/data:/data \
-d redis redis-server /etc/redis/redis.conf \
--appendonly yes
Redis创建时可以设置一个密码,具体配置可以看官方文档。
Redis在连接过程中注意防火墙要开着。
- 创建项目镜像和容器
这里就是具体的项目搭建了,注意每一个模块(jar)都要单独搭建,不然启动的时候他不会全部启动(亲测认证)。
- 创建脚本
# 基础镜像
FROM openjdk:17
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY 你的jar包名称 /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
这里要注意的是jdk的版本要对呀你项目的版本。
- 把打包好的jar包和上面的脚本放到同一个文件夹里面
- 打包好后如下
- 创建项目镜像和容器
- 将创建好的demo放到服务指定位置(这个位置你自己管理)
- 进入某个文件 cd /root/demo-system
- 执行下面两天代码:
docker build -t jarsxweb-system .
docker run -d --name jarsxweb-system --network sxweb jarsxweb-system
- 如果有启动顺序,请安装启动的顺序执行
- 创建nginx镜像和容器
docker run -d \
--name nginx \
-p 806:806 \
-v /docker/nginx/html:/usr/share/nginx/html \
-v /docker/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /docker/nginx/cert:/etc/nginx/cert \
--network pxh \
nginx:1.24.0
这里需要注意的是你映射的端口一定是你需要部署项目的端口,可以映射多个端口。
防火墙记得开,不然页面访问不到。
- 配置nginx
全部启动后
就是这个样子,非常的舒心!
Nginx的配置主要就是地址转发一定要用容器名,localhost和127.0.0.1都无法访问,因为自定义的网桥里面没有分配这个ip。
具体配置,见附件1
- 结束
配置好后重新启动一下nginx就可以正常访问了。
三、踩坑过程
1、先来个总结:
- 自定义的网桥 没有localhost和127.0.0.1 ,因此在我们项目搭建工程中如遇到项目直接的访问,只能用容器名去访问,如果通过 localhost和127.0.0.1 就会访问不到!
- 还是上面那个
2、坑1
启动jarsxweb-gateway 的时候报了一个错,当时我想的nacos连接不上,然后百度了很久,总的说是 还有两个端口没开 然后我把另外两个端口映射出去,并且开了防火墙,但是没有,还是这个问题。
我又去问是不是因为网桥内还有端口限制。但是给的答案是没有端口限制,也就是说同一个网桥内的所有容器都是互通的,没有防火墙之类的端口拦截。
最后反复去看配置文件,偶然发现,原来是gateway 在访问nacos的时候竟然用的是ip访问。
修改好后就可以正常启动了。
3、坑2
后端全部起来后,前端依旧无法访问,一直报错:没有token。经过再三确认前后的都没有问题下。我把目光放到了nginx!
在nginx中通常我们配置地址转发的时候,都会如上黑色背景图配置。我猛然发现,这个localhost是如此的显眼!在把localhosat改成容器名后也能够正常访问了,
但是随之而来又出现了一个问题,登录的时候报错:没有访问权限
我找呀找,看呀看,问呀问。最后还是把目光放在nginx上,原来是在地址转发的时候,没有配置请求的路径头
以往我们配置文件都不会配置这个路径头,因为在转发的时候他会把原来的请求路径头给干掉,然后我们配置的路径,因此,之前配置的时候没有加上这个system,在网关转发的时候找不到路径。
4、坑3
Redis连接不上!Nacos里面全局配置,记得改过来