搭建个人博客
———–通过docker部署安装Halo,搭建个人博客。
通过docker部署安装nginx,实现反向代理。
1、docker基本知识
#下载docker
yum install docker
1.1docker基本命令介绍
#启动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
使用自己数据库时创建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
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
运行 MySQL
和 Halo
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
客户端知道代理服务器的存在 (国内访问谷歌通过魔法)
客户端不知道代理服务器和目标服务器的存在 ( 镜像网站)
评论区