最近我在宝塔面板升级一个叫
newapi
的 Docker 应用,本以为是简单的换个镜像,没想到一连串问题让我从容器网络、端口、Redis 到.env
文件都踩了个遍……整理成经验贴,希望能帮到大家!
🎯 背景
我原本在宝塔面板里跑了一个基于 Docker 的服务 newapi
,一共用了三个容器:
newapi_ckb5-new-api-1
:主程序容器newapi_ckb5-redis-1
:Redis 容器newapi_ckb5-mysql-1
:MySQL 容器
这套服务运行了好几个月,最近换了新镜像 calciumion/new-api:latest
,想着点一下升级就完事了,结果是:没了……
❌ 升级后直接 502
最初在宝塔里点击了镜像升级 + 强制拉取镜像,系统提示容器更新失败、IP 分配异常,并回滚了旧容器。
🚩问题分析:
- Docker 网络
baota_net
是我自己建的,但没有指定子网 - 导致无法自动分配 IP、也无法识别容器名通信
✅解决方法:
手动删除旧网络,重新指定子网再创建:
docker network rm baota_net
docker network create --subnet=172.18.0.0/16 baota_net
然后把所有相关容器重新加进去:
docker network connect baota_net newapi_ckb5-redis-1
docker network connect baota_net newapi_ckb5-mysql-1
docker network connect baota_net newapi_ckb5-new-api-1
🧱 502 问题搞定后,容器又无限重启?
我还没缓过来,结果主程序容器一直“启动 ➜ 崩溃 ➜ 重启”,根本进不去,连 netstat 都查不了,提示:
Container is restarting, wait until the container is running
用 docker logs
一看:
[FATAL] Redis ping test failed: lookup redis on 127.0.0.11:53: no such host
[SYS] 未找到 .env 文件,使用默认环境变量
🚩问题分析:
- 程序里 Redis 默认地址是
redis://redis
,但容器之间并不认识redis
- 没有
.env
文件,也没设置环境变量,导致默认配置起作用 - 程序用不了 Redis 就直接挂了,容器不停重启
✅终极解决方案:
别用 .env
文件,直接在宝塔容器设置里添加环境变量最省事!
我在宝塔面板 → Docker → 编辑容器,添加了以下环境变量 👇
REDIS_CONN_STRING=redis://newapi_ckb5-redis-1:6379
SQL_DSN=root:我的密码@tcp(newapi_ckb5-mysql-1:3306)/new-api
保存后,容器瞬间不再重启,服务也正常跑起来了!
❓期间还遇到的小坑:
- Redis 的 6379 端口 不需要映射,只要在同一 Docker 网络就能直接通信。
- MySQL 容器没监听端口?执行
netstat -tlnp
发现压根没跑——结果是 Docker 容器启动慢了点,API 容器先连接失败了。解决:重启 MySQL 后再启动主容器。 - 宝塔 Docker 面板每次“保存配置”=重建容器,如果参数错了会直接失败并回滚,容易让人摸不着头脑。
✅ 最终结果
成功升级 newapi
到新版镜像,所有容器稳定运行:
- Nginx 反向代理 3000 端口到 HTTPS ✅
- Redis、MySQL 正常通信 ✅
- 日志清爽无报错 ✅
🎁 总结经验
问题 | 建议 |
---|---|
自定义 Docker 网络 | 创建时要加 --subnet ,否则容器名解析失败 |
容器间通信 | 用容器名 + 端口,比如 newapi_ckb5-redis-1:6379 |
配置管理 | 用宝塔“环境变量”比 .env 文件方便稳定 |
宝塔 Docker“保存”按钮 | 实际会重建容器,配置错误会还原 |
如果你也在宝塔上用 Docker,想升级服务,一定要注意:
不是简单换个镜像就完事,环境变量、网络、端口、服务依赖,样样都可能出问题!
© 版权声明
文章版权归作者所有,未经允许请勿转载。