使用Docker搭建Halo博客
搭建步骤
- 阿里购买域名(购买后需要3天左右才能进行备案)
- 阿里购买服务器(ECS)
- 项目搭建
- 安装Docker
- 安装MySQL(选)
- 安装Halo
- 安装Nginx
- 安装fail2ban
- 公安联网备案
假装你已经有了一个Linux服务器🙂
安装Docker
1. 更新yum
yum update
2. 卸载旧版Docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine \
docker-selinux
3. 安装docker必要的软件包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
4. 添加docker的yum源才能下载,这里使用阿里镜像
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5. 创建yum缓存,可加快下载操作速度
yum makecache
6. 安装docker、docker-cli
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
7. 验证,可以看到版本号就成功啦
docker --version
8. 启动Docker
# 启动
systemctl start docker
# 停止
systemctl stop docker
# 重启
systemctl restart docker
# 查看状态:显示绿色的Active: active(running),则启动成功
systemctl status docker
# 设置开机自启
systemctl enable docker
# 退出:Ctrl+C
9. 创建文件夹放配置文件:halo、nginx、mysql
mkdir -p /blog/{halo,nginx,mysql}
10. Docker相关指令解释
镜像相关
# 获取镜像
docker pull <容器>:版本号
# 获取最新镜像,相当于:docker pull <容器>:lasted
docker pull <容器>
# 查看所有镜像
docker images
# 为镜像创建新标签(会新增一个改过名的镜像)
docker tag <源镜像名称>:<源标签> <新镜像名称>:<新标签>
# 删除镜像
docker rmi <镜像名称>:<标签>
docker rmi <镜像ID>
容器启动命令
docker run <容器>
基本参数
-d: 在后台运行容器并打印容器ID,适合运行守护进程(如Web服务器)。-i:保持STDIN(标准输入)打开,用于交互式应用(如命令行工具)。-t:分配一个伪终端(TTY),通常与-i一起使用,模拟真实终端环境。--name:为容器指定一个名称。-p:将容器端口映射到宿主机端口,允许外部访问容器内的服务。-v:容器卷技术,容器中的数据本身存放于容器中,一旦删除容器,数据也会随之删除,可以将文件挂载到宿主机中,删除时只会删除容器本身。对被挂载的文件进行修改时,也会影响容器。类似双向绑定,用于持久化数据或共享文件。-e:设置环境变量的参数,可以在启动容器时向容器内部传递环境变量--restart:设置容器的重启策略。always my_image:总是重启。on-failure:仅在失败时重启。no:不会重启。unless-stopped:容器总是会自动重启,除非它被手动停止,或者Docker本身被停止。on-failure:<max-retries>: 仅当容器以非零状态退出时,容器会自动重启,但重启次数最多为指定的<max-retries>次
--priviledged=true:获取访问宿主机的权限
# 进入容器指令(容器内必须有bash)
docker exec -it <容器> bash
# 退出容器指令
输入 exit 或按 Ctrl+D
# 查看运行中的容器
docker ps
# 查看所有容器,包括运行中的,如果容器状态一直是exit或retry,说明启动失败
docker ps -a
# 删除容器
docker rm -f <容器>
安装MySQL
Halo默认使用H2数据库,但是容易损坏,建议换成其他如MySQL等Halo支持的数据库。
1. 获取镜像
docker pull mysql
2. 创建文件夹用于挂载数据
mkdir -p /blog/mysql/{conf,data,log}
3. 创建配置文件
touch /blog/mysql/conf/my.cnf
4. 配置中写入内容
vim /blog/mysql/conf/my.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Custom config should go here
!includedir /etc/mysql/conf.d/
5. 配置目录权限
chmod 777 /blog/mysql/data /blog/mysql/log
# 配置文件必须设置644权限,否则会报错无效
chmod 644 /blog/mysql/conf/my.cnf
6. 启动镜像
docker run \
--name mysql -p 3306:3306 \
-v /blog/mysql/data:/var/lib/mysql \
-v /blog/mysql/config:/etc/mysql/conf.d \
-v /blog/mysql/log:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql
-e MYSQL_ROOT_PASSWORD=123456:设置MySQL的root用户的密码
7. 进入容器
docker exec -it mysql bash
8. 修改mysql配置
# 登录mysql
mysql -uroot -p123456
# 选择mysql数据库
use mysql
# 查询配置
select user,host from user;
# 结果如下:
+------------------+-----------+
| user | host |
+------------------+-----------+
| root | % |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
# 如果root那一行的host为localhost,执行更新语句
update user set host = '%' where user='root';
# 给root用户设置密码
alter user 'root'@'%' identified with
mysql_native_password by '123456';
# 刷新配置生效
flush privileges;
# 创建Halo项目需要的表
CREATE DATABASE halo CHARACTER
SET utf8mb4 COLLATE utf8mb4_general_ci;
# 退出mysql
exit
# 退出容器
exit
安装Halo
官网地址:Halo 文档
官方维护的三个镜像源:
- registry.fit2cloud.com/halo/halo
- halohub/halo
- ghcr.io/halo-dev/halo
1. 获取镜像
docker pull registry.fit2cloud.com/halo/halo:2.20
2. 修改名称
docker tag registry.fit2cloud.com/halo/halo:2.20 halo:latest
3. 简单启动项目
docker run -it -d \
--name halo -p 8090:8090 halo
4. 进入容器
docker exec -it halo bash
# 查看当前目录
pwd
# 列出当前目录的文件,不包含隐藏文件
ls
# 列出当前目录的文件,包含隐藏文件
ls -a
5. 查看halo的项目配置文件,在 /application/BOOT-INF/classes
# 进入文件目录
cd /application/BOOT-INF/classes
# 查看项目的yaml配置文件
ls -a
# 查看文件
cat application.yaml
# 查看halo的工作空间:.halo2
cd /root
ls -a
# 退出容器
exit
6. 复制容器的配置文件到宿主机目录下
# 复制配置文件
docker cp \
halo:/application/BOOT-INF/classes/application.yaml /blog/halo
# 进入目录修改文件
cd /blog/halo
7. 查看mysql运行时的ip地址
# 可以看到最后Networks-bridge-IPAddress的值,后面填写mysql的ip地址
docker inspect mysql
8. 修改配置文件 application.yaml
spring:
output:
ansi:
enabled: detect
r2dbc:
url: r2dbc:pool:mysql://{ip}:3306/halo # 换成自己的mysql的ip
username: root # 换成自己的账号
password: 123456 # 换成自己的密码
sql:
init:
mode: always
platform: mysql # 把h2改成mysql
9. 启动容器
# 删除容器
docker rm -f halo
# 重新启动
docker run -it -d \
--name halo \
-p 8090:8090 \
-v /blog/halo:/root/.halo2 \
--restart=unless-stopped halo
# 查看是否启动成功:可以看到html页面的源码就成功啦
wget -O- http://localhost:8090
# 如果启动失败,可以查看 /blog/halo/log 下面的日志查看原因
10. 开放端口
在阿里云ECS实例的安全组中的
入网开放8090端口,虚拟机防火墙默认是关闭的,不需要操作。如果需要开启防火墙则需要放行该端口才能访问。
# 查看防火墙状态
systemctl status firewalld
# 关闭防火墙
systemctl stop firewalld
# 放行8090端口
firewall-cmd --zone=public --add-port=8090/tcp --permanent
#关闭8090端口
firewall-cmd --zone=public --remove-port=8090/tcp --permanent
#重新载入 返回 success 代表成功
firewall-cmd --reload
# 查看所有开放的端口
firewall-cmd --list-all
安装Nginx
alpine:是 Nginx 镜像的一个变体,基于 Alpine Linux 构建,是一个轻量级的 Linux 发行版,专注于简单、安全和资源效率,适合容器化环境。
1. 获取镜像
docker pull nginx:alpine
2. 简单方式启动容器
docker run -d -p 80:80 --name nginx nginx:alpine
3. 复制配置文件
# 把 nginx 容器的 /etc/nginx/nginx.conf 复制到到宿主机的 /blog/nginx中
docker cp nginx:/etc/nginx/nginx.conf /blog/nginx
docker cp nginx:/etc/nginx/conf.d /blog/nginx
4. 修改配置,进行反向代理
# 查看halo容器的ip地址,查看最后Networks-bridge-IPAddress的值
docker inspect halo
5. 添加相关配置
修改/blog/nginx/conf.d/default.config;在
server - location /中的root /usr/share/ningx/html所在的代码块中添加
location / {
root /usr/share/nginx/html;
index index.html index.htm;
# 以下为5行添加内容
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 换成自己的ip和端口
proxy_pass http://172.17.0.2:8090;# 内网地址
}
6. 删除之前的容器
docker rm -f nginx
7. 重新启动nginx
docker run -d -p 80:80 \
--name nginx \
-v /blog/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /blog/nginx/conf.d:/etc/nginx/conf.d \
-v /blog/nginx/logs:/var/log/nginx nginx:alpine
8. 开放端口
开放阿里云安全组的
入网的80端口,访问公网ip就可以直接看到网站
9. 配置域名
- 修改配置文件
# 修改/blog/nginx/conf.d/ 的default.conf文件
server {
listen 80;
server_name www.example.com; # 替换为你的域名
}
- 如果域名已备案成功,需要开启DNS解析
- DNS配置:阿里云云解析DNS-公网DNS解析-权威域名解析-新增域名-解析设置-添加记录
记录类型:A
记录值:公网IP
- 开启解析之后,10分钟内差不多可使用http://www.example.com访问
10. 配置HTTPS
- 需要获取数字证书,可在阿里数字证书管理服务-证书管理-SSL证书管理-右侧个人测试证书-创建证书,每年20次免费机会,3个月过期。也可以通过其他方式获得…
- 获得
.pem或.crt,.key文件。 - 新建目录
# 创建cert文件家用于存放两个文件
mkdir -p /blog/nginx/cert
- 将文件上传至服务器
可使用其他FTP工具:略
- 修改default.conf配置文件
server {
listen 443 ssl;# 监听443,用于ssl
server_name www.example.com;# 自己的域名
# 配置ssl
ssl_certificate /etc/nginx/cert/www.example.com.pem;
ssl_certificate_key /etc/nginx/cert/www.example.com.key;
ssl_session_timeout 5m;# 会话超时时间
ssl_protocols TLSv1.2 TLSv1.3;# 服务器tls协议版本
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;# 服务器支持的加密套件
ssl_prefer_server_ciphers on;# 服务器与客户端协商加密套件时,优先使用服务器配置
client_max_body_size 512M;# 配置客户端请求体最大值
client_body_buffer_size 10m;# 配置请求体缓存区大小
# ...其他配置
}
# 重定向
server {
listen 80;
server_name www.example.com;
# 重定向所有 HTTP 请求到 HTTPS
rewrite ^(.*) https://$server_name$1 permanent;
}
- 重新启动服务
# 删除容器
docker rm -f nginx
# 启动
docker run -d -p 80:80 -p 443:443 \
--name nginx \
-v /blog/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /blog/nginx/conf.d:/etc/nginx/conf.d \
-v /blog/nginx/logs:/var/log/nginx \
-v /blog/nginx/cert:/etc/nginx/cert \
nginx:alpine
- 开放端口
# 如果启动防火墙开启443端口
firewall-cmd --zone=public --add-port=443/tcp --permanent
# 同时阿里云也需开放443端口,略...
- 访问https://www.example.com
如果启动或访问失败,查看/blog/nginx/logs/error.log进行排查
安装fail2ban
fail2ban:是一款开源的安全工具,通过监视日志文件,封禁ip、端口实现限制访问。
1. 安装
yum install - y fail2ban
- 目录解释
/etc/fail2ban/
- filter.d # 放置各种匹配规则,自带很多默认配置
- action.d # 当监控到某种规则之后的操作,自带很多默认配置
- jail.conf # 默认监视配置
- 配置ssh
# 进入目录
cd /etc/fail2ban
# fail2ban会自动读取jail.local配置文件
cp jail.conf jail.local
# 清空jail.local 写自己需要的配置
- jail.local配置文件
[DEFAULT] # 默认配置,当某个监狱没有配置时使用
ignoreip = 127.0.0.1 # 忽略ip
bantime = 3600 # 封禁时间
findtime = 3600 # 多少秒钟之内
maxretry = 3 # 最大尝试次数
[sshd]
enabled = true # 是否启用
port = ssh # ssh相当于22端口
filter = sshd # 默认的过滤规则
logpath = /var/log/secure # ssh的日志文件,不同系统不同,或 /var/log/auth.log
maxretry = 3 # 最大尝试次数
bantime = 86400 # 封禁时间
findtime = 86400
banaction = iptables-multiport # 默认的封禁ip端口行为
# 该配置文件中请自行删除 [# 注释],否则可能启动失败
- 启动fail2ban
# 开机自启
systemctl enable fail2ban
# 启动服务
systemctl start fail2ban
# 查看状态是否启动成功:最后一行Server ready
# Ctrl + c 退出查看页面
systemctl status fail2ban
# 重启
systemctl restart fail2ban
# 查看启动的规则:出现了sshd则配置成功
fail2ban-client status
# 查看被禁掉的ip
fail2ban-client banned
# 取消封禁
fail2ban-client set sshd unbanip 192.168.1.2
- 还可以自定义各种规则,请自行探索…
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 bjlm