搭建个人博客

​ ———–通过docker部署安装Halo,搭建个人博客。

​ 通过docker部署安装nginx,实现反向代理。

1、docker基本知识

#下载docker
yum install docker

1.1docker基本命令介绍

image-20250326212807332

#启动docker
systemctl start docker
#停止运行docker
systemctl stop docker
#重新启动docker
systemctl restart docker

补充:

默认情况下,每次重启虚拟机我们都需要手动启动Docker和Docker中的容器。通过命令可以实现开机自启:

# Docker开机自启
systemctl enable docker

# Docker容器开机自启
docker update --restart=always [容器名/容器id]

1.2 docker部署halo

当用户不指定标签时,Docker默认使用latest标签。但并不是所有镜像都有latest标签,或者这个标签可能指向不同的版本。Halo官方可能没有维护latest标签,而Nginx官方则维护了。所以当用户拉取nginx时,Docker会自动获取latest标签对应的最新稳定版,而Halo没有这个标签,导致失败

# 1. 拉取镜像
docker pull halohub/halo:2.20
# 2. 查看已拉取的镜像列表(确认版本)
docker images | grep halo
# 3. 再运行容器
docker run -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 halohub/halo:2.20
#查看状态
docker ps

image-20250326234134337

使用自己数据库时创建halo容器的命令

docker run -d \
  --name halo \
  -p 8090:8090 \
  -v ~/.halo2:/root/.halo2 \
  --restart=unless-stopped \
  halohub/halo:2.20 \          # 镜像名必须在此处结束
  --halo.external-url=https://www.jiakai.tech \
  --spring.r2dbc.url=r2dbc:pool:mysql://host.docker.internal:3306/halodb \
  --spring.r2dbc.username=root \
  --spring.r2dbc.password="1472580369.jia"

注意:当你执行 docker run 命令时,如果本地不存在指定的镜像(如 halohub/halo:2.20),Docker 会 自动从 Docker Hub 拉取该镜像,然后再启动容器。因此,严格来说你 不需要手动提前拉取镜像

1.3 docker部署nginx

Nginx 作为反向代理服务器,监听 80 端口,并将请求转发到 Halo 服务(监听 8090 端口)

#拉取nginx镜像
docker pull nginx

#启动nginx容器并配置反向代理
docker run -d --name nginx -p 80:80 -v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf nginx

#编辑 Nginx 配置文件:
#在主机上创建或编辑 /path/to/nginx.conf


#重启nginx容器
docker restart nginx

#检查nginx是否成功运行
docker ps

#查看nginx日志确认没有错误
docker logs nginx

image-20250326234322547

1.3 通过https协议访问博客

阿里云提供了免费的 SSL 证书

先登录阿里云控制台,进入 SSL 证书服务。然后申请免费的DV SSL证书,然后在证书列表创建证书,完成域名认证。并下载服务器类型为nginx的证书。最后将下载的证书(cert.pem[证书文件],cert.key[私钥文件])上传到服务器的服务器的 /etc/nginx/ssl/ 目录

#编辑nginx配置文件

server {
    listen 80;
    server_name 8.140.220.236;
    return 301 https://$host$request_uri;  # 将 HTTP 请求重定向到 HTTPS
}

server {
    listen 443 ssl;
    server_name 8.140.220.236;

    # SSL 证书路径
    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;

    # SSL 配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://8.140.220.236:8090;  # 转发到 Halo 服务
        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;
    }
}

#重启nginx容器
docker restart nginx

1.4通过 Docker 运行 MySQLHalo

Docker默认的网络模式是桥接网络,每个容器在独立的桥接网络中,可以通过IP地址互相访问,但IP地址可能动态变化,导致配置不方便。如果两个容器在同一个自定义网络中,Docker会提供DNS解析,使得容器可以通过容器名或服务名进行通信,这样更稳定和方便。

为什么需要同一网络?

​ 1、容器间通过服务名直接通信

  • 问题:在默认的 Docker 桥接网络(bridge)中,容器之间需要通过 IP 地址通信,但容器重启后 IP 可能变化。

  • 解决:在自定义网络中,Docker 提供 DNS 自动解析,允许容器通过名称(如 mysql)访问彼此,无需手动管理 IP。

    2、 网络隔离与安全性

    • 默认网络风险:所有容器在默认的 bridge 网络中,可能暴露不必要的端口。
    • 解决:自定义网络(如 halo_network)仅允许加入的容器互相通信,外部无法直接访问 MySQL 的 3306 端口。

    3、 简化配置

    • Halo 连接 MySQL 的 URL
      使用同一网络后,只需指定服务名 mysql,而非复杂的 IP 或外部域名:

    操作步骤(创建同一网络并部署)

#1、创建自定义网络
docker network create halo_network

#2、启动 MySQL 容器并加入网络
docker run -d \
  --name mysql \
  --network halo_network \
  -p 3306:3306 \
  -v /opt/mysql/data:/var/lib/mysql \
  -v /opt/mysql/config:/etc/mysql/conf.d \
  -e MYSQL_ROOT_PASSWORD='1472580369.jia' \
  -e MYSQL_DATABASE=halodb \
  --restart=unless-stopped \
  mysql:8.0 \
  --character-set-server=utf8mb4 \
  --collation-server=utf8mb4_unicode_ci
  
  #3、启动 Halo 容器并加入网络
docker run -d \
  --name halo \
  --network halo_network \
  -p 8090:8090 \
  -v ~/.halo2:/root/.halo2 \
  --restart=unless-stopped \
  halohub/halo:2.20 \
  --enable-native-access=ALL-UNNAMED \
  --halo.external-url=https://www.jiakai.tech \
  --spring.r2dbc.url=r2dbc:pool:mysql://mysql:3306/halodb \
  --spring.r2dbc.username=root \
  --spring.r2dbc.password='1472580369.jia'
  
  docker exec -it mysql mysql -h 127.0.0.1 -uroot -p

2、nginx

image-20241106001530727

image-20241106001514346

image-20241105235631489

客户端知道代理服务器的存在 (国内访问谷歌通过魔法)

image-20241106000048132

客户端不知道代理服务器和目标服务器的存在 ( 镜像网站)

image-20241106000211084

image-20241106000542289

image-20241106000917745

image-20241106001113165

image-20241106001357231