手把手教你使用 docker compose 搭建一个自己的Halo2.0博客
手把手教你 使用Docker Compose 部署以及 搭建Halo2.0
- 环境:云服务器(腾讯云,阿里云,华为云或者国外的等等)
- 工具:Xshell7,Xftp7
- 其他:购买域名,购买证书(或者申请免费的三个月)
- 搭建环境:华为云+ubuntu+docker compose+halo2.0+mysql+nginx反向代理
什么是 Docker ?
Docker是一个能够把开发的应用程序自动部署到容器的开源引擎。 是一个快捷、轻便的系统级虚拟化技术,开发者和系统管理员可以使用它构建具备所有必要依赖项的应用程序,并将其作为一个包发布。通俗的讲:Docker的类似于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。
Docker和Docker compose的区别
Docker 和 Docker Compose 是两个相关但不同的工具,用于容器化应用程序的管理和编排。
Docker 是一种开源平台,用于构建、部署和运行应用程序的容器化。它提供了一种轻量级且可移植的容器化解决方案,使开发人员能够将应用程序及其依赖项打包为容器,并在任何支持 Docker 的环境中运行。Docker 利用操作系统级虚拟化技术,如 Linux 容器(LXC)或更现代的容器运行时(如 Docker Engine),提供了隔离性、可移植性和可扩展性。使用 Docker,您可以快速、一致地构建、分发和运行应用程序。
Docker Compose 是一个用于定义和运行多个 Docker 容器的工具。它提供了一种简化的方式来定义和管理多个容器之间的关系、依赖和配置。使用 Docker Compose,您可以通过一个单独的 YAML 文件(称为 Compose 文件)来描述应用程序的不同组件,并可以使用一条命令来启动、停止和管理这些容器。Compose 文件允许您指定容器的映像、环境变量、网络设置、卷挂载等,以及定义容器之间的链接和依赖关系。它简化了多容器应用程序的编排过程,使得在开发、测试和部署环境中管理容器化应用程序更加方便。
因此,Docker 是一个用于构建和运行容器化应用程序的平台,而 Docker Compose 是一个用于定义和管理多个容器的编排工具。Docker 提供了基础设施层面的容器化解决方案,而 Docker Compose 则提供了更高级别的抽象,使得编排和管理多个容器的应用程序变得更加简单和可控。在实际应用中,可以同时使用 Docker 和 Docker Compose 来满足不同层次的需求,从单个容器应用到复杂的多容器应用的管理和部署。
环境搭建
可以看我的这篇文章:
手把手教你在ubuntu安装Docker和Docker compose
创建容器组
1.在系统任意位置创建一个文件夹,此文档以 ~/halo2 为例。
mkdir ~/halo2 && cd ~/halo2
2.创建 docker-compose.yaml
vim docker-compose.yaml
此文档提供Mysql场景的 Docker Compose 配置文件,也是官方推荐的方式
3.创建 Halo + MySQL 的实例:
在你创建好的 docker-compose.yaml
文件里面配置下面的内容:
(vim编辑器进入后点击i即可编辑)
version: "3"
services:
halo:
image: halohub/halo:2.14.0
container_name: halo
restart: on-failure:3
depends_on:
halodb:
condition: service_healthy
networks:
halo_network:
volumes:
- ./:/root/.halo2
ports:
- "8090:8090"
environment:
- SPRING_R2DBC_URL=r2dbc:pool:mysql://halodb:3306/halo
- SPRING_R2DBC_USERNAME=root
# MySQL 的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。
- SPRING_R2DBC_PASSWORD=o#DwN&JSa56
- SPRING_SQL_INIT_PLATFORM=mysql
# 外部访问地址,请根据实际需要修改
- HALO_EXTERNAL_URL=http://localhost:8090/
# 初始化的超级管理员用户名
- HALO_SECURITY_INITIALIZER_SUPERADMINUSERNAME=admin
# 初始化的超级管理员密码
- HALO_SECURITY_INITIALIZER_SUPERADMINPASSWORD=P@88w0rd
halodb:
image: mysql:8.0.31
container_name: halodb
restart: on-failure:3
networks:
halo_network:
command: --default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
volumes:
- ./mysql:/var/lib/mysql
- ./mysqlBackup:/data/mysqlBackup
ports:
- "3306:3306"
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"]
interval: 3s
retries: 5
start_period: 30s
environment:
# 请修改此密码,并对应修改上方 Halo 服务的 SPRING_R2DBC_PASSWORD 变量值
- MYSQL_ROOT_PASSWORD=o#DwN&JSa56
- MYSQL_DATABASE=halo
networks:
halo_network:
这个文件需要你自己修改的地方:
1.Halo版本号:目前halo的最新版本为2.14.0,大家以官网为准
2.MySQL密码:保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。
3.管理员用户名和密码(自己手动设置)
4.外部访问链接 HALO_EXTERNAL_URL
这个就填写你的域名就行
编辑好后,键盘点击esc,输入:【:wq】保存文件
环境变量详解:
变量名 | 描述 |
---|---|
SPRING_R2DBC_URL |
数据库连接地址,详细可查阅下方的 数据库配置 |
SPRING_R2DBC_USERNAME |
数据库用户名 |
SPRING_R2DBC_PASSWORD |
数据库密码 |
SPRING_SQL_INIT_PLATFORM |
数据库平台名称,支持 postgresql 、mysql 、h2 ,需要与 SPRING_R2DBC_URL 对应 |
HALO_EXTERNAL_URL |
外部访问链接,如果需要在公网访问,需要配置为实际访问地址 |
HALO_SECURITY_INITIALIZER_SUPERADMINUSERNAME |
初始超级管理员用户名 |
HALO_SECURITY_INITIALIZER_SUPERADMINPASSWORD |
初始超级管理员密码 |
4.启动 Halo 服务
docker-compose up -d
实时查看日志:
docker-compose logs -f
这个时候其实就可以访问你的博客了!!但是是使用ip地址访问,那么我们想使用域名访问该怎么办呢?这个时候就需要先购买一个域名,去阿里,腾讯,华为厂商购买就行,买完之后需要进行一系列的配置,并且绑定你的ip地址,顺便申请一个三个月免费的证书,另外如果是第一次申请域名的话,需要备案,备案,备案!!!不备案你的域名即使绑定成功你的ip,并且添加了dns解析,也不能访问,备案时间我的花费了大概十几天的审核时间,所以可以提前先买好域名进行备案。如果你已经购买域名并且下载好证书,我们可以继续看下面。
反向代理
反向代理(Reverse Proxy)是一种网络服务的架构模式,它代表服务器接收客户端的请求,并将这些请求转发到内部网络中的后端服务器。相对于传统的正向代理(例如,代理服务器帮助客户端访问互联网),反向代理的流量是从客户端到服务器的方向。
反向代理的主要目的有以下几点:
- 负载均衡:反向代理可以作为负载均衡器,将请求分发给多个后端服务器,以实现请求的平衡分配,提高系统性能和可扩展性。
- 缓存加速:反向代理可以缓存后端服务器的响应,当下次有相同请求时,可以直接返回缓存的响应,减轻后端服务器的负载并提高响应速度。
- 安全性和保护:反向代理可以作为防火墙,保护后端服务器免受恶意请求和攻击(如DDoS攻击)的影响,同时隐藏后端服务器的真实IP地址,增加安全性。
- SSL/TLS 终止:反向代理可以用于终止客户端和后端服务器之间的 SSL/TLS 连接,解密和加密流量,减轻后端服务器的计算负担。
1.创建nginx容器(需要提前安装好docker)
docker run -d -p 443:443 --name nginx-halo nginx
2.创建好之后先别急,先在我们本地创建一个default.conf文件
server {
listen 443 ssl;
#这里替换成你的域名地址
server_name amarantos-blog.cn;
#这里替换成你的证书地址
ssl_certificate /etc/nginx/ssl/halo_cert.crt;
#这里替换成你的证书地址
ssl_certificate_key /etc/nginx/ssl/halo_key.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;
# 设置最大上传文件大小为300MB
client_max_body_size 300m;
#access_log /var/log/nginx/host.access.log main;
location / {
#这里填写你的域名地址+端口号(默认8090)
proxy_pass http://amarantos-blog.cn:8090;
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;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
3.准备好申请好的证书和创建好的default.conf文件
上传到云服务器,我使用的是Xftp7,很方便就上传了,直接拖动文件就可以上传(自己选择上传到云服务器的哪个路径下)
4.上传好之后,我们需要把这三个文件再传到你创建的nginx容器里面
//从主机迁移到容器签名和配置文件
docker cp halo_cert.crt nginx-halo:/etc/nginx/ssl/halo_cert.crt
docker cp halo_key.key nginx-halo:/etc/nginx/ssl/halo_key.key
docker cp default.conf nginx-halo:/etc/nginx/conf.d/default.conf
这里我是在halo_cert.crt,halo_key.key,default.conf当前目录下cp的,如果你是在其他路径,只需要对应填写你自己的文件路径就好,运行后,这个时候呢,你可能会出错,说是找不到/etc/nginx/ssl这个路径,你copy不过去,怎么办呢?自己进去容器创建呗,创建好了再退出来,再往里面传。
那么怎么进入容器呢?
docker exec -it nginx-halo /bin/sh
进来之后,我们先进入/etc/nginx/
运行:
mkdir ssl
创建好之后,我们直接运行exit退出就好
接着再运行这几条命令:
//从主机迁移到容器签名和配置文件
docker cp halo_cert.crt nginx-halo:/etc/nginx/ssl/halo_cert.crt
docker cp halo_key.key nginx-halo:/etc/nginx/ssl/halo_key.key
docker cp default.conf nginx-halo:/etc/nginx/conf.d/default.conf
这里copy的路径和你default.conf配置的证书路径一定要对上,要不然会出错!!
做到这里,你已经快成功了,相当于你的halo服务已经创建好了,反向代理已经配置成功
5.最后一步重新启动 nginx-halo
docker restart nginx-halo
这个时候再检查一遍:
1.域名备案是否成功(不成功的话域名访问会失败)
2.你自己的云服务商后台的8090,443,3306等等端口号是否开放(比如说我使用的华为云)
3.ubuntu的防火墙是否开启8090,443,3306等等端口号的访问权限
要在 Ubuntu 上开放端口号访问权限,您可以使用 ufw(Uncomplicated Firewall)工具进行配置。
以下是在 Ubuntu 上使用 ufw 开启端口号访问权限的步骤:
首先,确保您的系统上已经安装了 ufw。如果尚未安装,可以使用以下命令进行安装:
sudo apt update
sudo apt install ufw
确保防火墙处于启用状态。使用以下命令启用防火墙:
sudo ufw enable
现在,您可以使用 ufw 命令开放特定的端口号。例如,要开放 8090 端口,可以运行以下命令:
sudo ufw allow 8090
查看当前的防火墙规则,可以运行以下命令:
sudo ufw status
以上三点有一样没有操作,你接下来通过域名访问你的halo网址都会出问题!!
遇到的坑:反向代理最终我没有使用 Nginx Proxy Manager
,因为我使用 Nginx Proxy Manager
配置完之后呢,用域名访问一切正常,但是!!!我使用谷歌按照关键字搜索我的文章后,搜索到之后我点击跳转到我的halo博客,竟然进不去!!也不知道哪里出了问题,显示:您的连接不是私密连接。有知道的大佬给讲解一下吗?(证书一切正常)
后台初始化
这个时候终于终于终于可以使用你自己的域名在浏览器打开了,呈现的应该是上面的图,设置好你自己的账号和密码
就可以开始你的博客之旅了!!~~~
更新 halo
cd /root/data/docker_data/halo
docker-compose down
cp -r /root/data/docker_data/halo /root/data/docker_data/halo.archive # 万事先备份,以防万一
docker-compose pull
docker-compose up -d # 请不要使用 docker-compose stop 来停止容器,因为这么做需要额外的时间等待容器停止;docker-compose up -d 直接升级容器时会自动停止并立刻重建新的容器,完全没有必要浪费那些时间。
docker image prune # prune 命令用来删除不再使用的 docker 对象。删除所有未被 tag 标记和未被容器使用的镜像
提示:
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N]
输入 y
利用 Docker 搭建的应用,更新非常容易~
卸载 halo
cd /root/data/docker_data/halo
docker-compose down
cd ..
rm -rf /root/data/docker_data/halo # 完全删除映射到本地的数据
最后还有一个就是迁移数据库,因为我刚开始搭建的时候不太了解,使用的h2数据库,但是官网不推荐使用h2数据库,另外后来也因为h2数据库遇到了很多问题,就迁移到了mysql数据库,下期我们手把手讲解如何将halo h2数据库迁移到mysql数据库,这期间也遇到了很多很多坑!
以上是我这个小白搭建halo2.0中遇到印象比较深刻的几个问题和整个的一个流程,如果我写的有不足的地方,欢迎大家指正,如果还有不懂的地方,欢迎大家留言,我会一一解答~ 再见!
评论区