情景复现
打开cd系统,显示未知错误,打开控制台报错信息如下:
该错误暴露出两个错误:
- cd 系统不应该走mock 环境 (拦截器配置的)
- 后台服务没有起来
远程操控服务器,查看为什么后台服务器没有起来。
ssh 连接登录上服务器 (连上了VPN 我的计算机和目标服务器是同一局域网下,所以未指定端口号)
ssh 用户名@目标服务器ip地址
ssh wu@192.168.1.1
解决问题
尝试启动后台容器
docker ps -a 发现后台的容器没有启动的。状态是Exited
docker start 容器名
docker ps -a
启动容器,再次查看是否启动,发现状态还是Exited, 未正常启动,下一步查看日志为什么容器未能正常启动。
docker logs 容器名
连接192.169.1.100这台机器的8080端口服务超时。
错误的思路:
需要登录192.168.1.100 查看8080 端口的服务是否开着服务。
老师指导后的思路:
查看192.168.1.100 的具体配置项
疑惑:我想的是进入容器查看容器的配置,但容器是未启动的,进不去,应该去哪里查看配置。一头雾水
CD系统的配置在.gitlab-ci.yml文件
cd配置,在deploy 部署中,大概干了如下的几个操作:
其中api容器就是 后台服务容器。创建容器的代码如下:
docker create --cpus=2 --memory=4G --name=${PROJECT_NAME}-api \
--network=${PROJECT_NAME}-network \
--workdir=/opt/app \
-v /home/app/${PROJECT_NAME}:/opt/app \
adoptopenjdk/openjdk8:jre8u282-b08-debian \
java -jar app.jar \
--spring.config.location=/opt/app/
每个容器就是一个小的操作系统
cpus: 设置cpu数量
memory: 设置内存大小
network: 设置容器连接的网络名称
-v: 将宿主机的内容挂载到容器中 宿主机地址/home/app/${PROJECT_NAME}, 容器中的地址:/opt/app。
java -jar app.jar --spring.config.location=/opt/app/ 容器启动spring-boot的命令,--spring.config.location=/opt/app/ 该配置设置了启动的配置文件在/opt/app 中。
spring-boot的启动文件一般是application.yml 或者是application.properties
宿主机:/home/app/${PROJECT_NAME}/c下有启动文件。
查看application.yml 启动文件:
并未发现192.168.1.100 对应的配置项。
嗯嗯嗯....又不知道怎么办了。
重新查看docker日志
可能是docker看的日志不对了,需要清空docker 容器的日志,然后在重启docker
docker ps -aq | xargs docker inspect --format='{{.LogPath}}'
docker inspect --format='{{.LogPath}}' 容器id
docker start 容器名
docker logs 容器名
依次执行上述命令。在日志中看见了问题:
flyway的错误。
1 在flyway_schema_history表中删除一条1.8__xxxxx的修改。
2 看1.8__xxxxx中修改了数据表的什么,去撤回修改。
执行上述两个操作应该就能解决问题。
由于害怕不小心操作错误, 所以先本地修复,在去服务器上修复。
先在服务器备份一份当前的数据。
tar czf /home/app/${PROJECT_NAME}/backups/dbbackup-2024-09-25-15-23.tar.gz /home/app/${PROJECT_NAME}/db
在本地拉数据。
sudo scp -r yunzhi@192.168.xx.xx:/home/app/tute-lab-schedule/backups/dbbackup-2024-09-25-15-23.tar.gz /Users/wu/Documents/sqldocument
解压后,就得到了当前CD 系统上的数据。
恢复数据。又又卡了。
最后的思路:
1 先要解决上面恢复数据的bug
2 进入容器
3 在flyway_schema_history表中删除一条1.8__xxxxx的修改。
4 看1.8__xxxxx中修改了数据表的什么,去撤回修改。
5 将这些命令去服务器端在执行一遍,应该就解决了。
补充 docker容器间的通信
最后
docker每个容器就是一个小的操作系统。要分清是在宿主机中还是在docker 容器中执行对应的命令。希望这篇文章能对您有所帮助!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。