概述

本着学习 Docker 的技术,无意中找到dafsic写的一篇“使用 docker 搭建 solo 博客系统”, 以前搭建的博客都是基于 WordPress 或使用 Hero 基于 github 的博客,感谢 dafsic 和 solo 开源博客系统!本文基于 dafsic 进行适当的增删并添加生成 SSL 证书,使用 https 访问 solo 博客系统。

方法

一、 准备环境

主机和域名:选择腾讯云,感谢 TVP 组织的赞助,选择的主机是 1 核、1G、50G 的香港主机,操作系统 ubuntu 16.04;证书选择免费的 Let's Encrypt。

二、 安装 docker-ce

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

大致安装步骤如下,使用在线安装模式:
设置存储库

1. 更新 apt 包索引

$ sudo apt-get update

2. 安装包以允许 apt 通过 HTTPS 使用存储库

$ sudo apt-get install
apt-transport-https
ca-certificates
curl
software-properties-common

3. 添加 Docker 的官方 GPG 密钥

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

4.9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 通过搜索指纹的最后 8 个字符,验证您现在拥有带指纹的密钥

$ sudo apt-key fingerprint 0EBFCD88

pub 4096R/0EBFCD88 2017-02-22
Key fingerprint = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid Docker Release (CE deb) docker@docker.com
sub 4096R/F273FCD8 2017-02-22

5. 使用以下命令设置稳定存储库

$ sudo add-apt-repository
"deb [arch=amd64] https://download.docker.com/linux/ubuntu
$(lsb_release -cs)
stable"

安装 DOCKER CE

1. 更新 apt 包索引

$ sudo apt-get update

2. 安装最新版本的 Docker CE

$ sudo apt-get install docker-ce

3. 验证安装版本

$ sudo apt-get install docker-ce=

4. 通过运行 hello-world 映像验证是否正确安装了 Docker CE

$ sudo docker run hello-world

三、 安装数据库 mysql

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 exec -it database bash
登陆数据库:mysql -uroot -p,输入密码 password,执行下面的语句

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

五、 下载最新的 Solo 包

最新版本是 solo-2.9.5.war,下载地址:https://pan.baidu.com/s/1dzk7SU,下载完成上传到 /web/solo/ 目录下

六、 安装 tomcat

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

选项说明如下:

  • --name tomcat设置容器名称,方便以后引用

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

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

  • -ddeamon

七、 设置配置文件并访问

vim /web/solo/solo-2.9.5/WEB-INF/classes/latke.properties 编辑 latke.properties, 修改serverHost=0755yang.com,修改serverPort=8080

执行完上面的步骤,重启 tomcat 容器(docker restart tomcat), 在浏览器中可以正常访问你的博客,我的是http://0755yang.com:8080/solo-2.9.5, 对数据库进行初始化。为了不加 solo-2.9.5 这样的路径,我将 /web/solo/solo-2.9.5 路径下的文件都 mv 到 /web/solo/ROOT/ 路径下了 ( 注意,移动前要先删除 tomcat 默认的文件和目录rm -rf /web/solo/ROOT/* ,然后再执行移动mv -f /web/solo/solo-2.9.5/* /web/solo/ROOT/),然后可以不加子目录访问http://0755yang.com:8080

八、 申请 Let's Encrypt SSL 证书

申请 Let's Encrypt SSL 证书,也是采用 docker 的方式,参考文章https://www.jianshu.com/p/5afc6bbeb28c

-- 先停止占用 80 端口的容器(如果有的话)
docker stop tomcat nginx
-- 申请 SSL 证书
docker run --rm -p 80:80 -p 443:443 \ -v /etc/letsencrypt:/etc/letsencrypt \ quay.io/letsencrypt/letsencrypt auth \ --standalone -m stedey.sheng@gmail.com --agree-tos \ -d 0755yang.com
-- 申请完成, 证书保存目录 /etc/letsencrypt
- Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/0755yang.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/0755yang.com/privkey.pem

九、 安装 nginx 并配置 SSL 证书

安装 nginx 前先创建目录 mkdir -p /web/nginx/conf,mkdir -p /web/nginx/log,创建 nginx.conf(/web/nginx/conf/nginx.conf),内容如下:
server { listen 80; listen 443 ssl; server_name 0755yang.com; ssl_certificate /etc/letsencrypt/live/0755yang.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/0755yang.com/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; location / { proxy_pass http://tomcat:8080; } }
创建完目录和 nginx.conf 文件后,安装 nginx 并配置 SSL 证书
docker run --name nginx -d -p 80:80 -p 443:443 \ --link tomcat:tomcat \ -v /web/nginx/conf:/etc/nginx/conf.d \ -v /web/nginx/log:/var/log/nginx \ -v /etc/letsencrypt:/etc/letsencrypt nginx

十、 修改 solo 配置文件支持 https

vim /web/solo/ROOT/WEB-INF/classes/latke.properties 编辑 latke.properties 文件,修改serverScheme=https,serverHost=0755yang.com,serverPort=443

重启 tomcat,nginx 容器生效:

docker restart tomcat nginx

十一、 修改 solo 配置文件支持上传本地图片

如果你想上传文件到服务器本地,请将 solo.properties 中的 uploadDir 项配置为要服务器上保存上传文件的目录路径,比如 /home/solo/upload/,D:\solo\upload\。请注意,一旦配置了该项,则优先使用文件上传服务器本地,不会上传到七牛云。

备注

现在可以通过https://0755yang.com访问博客小站了 ~~,有一点不完美,输入0755yang.com不能自动跳转到https://0755yang.com,未完待续!

  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销, 可以很容易地在机器和数据中心中运行。最重要的是, 他们不依赖于任何语言、框架或包括系统。

    135 引用 • 200 回帖 • 807 关注
  • Solo

    Solo 是一款小而美的 Java 博客系统,通过一个命令就可以启动使用。

    381 引用 • 3226 回帖 • 704 关注
感谢    关注    收藏    赞同    反对    举报    分享