
背景
想用 docker 部署一个个人博客,记录一些生活,于是发现了 Solo 这个东西。查看了一些官方资料发现还需要使用数据库,似乎博客数据是保存在数据库中的。我使用的是 Windows 系统的电脑,docker 是在 WSL 中安装的。于是开始了踩坑之旅。
下载 solo
这一步比较简单,我使用的 docker desktop 直接下载的,或者命令行 pull 也是可以的 docker pull b3log/solo.
下载 MySQL
这一步开始踩坑了,一开始我的想法是既然 docker 要连接到数据库,那 MySQL 应该也要安装到 WSL 中,于是我在 WSL 中装了 MySQL,也按照官方教程配置好了,然后问题来了,当我执行 docker 时发现跑不起来,我也没多想就觉得是不是要安装在 Windows 中啊,于是又把 WSL 的卸载掉,在 Windows 中安装了。但是发现报错跟刚刚一模一样,没区别。报错信息如下:
[ERROR]-[2025-10-29 11:51:46]-[org.b3log.solo.service.InitService:173]: Check tables failed, please make sure database existed and database configuration [jdbc.*] in local.props is correct [msg=Communications link failure
问了 AI,结论是 Solo 没有和 MySQL 建立连接,于是我又想这 MySQL 到底应该安装到 WSL 中还是安装在 Windows 中,又问了 AI,它说应该安装在 WSL 中,哈哈哈,不过 AI 说在 Windows 中也可以,只需要改一些配置就行了。
配置参数
首先需要查询一下在 WSL 中宿主机的 IP 地址。
ip route show | grep default
将官方配置命令的 IP 修改为宿主机的 IP。
# 把127.0.0.1修改为宿主机的IP
docker run --detach --name solo --network=host \
--env RUNTIME_DB="MYSQL" \
--env JDBC_USERNAME="root" \
--env JDBC_PASSWORD="123456" \
--env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \
--env JDBC_URL="jdbc:mysql://127.0.0.1:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true" \
b3log/solo --listen_port=8080 --server_scheme=http --server_host=localhost --server_port=
此时会发现报错变成了一下内容
[ERROR]-[2025-10-29 11:59:52]-[org.b3log.solo.service.InitService:173]: Check tables failed, please make sure database existed and database configuration [jdbc.*] in local.props is correct [msg=null, message from server: "Host 'DESKTOP-XXXXXX.mshome.net' is not allowed to connect to this MySQL server"]
这个我个人认为还是因为我把 MySQL 安装到了 Windows 中,导致权限配置的有问题。问了 AI,只需要修改 MySQL 的配置即可
# 将127.0.0.1替换为报错信息中的DESKTOP-XXXXXX.mshome.net
create database solo default character set utf8mb4 collate utf8mb4_general_ci;
create user 'root'@'127.0.0.1' identified by '123456';
grant all privileges on *.* to 'root'@'127.0.0.1';
此时再运行 docker 应该就没问题了,但是有个问题,我的 8080 端口被别的程序占用了,所以我想替换为 8181,AI 说应该这样配置
# 把127.0.0.1修改为宿主机的IP
docker run --detach --name solo --network=host \
--env RUNTIME_DB="MYSQL" \
--env JDBC_USERNAME="root" \
--env JDBC_PASSWORD="123456" \
--env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \
--env JDBC_URL="jdbc:mysql://127.0.0.1:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true" \
b3log/solo --listen_port=8181 --server_scheme=http --server_host=localhost --server_port=8181
但是执行以后发现访问 8181 什么也没有,于是又问 AI,它这次换了个思路,不再使用 --networ=host,改为使用 -p 8181:8181,将主机的 8181 端口映射到容器的 8181 端口,再次运行后,Solo 成功启动。最终的 docker 命令如下
docker run -d --name solo -p 8181:8181 \
--env RUNTIME_DB="MYSQL" \
--env JDBC_USERNAME="root" \
--env JDBC_PASSWORD="123456" \
--env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \
--env JDBC_URL="jdbc:mysql://host.docker.internal:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true" \
b3log/solo --listen_port=8181 --server_scheme=http --server_host=localhost --server_port=8181
官方配置文档参考(Solo 用户指南 - 链滴)