從0開始搭建博客
1. 概述
本篇博客,我教大家從0開始搭建一個 bolo博客,bolo 博客 和 solo 博客的區別是皮膚更加多,并且可以帳號密碼登錄。
本篇博客主要的內容如下:
- linux 安裝 docker,設置docker鏡像加速
- docker 安裝 nginx
- docker 的一些常用的命令
- docker 安裝 mysql 數據庫
- docker 安裝 solo 博客
- nginx 配置 https 證書
1.1 涉及技術
本篇博客,將會使用到一下的相關知識:
- dokcer
- mysql
- 阿里云服務器
- nginx
- https
- java
- ...
2. docker
首先,我們需要購買一臺阿里云的服務器,然后,就開始安裝服務器的基本軟件了,因為 solo 博客、mysql、nginx 等軟件的安裝都依賴 docker,所以,我們的第一步就是安裝 docker 容器。
2.1 docker 的安裝
因為系統是我們剛買的 ecs,所以無需像網上一樣,yum 卸載 docker。
設置 docker 安裝鏡像,如果不設置的話,docker 安裝起來會特別的慢。
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
這里我使用的是阿里云的鏡像源
安裝 docker
yum install docker-ce docker-ce-cli containerd.io
啟動 docker
systemctl start docker
運行 docker hello world
docker run hello-world
2.2 設置 docker 的鏡像加速
國內從 DockerHub 拉取鏡像有時會遇到困難,此時可以配置鏡像加速器。Docker 官方和國內很多云服務商都提供了國內加速器服務。這里我使用的鏡像加速使用的是阿里云的。
阿里云鏡像獲取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,登陸后,左側菜單選中鏡像加速器就可以看到你的專屬地址了:

配置阿里云鏡像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://zoi3dt5d.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
3. nginx
3.1 安裝 nginx
這里的 nginx 我采用的是 docker 安裝,因為需要 nginx 配置域名的 https,因此,我們需要把 nginx 的配置文件掛載在主機目錄
docker run -d --name nginx -p 80:80 -p 443:443 \
-v /opt/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /opt/nginx/logs:/var/log/nginx \
-v /opt/nginx/html:/usr/share/nginx/html \
-v /opt/nginx/conf:/etc/nginx/conf.d \
-v /opt/nginx/ssl:/root/ssl \
--privileged=true \
nginx
下面,我來解釋下個參數的意義:
-d:后臺運行 nginx 容器--name nginx:指定 nginx 的容器名為 nginx-p 80:80:將容器的 80 端口映射到主機 80 端口,ps:前面的端口為主機端口-p 443:443:將容器的 443 端口映射到主機 443 端口, ps:443端口為 https 端口,后續配置 https 我們將使用到這個端口-v /opt/nginx/nginx.conf:/etc/nginx/nginx.conf:將 nginx 的配置文件映射到主機,ps:前面為主機目錄,后面為 nginx 的容器目錄-v /opt/nginx/logs:/var/log/nginx:將 nginx 的日志文件映射到主機-v /opt/nginx/html:/usr/share/nginx/html:將 nginx 的 html 靜態文件映射到主機-v /opt/nginx/conf:/etc/nginx/conf.d:將 nginx 的配置文件夾映射到主機-v /opt/nginx/ssl:/root/ssl:將 主機的 ssl https 密匙,映射到 nginx 的 /root/ssl 目錄--privileged=true:容器用戶運行 root 權限
我們可以使用一下的一些命令,查看容器的運行情況:
docker ps:查看正在運行的容器,如果 nginx 運行成功了,這里會顯示 nginx 的容器docker exec -it nginx /bin/bash:進入 nginx 容器里面,查看容器內部的運行情況docker stats:查看容器的基本內存、cpu占用情況docker logs nginx:查看 nginx 容器運行的日志
3.2 docker 的一些命令
下面是以上的一些命令的截圖:




4. mysql
4.1 安裝 mysql
為了簡單方便,我這里安裝 mysql 的方式是采用 dokcer 安裝。
docker run -d --name mysql -p 3306:3306 \
-v /opt/mysql/conf.d:/etc/mysql/conf.d \
-v /opt/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=我的密碼 \
mysql
以下是相關命令解釋:
-p 3306:3306:將容器的 3306 端口映射到主機
-v /opt/mysql/conf.d:/etc/mysql/conf.d:將 mysql 的配置文件映射到主機
-v /opt/mysql/data:/var/lib/mysql:將 mysql 的數據文件映射到主機
-e MYSQL_ROOT_PASSWORD=我的密碼: 設置 mysql root 密碼
4.2 mysql 允許外網訪問
進入 mysql 容器
docker exec -it mysql /bin/bash
登錄 mysql
mysql -uroot -p
設置 root 可外網訪問
GRANT ALL ON *.* TO 'root'@'%';
flush privileges;
開放阿里云服務的 3306 端口,使用 Navicat 進行連接吧!
5. bolo
5.1 安裝 git
yum install git
5.2 拉取源碼
git clone https://github.com/adlered/bolo-solo.git
如果拉取的速度很慢,可按照我下面的方式,設置一個鏡像:
瀏覽器下載一個 GitHub 加速的插件,下載完成后刷新頁面,GitHub頁面會變成下面:

選擇合適的鏡像,下載即可,
下載完成后,修改 .git/config
5.3 構建鏡像
我們是需要 https 訪問的,所以需要做如下的操作:
前往項目根目錄下 src/main/resources目錄,編輯 latkes.properties文件,將 http修改為 https,即可使用 https 訪問。
進入項目根目錄,執行一下的命令
docker build -t "bolo" .
5.4 運行 bolo
運行下面的腳本
docker run -it -d -p8080:8080 \
--env RUNTIME_DB="MYSQL" \
--env JDBC_USERNAME="root" \
--env JDBC_PASSWORD="**" \
--env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \
--env JDBC_URL="jdbc:mysql://172.18.0.24:3306/bolo_blog?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" \
--rm \
bolo --listen_port=8080 --server_scheme=https --server_host=blog.booleandev.xyz
參數解釋:
-p8080:8080:容器與主機的端口映射
--env RUNTIME_DB="MYSQL": 數據庫
--env JDBC_USERNAME="root": 數據庫用戶名
--env JDBC_PASSWORD="**":數據庫密碼
--env JDBC_DRIVER="com.mysql.cj.jdbc.Driver":數據庫驅動
--env JDBC_URL="jdbc:mysql://172.18.0.24:3306/bolo_blog?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC":數據庫鏈接
--listen_port=8080:bolo容器監聽端口
--server_scheme=https:http or https
--server_host=blog.booleandev.xyz:域名
5.5 相關解釋
相信大家注意到,bolo 連接的數據庫鏈接為 172.18.0.24,而不是 127.0.0.1,這是為什么呢?
因為 bolo 博客和主機運行的不是一個網絡,所以無法通過 127.0.0.1 進行訪問,容器和宿主機的網絡通信是橋接,那么宿主機和docker會有兩個網卡,eth0和docker0,docker0是容器之間的一個路由,eth0是宿主機的ip路由,兩個路由可以直接通信,所以,只要找到宿主機的eth0網卡即可。
下面是我的網卡信息:
[root@booleandev .git]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:51ff:fe42:367d prefixlen 64 scopeid 0x20<link>
ether 02:42:51:42:36:7d txqueuelen 0 (Ethernet)
RX packets 453368 bytes 233613690 (222.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 496030 bytes 492850722 (470.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.18.0.24 netmask 255.255.240.0 broadcast 172.18.15.255
inet6 fe80::216:3eff:fe02:edf2 prefixlen 64 scopeid 0x20<link>
ether 00:16:3e:02:ed:f2 txqueuelen 1000 (Ethernet)
RX packets 1798448 bytes 2109780912 (1.9 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 632237 bytes 320525103 (305.6 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 372 bytes 73305 (71.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 372 bytes 73305 (71.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth1376aef: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::30c7:fdff:fe57:22fd prefixlen 64 scopeid 0x20<link>
ether 32:c7:fd:57:22:fd txqueuelen 0 (Ethernet)
RX packets 41327 bytes 41068253 (39.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 38087 bytes 35132337 (33.5 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
因此,solo 容器需要訪問數據庫,只需要使用 eth0地址即可
5.6 驗證 solo 部署成功
以上,solo 的本地部署就完成了,所以我們需要驗證下是否部署成功,使用
curl 127.0.0.1:8080
如果出現了 html,則說明部署成功了
如果出現相應的錯誤的話,則只需要 dokcer run 時,把 -d 參數去除,即可以看到錯誤信息
6. https
6.1 申請 https 證書
https 證書一般可以到你購買域名的位置申請即可。我這里使用的是騰訊云生成的證書,下載完文件后,出現以下幾個文件:

因為我們采用 nginx,所以只需要把 Nginx 下的兩個文件移到 nginx 的映射目錄 /opt/nginx/ssl 下即可
6.2 配置 nginx
修改 /opt/nginx/nginx.conf
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;
# 為了避免文件過長,將其它的配置包含進來
include /etc/nginx/conf.d/*.conf;
}
編寫 /opt/nginx/conf/blog.conf
server {
listen 443 ssl http2;
server_name blog.booleandev.xyz;
ssl_certificate /root/ssl/1_blog.booleandev.xyz_bundle.crt;
ssl_certificate_key /root/ssl/2_blog.booleandev.xyz.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# 文件目錄
location / {
proxy_pass http://172.18.0.24:8080; # 內網IP
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Scheme $scheme;
}
}
server {
listen 80;
server_name blog.booleandev.xyz;
return 301 https://$server_name$request_uri;
}
6.3 修改域名解析
域名解析添加一個 A 記錄,我這里使用的是騰訊云的域名,配置頁面大致如下:

7. 成功
輸入 https://blog.booleandev.xyz,即成功!


浙公網安備 33010602011771號