现在的博客搭建方式有很多,本文使用的是 halo,它安装起来比较方便快捷,界面也非常清晰简洁。
- 安装方法使用的是 podman
- 代理服务使用的是 nginx
- 数据库使用的是 mysql
安装 podman
podman 是一个容器管理工具,可以很方便的管理容器。它与 docker 相比,更轻量级一些。比如,docker 需要 root权限,而 podman 不需要。
-
podman 安装配置
# 安装依赖 sudo apt-get install podman # 启动服务 sudo systemctl start podman.socket sudo systemctl enable podman.socket # 编辑配置文件 sudo vim /etc/containers/registries.conf # 添加以下内容 unqualified-search-registries = ["docker.io"]
-
podman 基本命令
# 搜索镜像 podman search <image_name> # 拉取镜像 podman pull <image_name> # 列出所有镜像 podman images # 删除镜像 podman rmi <image_id> # 列出所有容器 podman ps -a # 启动容器 podman start <container_id> # 停止容器 podman stop <container_id> # 删除容器 podman rm <container_id> # 查看容器日志 podman logs <container_id> # 进入容器 podman exec -it <container_id> bash # 运行容器 podman run -itd --name <container_name> -p <host_port>:<container_port> -v <host_path>:<container_path> <image_name> # -i 表示交互模式 # -t 表示分配一个伪终端 # -d 表示后台运行 # --name <container_name> 表示给容器起一个名字 # -p <host_port>:<container_port> 表示将容器的 <container_port> 端口映射到宿主机的 <host_port> 端口 # -v <host_path>:<container_path> 表示将宿主机的 <host_path> 路径映射到容器的 <container_path> 路径 # 示例 podman run -d --name mysql -p 3306:3306 -v /home/<user>/mysql:/var/lib/mysql mysql:8.0.32
-
podman 扩展知识
- 配置文件路径
- root 用户的路径是 /etc/containers/containers.conf
- 普通 用户的路径是 ~/.config/containers/containers.conf
- 容器配置文件保存
- root 用户的路径是 /var/lib/containers/storage/overlay
- 普通用户的路径是 ~/.local/share/containers/storage/overlay
- 因为 podman 是无根的,所以用户退出后,启动的容器会自动停止。可以使用 sudo loginctl enable-linger 启用linger模式,使得在系统关闭时,当前用户的服务能够继续运行
- 容器内需要访问宿主机时,可以使用 host.containers.internal 替代宿主机 ip
- 配置文件路径
安装 mysql
-
mysql 安装配置
# 拉取镜像 podman pull mysql:8.0.32 # 创建数据目录,日志目录 mkdir -p /home/<user>/mysql/data -p /home/<user>/mysql/logs # 创建配置文件 vim /home/<user>/mysql/my.cnf # 写入配置信息 [mysqld] port = 3306 datadir=/var/lib/mysql log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid # 保存退出 :wq
-
运行 mysql 容器
podman run -itd \ --name mysql \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=<password> \ -v /home/<user>/mysql/data:/var/lib/mysql \ -v /home/<user>/mysql/logs:/var/log/mysql \ -v /home/<user>/mysql/my.cnf:/etc/mysql/my.cnf \ -v /etc/localtime:/etc/localtime \ mysql:8.0.32 # 说明 # -e MYSQL_ROOT_PASSWORD=<password> 设置数据库root用户的密码,需替换 # -v /home/<user>/mysql/data:/var/lib/mysql 对应容器的数据存储路径 # -v /home/<user>/mysql/logs:/var/log/mysql 对应容器的日志存储路径 # -v /home/<user>/mysql/my.cnf:/etc/mysql/my.cnf 对应容器的配置文件 # -v /etc/localtime:/etc/localtime 是为了保证容器内和宿主机的时间同步
-
创建 halo 数据库和用户
# 进入容器 podman exec -it mysql bash # 登录数据库 mysql -u root -p # 创建用户 create user 'halo'@'%' identified by 'halopwd'; # 创建了一个用户名为halo,密码为halopwd的用户 # % 表示允许从任意主机访问 # 创建数据库 create database halo_db charset utf8mb4 collate utf8mb4_bin; # 创建了一个名为halo_db的数据库,字符集为utf8mb4,排序规则为utf8mb4_bin # 授权 grant all privileges on halo_db.* to 'halo'@'%'; # 授权halo用户对halo_db数据库的所有权限 # 刷新权限 flush privileges; # 退出数据库 exit # 退出容器 exit
安装 halo
-
halo 安装配置
# 拉取镜像 podman pull halo:2.13 # 创建本地映射目录 mkdir -p /home/<user>/halo
-
启动 halo 容器
podman run -itd \ --name halo \ -p 8090:8090 \ -v /home/<user>/halo:/root/.halo2 \ halo:2.13 --spring.r2dbc.url=r2dbc:pool:mysql://host.containers.internal:3306/halo_db \ --spring.r2dbc.username=halo \ --spring.r2dbc.password=halopwd \ --spring.sql.init.platform=mysql # 说明 # --spring.r2dbc.url 指定使用的数据库连接地址 # host.containers.internal 是一个特殊的域名,表示是宿主机,相当于127.0.0.1 # --spring.r2dbc.username 指定数据库用户名 # --spring.r2dbc.password 指定数据库密码 # --spring.sql.init.platform 指定数据库类型
-
访问 halo
- 访问 http://localhost:8090 按照提示填写注册信息
- 登录刚才注册的用户,完成初始化 halo
- 访问 http://localhost:8090/console 进入后台管理界面
- 访问 http://localhost:8090 进入主站
安装 nginx
-
准备 nginx 环境
# 拉取镜像 podman pull nginx:1.23.3 # 创建本地映射目录 mkdir -p /home/<user>/nginx/conf.d /home/<user>/nginx/logs /home/<user>/nginx/data/html # 生成缺省配置文件容器 podman run -itd --name nginxdef nginx:1.23.3 # 拷贝配置文件到本地映射路径 podman cp nginx:/etc/nginx/nginx.conf /home/<user>/nginx/nginx.conf podman cp nginx:/etc/nginx/conf.d/default.conf /home/<user>/nginx/conf.d/default.conf podman cp nginx:/usr/share/nginx/html/index.html /home/<user>/nginx/data/html/index.html # 删除容器 podman rm nginxdef
-
启动 nginx 容器
podman run -itd \ --name nginx \ -p 80:80 \ -p 443:443 \ -v /home/<user>/nginx/nginx.conf:/etc/nginx/nginx.conf \ -v /home/<user>/nginx/conf.d:/etc/nginx/conf.d \ -v /home/<user>/nginx/logs:/var/log/nginx \ -v /home/<user>/nginx/data:/usr/share/nginx \ nginx:1.23.3 # 说明 # 普通用户不能使用1024以下端口,需要使用root用户启动容器,或者使用 sysctl 命令修改端口范围 # 注意,该操作有泄露端口的风险,请谨慎使用。 sudo sysctl net.ipv4.ip_unprivileged_port_start=80 # 1024为默认值,修改为80,这时再重新启动容器即可 # 启动容器后,及时恢复默认值 sudo sysctl net.ipv4.ip_unprivileged_port_start=1024
-
配置 nginx 解析
# 添加 halo 配置 vim /home/<user>/nginx/conf.d/halosite.conf # 写入配置信息 upstream halo2 { server host.containers.internal:8090; } server { listen 80; server_name halosite.com; location / { proxy_pass http://halo2; 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; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Port $server_port; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-Path $request_uri; } } # 保存退出 :wq # 重载nginx配置 podman exec -it nginx nginx -s reload
-
验证 nginx 解析
使用 http://halosite.com 访问 halosite,验证配置是否生效