使用 docker 搭建 solo 博客系统

本贴最后更新于 2317 天前,其中的信息可能已经斗转星移

概述

首先感谢开源,此博客使用的是 solo 博客系统。操作系统是 ubuntu,虚拟化容器 docker,数据库 mysql,java 容器 tomcat,反代 nginx。(不要问什么要用 docker,可能是我有轻微洁癖以及懒,至于为什么有洁癖和懒就要用 docker......)

方法

一、 准备环境

主机和域名,我这里的主机选择亚马逊的 ec2,免备案还能搭梯子,第一年免费。域名从 GoDaddy 买的,绑定域名到 ip

二、 安装 docker-ce

参考官方文档 https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/

三、 安装数据库 myslq:

docker run --name database -e MYSQL_ROOT_PASSWORD=password -v /web/mysql/data:/var/lib/mysql -v /web/mysql/conf:/etc/mysql/conf.d -d mysql:5.7.20

上面的命令在 bash 中执行,第一次会从 docker hub 下载 mysql:5.7.20 这个镜像,所以你的网络要能访问 docker hub。选项说明如下

  • --name database 设置容器名称,方便以后引用
  • -e MYSQL_ROOT_PASSWORD=password 设置数据库 root 账户密码为 password
  • -v /web/mysql/data:/var/lib/mysql 挂载宿主机的/web/mysql/data 目录到容器的/var/lib/mysql 目录,因为容器类似于虚拟机,只能把文件存放在自己的文件系统上,我们把宿主机的目录挂载到容器的这个目录上,当容器往/var/lib/mysql/这个目录保存数据文件时,实际会存放在宿主机的/web/mysql/data/目录下。因为容器是可以随时销毁的,无状态的,所以数据不能保存在容器中。(/var/lib/mysql/是 mysql 默认的数据存储路径)
  • -v /web/mysql/conf:/etc/mysql/conf.d 这样在宿主机的/web/mysql/conf/下的 conf 文件会被数据库读取并应用

详细说明请到 docker hub 上搜索 mysql 查看

四、 配置数据库:

进入数据库容器:docker exec -it database bash
登陆数据库:mysql -uroot -p,输入密码 password,执行下面的语句

CREATE DATABASE `solo` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE USER 'solouser'@'%' identified BY 'solo@pwd';
GRANT ALL ON solo.* TO 'solouser'@'%'; 
FLUSH PRIVILEGES;

五、 下载 solo-2.4.0.war 包

到 github 上找到 solo-2.4.0 的 war 包,下载到/web/solo/目录下

六、 安装 tomcat:

docker run --name tomcat  -p 8080:8080 -v /web/solo:/bitnami/tomcat/data --link database:database -d bitnami/tomcat:9.0

选项说明如下:

  • -p 8080:8080 端口映射,将容器中的 8080 端口映射到宿主机的 8080 端口,因为 tomcat 是在容器中运行,容器类似虚拟器,所以 tomcat 监听的是容器的 8080 端口,所以需要把它映射出来

  • --link database:database 连接数据库容器,第一个 database 是之前创建的容器名,第二个 database 是别名,名称可以随便。目的是为了访问方便,比如两个 tomcat 容器都监听 8080 端口,不可能都映射到宿主机上来吧。这样就可以在 tomcat 容器中访问数据库的 3306 端口了。

  • -d deamon

七、 设置配置文件并访问

参考 solo 用户指南,然后在浏览器中访问你的博客,我的是 http://www.dafsic.com:8080/solo-2.4.0, 对数据库进行初始化。为了不加 solo-2.4.0 这样的路径,我将/web/solo/solo-2.4.0/路径下的文件都 mv 到/web/solo/ROOT/路径下了,然后可以 http://www.dafsic.com:8080 这样访问

八、 重启 tomcat:

以上没有问题的话,删掉 tomcat 容器,在打开一个新的 tomcat 容器

docker stop tomcat #停容器
docker rm tomcat #删除容器
docker run --name tomcat -v /web/solo:/bitnami/tomcat/data --link database:database -d bitnami/tomcat:9.0 #不映射端口,映射的话,nginx 反代会出现上游服务不能被访问的错误

九、 安装 nginx:

docker run --name nginx -p 80:80 -v /web/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro --link tomcat:tomcat -d nginx:1.12.1

选项还是为了覆盖 nginx 的默认配置,以及链接 tomcat。

后记

nginx 最终配置:

user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;
    upstream backend {
        server tomcat:8080;
    }
    server {
        listen       80;
        server_name  www.dafsic.com;
        access_log off;
        location / {
            proxy_pass http://backend$request_uri;
            proxy_set_header  Host $host:$server_port;
            proxy_set_header  X-Real-IP  $remote_addr;
            client_max_body_size  10m;
        }
    }
}

latke.properties 最终 server 配置:

serverScheme=http
serverHost=dafsic.com
serverPort=80

local.properties 最终数据库部分配置:

runtimeDatabase=MYSQL
jdbc.username=bloguser
jdbc.password=bloguser@pwd
jdbc.driver=com.mysql.jdbc.Driver
jdbc.URL=jdbc:mysql://database:3306/solo?useUnicode=yes&characterEncoding=utf8
jdbc.pool=druid
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1425 引用 • 10043 回帖 • 468 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    476 引用 • 899 回帖 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • Ahian

    原来想用 Dockerfile 写,不过看到 GitHub 仓库里已经有 Dockerfile,所以就放弃了 😆

    1 回复
  • dafsic
    作者

    整个博客环境写在一个 dockerfile 里,最终就一个镜像?我之前也想搞一个,放到 docker hub 上,但又感觉不符合 linux 的哲学,一个容器还是只干一件事的好。

  • bingofang

    请问小编,你的 mysql 的数据库文件在哪弄的,能否分享下。。solo 用的是 H2,我想用 mysql😄

    1 回复
  • dafsic
    作者

    什么哪弄的,你自己搭一个 mysql 数据库,然后修改 solo 的配置文件,让它用你的数据库就好了