使用 Docker 部署Halo
安装Docker
参考链接:Linux 安装 Docker
查看系统信息命令
cat /etc/os-release
安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo
: 以超级用户权限执行命令,需要输入管理员密码。yum
: 是一个包管理工具,用于在 CentOS 和 RHEL 等 Linux 发行版上管理软件包。install
: 指示 yum 安装软件包。-y
: 在安装软件包时,自动回答 "yes",表示无需用户确认直接安装。yum-utils
: 是一个提供额外 yum 插件的包,通常用于扩展 yum 的功能,如清理旧的软件包、查看软件包信息等。device-mapper-persistent-data
: 这是一种持久化数据的设备映射器,通常用于在 Linux 系统中管理存储设备的映射。lvm2
: 是 Logical Volume Manager (逻辑卷管理器) 的第二个版本,用于在 Linux 系统上管理逻辑卷。
添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装 Docker 引擎
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
启动/停止 Docker
sudo systemctl start docker
sudo systemctl stop docker
通过运行 hello-world
映像来验证 Docker 引擎安装是否成功
sudo docker run hello-world
此命令下载测试映像并在容器中运行它。当容器运行时,它会打印一条确认消息并退出。
查看版本
docker -v
开机自启
sudo systemctl enable docker
删除容器
删除容器的命令是 docker rm
。如果你想删除一个运行中的容器,你需要使用 -f
或 --force
选项来强制删除。
例如,要删除一个名为 my_container 的容器,你可以使用以下命令:
docker rm my_container
如果 my_container 是运行中的,你需要添加 -f 选项:
docker rm -f my_container
如果你想删除所有停止的容器,可以使用以下命令:
docker container prune
安装Docker-compose
利用安装包下载安装docker-compose(采用)
下载compose
下载地址:Releases · docker/compose (github.com)
上传到centos系统
把docker-compose移动到
/usr/local/bin/
mv docker-compose-linux-x86_64 /usr/local/bin/
修改包名
mv docker-compose-linux-x86_64 docker-compose
修改文件权限并配置环境变量
chmod 777 docker-compose
在当前目录下查看版本
docker-compose -v
配置环境变量
vim ~/.bash_profile
添加环境变量
PATH=$PATH:/usr/local/bin/
使环境变量生效
source ~/.bash_profile
利用pip下载安装docker-compose
安装pip
yum -y install epel-release
yum -y install python-pip
查看版本
pip --version
安装compose
pip install docker-compose
查看版本
docker-compose version
删除docker-compose
sudo rm /usr/local/bin/docker-compose
安装Halo
参考链接:
使用 Docker 镜像(一)
Halo 在 Docker Hub 上发布的镜像为 halohub/halo
创建 工作目录
mkdir ~/.halo && cd ~/.halo
下载示例配置文件到 工作目录
wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml
编辑配置文件,配置数据库或者端口等,如需配置请参考 配置参考
vim application.yaml
拉取最新的 Halo 镜像
docker pull halohub/halo:1.6.0
查看最新版本镜像:https://hub.docker.com/r/halohub/halo ,我们推荐使用具体版本号的镜像,但也提供了
latest
标签的镜像,它始终是最新的。
创建容器
docker run -it -d --name halo -p 8090:8090 -v ~/.halo:/root/.halo --restart=unless-stopped halohub/halo:1.6.0
注意:此命令默认使用自带的 H2 Database 数据库。如需使用 MySQL,请参考:使用 Docker 部署 Halo 和 MySQL
-it: 开启输入功能并连接伪终端
-d: 后台运行容器
--name: 为容器指定一个名称
-p: 端口映射,格式为
主机(宿主)端口:容器端口
,可在application.yaml
配置。-v: 工作目录映射。形式为:-v 宿主机路径:/root/.halo,后者不能修改。
--restart: 建议设置为
unless-stopped
,在 Docker 启动的时候自动启动 Halo 容器。
打开
http://ip:端口号
即可看到安装引导界面。
如果需要配置域名访问,建议先配置好反向代理以及域名解析再进行初始化。如果通过
http://ip:端口号
的形式无法访问,请到服务器厂商后台将运行的端口号添加到安全组,如果服务器使用了 Linux 面板,请检查此 Linux 面板是否有还有安全组配置,需要同样将端口号添加到安全组。
Nginx
upstream halo {
server 127.0.0.1:8090;
}
server {
listen 80;
listen [::]:80;
server_name www.yourdomain.com;
client_max_body_size 1024m;
location / {
proxy_pass http://halo;
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Docker Compose 部署 Halo(二)
安装步骤
创建容器组
在系统任意位置创建一个文件夹,此文档以
~/halo-app
为例。mkdir ~/halo-app && cd ~/halo-app
注意:后续操作中,Halo 的所有相关数据都会保存在这个目录,请妥善保存。
创建
docker-compose.yaml
,官网上有3种,我这边主要采用的是Halo + MySQL 的实例:version: "3" services: halo: image: halohub/halo:2.15.0 container_name: halo restart: on-failure:3 depends_on: halodb: condition: service_healthy networks: halo-net: volumes: - ./halo:/root/.halo2 ports: - "8100:8090" healthcheck: test: ["CMD", "curl", "-f", "http://127.0.0.1:8090/actuator/health/readiness"] interval: 30s timeout: 5s retries: 5 start_period: 30s command: - --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halodb #这里的3306端口不要动,这是halo-net里的网络 - --spring.r2dbc.username=root - --spring.r2dbc.password=my-secret-pw #mysql密码,要和下面mysql密码一致 - --spring.sql.init.platform=mysql - --halo.external-url=http://127.0.0.1:8090/ #外部访问地址 halodb: image: mysql:8.0.27 container_name: halodb restart: on-failure:3 networks: halo-net: command: - --default-authentication-plugin=caching_sha2_password - --character-set-server=utf8mb4 - --collation-server=utf8mb4_general_ci - --explicit_defaults_for_timestamp=true volumes: - ./mysql:/var/lib/mysql - ./mysqlBackup:/data/mysqlBackup ports: - "3307:3306" #如果占用,可以修改为3307:3306等 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"] interval: 3s retries: 5 start_period: 30s environment: - MYSQL_ROOT_PASSWORD=my-secret-pw - MYSQL_DATABASE=halodb networks: halo-net:
启动 Halo 服务
docker-compose up -d
注意:
networks:要设置同一个网络里;
这时候容器里还没有创建 对应的数据库,启动halo容器会报错[数据库连接失败],要进入容器中创建;查看halo日志,错误如下,只截取了主要部分:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'r2dbcScriptDatabaseInitializer' defined in class path resource
打开
http://ip:端口号
即可看到安装引导界面。http://8.138.91.101:8100/
Docker如何操作mysql容器
进入 MySQL 容器中登录 MySQL 并创建 Halo 需要的数据库
halodb 为 MySQL 实例的容器名称
docker exec -it halodb /bin/bash
登录MySQL
mysql -u root -p
输入 MySQL 数据库密码,密码是
docker-compose.yaml
中填写的密码;如需修改密码,执行如下命令:
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
创建数据库
create database halodb character set utf8mb4 collate utf8mb4_bin;
使用
exit
退出MySQL
并退出容器
Halo 配置反向代理
与 Nginx Proxy Manager 配合使用
简介
顾名思义,Nginx Proxy Manager 就是一个 Nginx 的代理管理器,它最大的特点是简单方便。
即使是没有 Nginx 基础的小伙伴,也能轻松地用它来完成反向代理的操作,而且因为自带面板,操作极其简单,非常适合配合 docker 搭建的应用使用。
Nginx Proxy Manager 后台还可以一键申请 SSL 证书,并且会自动续期,方便省心。
下面我们就来介绍如何用 Nginx Proxy Manger 来配合 Halo,实现反向代理和 HTTPS 访问。
安装 Nginx Proxy Manager
说明:默认你的服务器已经安装了 Docker 和 Docker Compose,如果你没有安装,可以参考:使用 Docker Compose 部署 的环境搭建部分来进行安装。
点击下方链接进入 Nginx Proxy Manager(以下简称 NPM) 官网:https://nginxproxymanager.com/
我们可以直接选择 快速安装。
首先,我们创建一个文件夹来存放 NPM 的 docker-compose.yml
文件:
mkdir -p ~/data/docker_data/nginxproxymanager # 创建一个 npm 的文件夹
cd ~/data/docker_data/nginxproxymanager # 进入该文件夹
vi docker-compose.yml
在英文状态的输入法下,按下 i
,左下角出现 --INSERT--
后,粘贴填入下面的内容:
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # 不建议修改端口
- '81:81' # 可以把冒号左边的 81 端口修改成你服务器上没有被占用的端口
- '443:443' # 不建议修改端口
volumes:
- ./data:/data # 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 data 目录,用于存放数据,如果不存在的话,会自动创建
- ./letsencrypt:/etc/letsencrypt # 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 letsencrypt 目录,用于存放证书,如果不存在的话,会自动创建
注意:安装了 NPM 之后,就不需要再安装 Nginx 了,否则会端口冲突(不建议修改 NPM 的 80、443 端口)。如果你的服务器安装了宝塔面板,也可以和 NPM 一起使用,只要你到软件后台把宝塔安装的 Nginx 关闭或者卸载即可。
之后,同样在英文输入法下,按一下 esc
,然后 :wq
保存退出。
启动 NPM:
docker-compose up -d # -d 表示后台运行
docker compose up -d # 如果你用的是 docker-compose-plugin 的话,用这条命令
不出意外,此时你使用 http://127.0.0.1:81 就可以访问 NPM 的网页端了。(注意把 127.0.0.1
替换成你实际服务器的 IP)
默认登陆的用户名:admin@example.com
密码:changeme
第一次登陆会提示更改用户名和密码,建议修改一个复杂一点的密码。
至此,我们已经完成了 Nginx Proxy Manager 的搭建,之后就可以用它给我们的 Halo 或者其他 Web 应用做反向代理了。
配置 Halo 的反向代理
首先我们登陆网页端之后,会弹出修改用户名和密码的对话框,我们根据自己的实际来修改自己的用户名和邮箱。
保存之后,会让我们修改密码(建议用一个复杂的密码)。
接着我们就可以来给 Halo 来添加一个反向代理了。
点击 Proxy Hosts
,
接着点击 Add Proxy Host
,弹出如下对话框:
看起来都是英文,很复杂,但是其实很简单,我们只要用到其中的几个功能即可,这边稍微解释一下:
Domain Names
:填我们 Halo 网站的域名,首先记得做好 DNS 解析,把域名绑定到我们的服务器的 IP 上Scheme
:默认http
即可,除非你有自签名证书Forward Hostname/IP
:填入服务器的 IP,或者 Docker 容器内部的 IP(如果 NPM 和 Halo 搭建在同一台服务器上的话)Forward Port
:填入 Halo 映射出的端口,这边默认是8090
Cache Assets
:缓存,可以选择打开Block Common Exploits
: 阻止常见的漏洞,可以选择打开Websockets Support
:WS 支持,可以选择打开Access List
: 这个是 NPM 自带的一个限制访问功能,这边我们不管,后续可以自行研究。
以下是一个样列:
因为样例的 NPM 和 Halo 搭建在同一台 VPS 上,所以这边的 IP,图中填的是 172.17.0.1
,为 Docker 容器内部的 IP 地址,
可以通过下面的命令查询:
ip addr show docker0
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:e4:a3:b5:b9 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
这边的 IP 是 172.17.0.1
,填入这个 IP,可以不用打开防火墙的 8090
端口。
当然,如果你的 NPM 和 Halo 不在同一台服务上,你需要在 IP 部分填入 你的 Halo 所在的服务器的 IP,并在服务商(部分服务商如腾讯、阿里)的后台打开 8090
端口。
一键申请 SSL 证书
接着我们来申请一张 SSL 证书,让我们的网站支持 https
访问。
如图所示,记得打开强制 SSL,其他四个的功能请自行研究,这边不多做讨论。
信息
申请证书需要你提前将域名解析到 NPM 所在的服务器的 IP 上;
如果你使用的是国内的服务器,默认
80
和443
端口是关闭的,你需要备案之后才能使用;如果你使用了 CloudFlare 的 DNS 服务,记得把小黄云关闭(即不开启 CDN)。
不出意外,你将成功申请到 SSL 证书,证书会三个月自动续期。
再次点开配置,查看一下,将强制 SSL 打开。
至此,你已经成功完成了 Halo 的反向代理,快尝试使用域名访问一下看看吧!
Halo Twikoo 搭建
Twikoo 配置
在 官方文档 中提供了如下 docker compose 配置
version: '3'
services:
twikoo:
image: imaegoo/twikoo
container_name: twikoo
restart: unless-stopped
ports:
- 8080:8080
environment:
TWIKOO_THROTTLE: 1000
volumes:
- ./data:/app/data
安装过程非常简单,按照如下命令运行即可,注意 volumes
后面的内容 ./data
,我希望 docker-compose.yaml
文件和数据放在同一个文件夹下面, 方便转移和备份
mkdir twikoo
cd twikoo
vi docker-compose.yaml
# 自行填入内容
docker compose up -d
# 或者 docker-compose up -d 取决你的环境
到这里我们安装就已经好了,但是先不着急配置,此处也需要对 twikoo 的内容进行 ssl 加密处理,通过Nginx Proxy Manager
;
Liunx ls失效问题
我采用的是第四点,配置环境变量
ls命令在Linux中是用于列出目录和文件的命令,如果在使用过程中发现ls命令失效了,可能是以下几个原因造成的:
命令路径错误:首先需要确认ls命令的路径是否正确。在Linux系统中,ls命令通常位于/bin或/usr/bin目录下。可以通过which ls命令查看ls命令的路径是否正确。如果路径错误,可以使用绝对路径来执行ls命令,例如/bin/ls。
命令不存在:如果ls命令的路径正确,但仍然无法执行,可能是因为ls命令没有安装或者被删除了。可以使用dpkg -l或者yum list命令查看ls命令是否安装在系统中。如果未安装,可以使用适合系统的包管理器安装ls命令,如apt-get或yum。
命令权限问题:如果ls命令的路径正确且已安装,但仍然无法执行,可能是因为当前用户没有执行ls命令的权限。可以使用ls -l命令查看ls命令的权限设置。如果权限不正确,可以使用chmod命令修改权限。例如,使用chmod +x ls命令给ls命令添加可执行权限。
环境变量问题:ls命令依赖于环境变量,如果环境变量不正确,可能导致ls命令无法执行。可以通过echo $PATH命令查看当前的环境变量设置。确认是否包含ls命令所在的目录。如果不包含,可以通过或者export PATH=$PATH:/usr/bin来添加ls命令所在的目录到环境变量中。
修改文件:
/etc/profile
export PATH=$PATH:/usr/bin
系统文件损坏:如果以上方法都无法解决ls命令失效的问题,可能是因为系统文件损坏导致的。可以尝试使用备份文件或者重新安装系统来修复问题。
总结起来,如果ls命令失效了,需要通过确认命令路径、安装情况、权限设置、环境变量和系统文件等因素来进行排查和解决问题。
- 感谢你赐予我前进的力量