背景
18年换工作期间正好赶上国庆,然后有一段时间的断档期不知道该干嘛,正好双十一阿里活动,就和好基友一起买了个云主机,准备搭建一个个人博客玩玩,于是乎,买云主机,买域名,申请免费ssl证书,搭建WordPress博客系统,搭建好后就是优化了。
想网站名字,以及网站介绍,找网站图标,找网站背景图片,最后弄好了以后就搁置了,感觉网站还是不漂亮。
上周问同事一个问题,然后他给我发了一个博客,看完后突然觉得这个博客好好看,简洁,却很炫酷。
我的个人博客vlog.issue98.com
部署概述
安装docker --> docker安装mysql --> docker安装solo --> docker安装nginx --> docker安装lute
如果不做https的话,只在本地测试,那么其实又MySQL和solo就够了,不需要nginx,nginx的作用只是将https请求代理至solo
架构大概就上面这样,访问流量通过公网到系统网络,再到docker网桥,然后访问nginx 443端口,nginx将流量转到本地的80端口,solo监听在80端口,然后solo通过JDBC协议访问MySQL数据库,nginx,solo,MySQL都是用的主机网络,所以在主机上都会监听对应端口。
安装docker
docker分为企业版(docker-ee)和社区版(docker-ce),阿里的Centos镜像源默认是docker-1.13,我们使用的是docker社区版,docker-ce-18.06
是18年6月发布的,目前大多数企业都使用的这个版本,或者是docker-ce-18.09
.
- 添加docker镜像源
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 查看所有docker-ce版本
yum list all --showduplicates docker-ce
- 安装docker-ce-18.06
yum install docker-ce-18.06.1.ce-3.el7
- 启动docker并设置为开机自启动
systemctl start docker
systemctl enable docker
- 准备镜像
docker pull b3log/solo
docker pull mysql:5.6
docker pull nginx
docker images #查看
安装MySQL
# 安装mysql:5.6,直接docker run 他会自动去官方镜想下载
# MYSQL_ROOT_PASSWORD=你的数据库密码
docker run --name mysql -p 8306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
-p 8306:3306
:8306是宿主机监听的端口,3306是MySQL容器监听的端口,因为我机器上有WordPress,所以80``3306
是被占用的,所以换了一个,如果你本机3306端口没有被占用,就都写成3306就好
- 创建数据库
# docker安装的mysql默认允许远程连接,可以使用xshell等软件连接数据库
# 进入容器mysql
docker exec -it mysql bash
# 进入数据库 p后面跟你的密码
mysql -uroot -p123456
# 创建数据库(数据库名:solo;字符集utf8mb4;排序规则utf8mb4_general_ci)
create database solo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
# 出现Query OK, 1 row affected (0.00 sec)表示成功
#退出数据库
exit
#退出容器
exit
docker安装solo
- 如果你本机的
80
端口被占用了,可以用下面命令启动solo容器
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:8306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" \
b3log/solo --listen_port=8088 --server_scheme=http --server_host=192.168.16.4 --server_port=8088
参数说明
--env JDBC_PASSWORD="123456" 将 123456 换成你的密码
--listen_port=8088 容器监听的端口
--server_scheme=http 请求方式,暂时使用 http,后面我们会换成 https
--server_host=192.168.16.4 你云主机的IP,如果你有域名可以写域名
--server_port=8088 云主机监听的端口
注意:listen_port的端口要和server_port端口一致,不然进入网页可能会出现 Latke 配置错误
命令成功执行没有报错的话,通过docker ps
查看执行的容器列表中是否存在 solo,存在这表示启动成功,直接访问你的公网IP加:8088 即可访问你的博客,http://180.76.178.229:8088
- 如果要使用https,就需要修改一下solo容器的启动参数了
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:8306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" \
solo \
--listen_port=8080 \
--server_scheme=https \
--server_host=vlog.issue98.com \
--server_port=
--server_scheme=https
使用https协议,因为使用了https协议,所以就要配置nginx代理
docker安装nginx
# 切换到服务器根目录
cd /
# 创建主目录
mkdir dockerData
# 创建文件
mkdir dockerData/nginx dockerData/nginx/conf dockerData/nginx/logs dockerData/nginx/www dockerData/nginx/ssl
dockerData/nginx
用于存放 docker 下 nginx 自定义文件
dockerData/nginx/conf
存放 nginx 配置文件
dockerData/nginx/log
存放 nginx 日志文件
dockerData/nginx/www
存放 nginx 访问的资源文件
dockerData/nginx/ssl
存放 ssl 证书
- 启动 nginx
docker run --name nginx -p 8001:80 -d --rm nginx
由于solo使用了宿主机的80端口,所以这里使用宿主机的8001端口 - 导出配置文件
docker cp nginx:/etc/nginx/nginx.conf /dockerData/nginx/conf/nginx.conf
#导出配置文件 nginx.conf
docker cp nginx:/etc/nginx/conf.d /dockerData/nginx/conf/conf.d
#导出配置文件 nginx.conf
执行docker stop nginx
,会自动删除现在的 nginx 容器,然后执行如下命令
- 启动一个 nginx 容器
docker run -d -p 80:80 -p 443:443 --name nginx-1 \
-v /dockerData/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /dockerData/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /dockerData/nginx/ssl:/ssl/ \
-v /dockerData/nginx/www:/usr/share/nginx/html \
-v /dockerData/nginx/logs:/var/log/nginx nginx
- nginx配置文件
server {
listen 443;
server_name vlog.issue98.com;
ssl on;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
ssl_certificate /ssl/vlog.pem; #两个证书文件的名字
ssl_certificate_key /ssl/vlog.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://vlog.issue98.com:8080;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server{
listen 80;
server_name vlog.issue98.com;
rewrite ^(.*) https://$host$1 permanent;
}
下载证书,nginx类型,然后放到dockerData/nginx/ssl
目录下,名字和nginx配置文件里的匹配
docker 启用LUTE
- 获取最新镜像
docker pull b3log/lute-http
- 启动容器
docker run --detach --rm --network=host b3log/lute-http
- 停止 solo
docker stop solo
- 删除 solo
docker rm solo
- 运行下列命令,重启 solo,注意最后添加--lute_http=http://127.0.0.1:8249
如果你已经修改了solo的配置,添加了自己的文章等,不想丢失数据,可以用docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]
命令来保存solo镜像到本地
例如
docker commit e044f5c083cc solo-vlog:0.1
# 然后启动的时候将b3log/solo换成solo-vlog:0.1就行,CONTAINER可以通过docker ps来查看
- 启动LUTE
docker run --detach --name solo-lute --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:8306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" \
solo-sibo:0.2 \
--listen_port=8080 --server_scheme=https --server_host=vlog.issue98.com \
--server_port= \
--lute_http=http://127.0.0.1:8249