安装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安装 - xiondun - 博客园 (cnblogs.com)

利用安装包下载安装docker-compose(采用)

  1. 下载compose

下载地址:Releases · docker/compose (github.com)

image-20240430204526552

  1. 上传到centos系统

  2. 把docker-compose移动到 /usr/local/bin/

    mv docker-compose-linux-x86_64 /usr/local/bin/

    修改包名

    mv docker-compose-linux-x86_64 docker-compose
  3. 修改文件权限并配置环境变量

    chmod 777 docker-compose

    image-20240430204812484

  4. 在当前目录下查看版本

    docker-compose -v
  5. 配置环境变量

    vim ~/.bash_profile

    添加环境变量PATH=$PATH:/usr/local/bin/

    image-20240430204946072

    使环境变量生效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 部署 Halo 和 MySQL | Halo 1.x 文档

使用 Docker 镜像(一)

使用 Docker 部署 Halo | Halo 1.x 文档

Halo 在 Docker Hub 上发布的镜像为 halohub/halo

  1. 创建 工作目录

mkdir ~/.halo && cd ~/.halo

  1. 下载示例配置文件到 工作目录

wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml

  1. 编辑配置文件,配置数据库或者端口等,如需配置请参考 配置参考

vim application.yaml

  1. 拉取最新的 Halo 镜像

docker pull halohub/halo:1.6.0

查看最新版本镜像:https://hub.docker.com/r/halohub/halo ,我们推荐使用具体版本号的镜像,但也提供了 latest 标签的镜像,它始终是最新的。

  1. 创建容器

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 容器。

  1. 打开 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官网:使用 Docker Compose 部署 Halo | Halo 1.x 文档

Halo版本:halohub/halo Tags | Docker Hub

安装步骤

创建容器组

  1. 在系统任意位置创建一个文件夹,此文档以 ~/halo-app 为例。

    mkdir ~/halo-app && cd ~/halo-app

    注意:后续操作中,Halo 的所有相关数据都会保存在这个目录,请妥善保存。

  2. 创建 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:
  3. 启动 Halo 服务

    docker-compose up -d

    注意:

    1. networks:要设置同一个网络里;

    2. 这时候容器里还没有创建 对应的数据库,启动halo容器会报错[数据库连接失败],要进入容器中创建;查看halo日志,错误如下,只截取了主要部分:

      org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'r2dbcScriptDatabaseInitializer' defined in class path resource 

  4. 打开 http://ip:端口号 即可看到安装引导界面。

    http://8.138.91.101:8100/

Docker如何操作mysql容器

进入 MySQL 容器中登录 MySQL 并创建 Halo 需要的数据库

  1. halodb 为 MySQL 实例的容器名称

    docker exec -it halodb /bin/bash
  2. 登录MySQL

    mysql -u root -p
  3. 输入 MySQL 数据库密码,密码是docker-compose.yaml中填写的密码;

    如需修改密码,执行如下命令:

    ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
  4. 创建数据库

    create database halodb character set utf8mb4 collate utf8mb4_bin;
  5. 使用 exit退出MySQL 并退出容器

Halo 配置反向代理

参考链接:与 Nginx Proxy Manager 配合使用 | 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 的反向代理

首先我们登陆网页端之后,会弹出修改用户名和密码的对话框,我们根据自己的实际来修改自己的用户名和邮箱。

Nginx Proxy Manager 1

保存之后,会让我们修改密码(建议用一个复杂的密码)。

Nginx Proxy Manager 2

接着我们就可以来给 Halo 来添加一个反向代理了。

点击 Proxy Hosts

Nginx Proxy Manager 3

接着点击 Add Proxy Host,弹出如下对话框:

Nginx Proxy Manager 4

看起来都是英文,很复杂,但是其实很简单,我们只要用到其中的几个功能即可,这边稍微解释一下:

  • 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 自带的一个限制访问功能,这边我们不管,后续可以自行研究。

以下是一个样列:

Nginx Proxy Manager 5

因为样例的 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 访问。

Nginx Proxy Manager 6

Nginx Proxy Manager 7

如图所示,记得打开强制 SSL,其他四个的功能请自行研究,这边不多做讨论。

信息

  1. 申请证书需要你提前将域名解析到 NPM 所在的服务器的 IP 上;

  2. 如果你使用的是国内的服务器,默认 80443 端口是关闭的,你需要备案之后才能使用;

  3. 如果你使用了 CloudFlare 的 DNS 服务,记得把小黄云关闭(即不开启 CDN)。

不出意外,你将成功申请到 SSL 证书,证书会三个月自动续期。

再次点开配置,查看一下,将强制 SSL 打开。

Nginx Proxy Manager 8

至此,你已经成功完成了 Halo 的反向代理,快尝试使用域名访问一下看看吧!

Halo Twikoo 搭建

参考文章:Halo Twikoo 插件以及 ssl 部署

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命令失效了,可能是以下几个原因造成的:

  1. 命令路径错误:首先需要确认ls命令的路径是否正确。在Linux系统中,ls命令通常位于/bin或/usr/bin目录下。可以通过which ls命令查看ls命令的路径是否正确。如果路径错误,可以使用绝对路径来执行ls命令,例如/bin/ls。

  2. 命令不存在:如果ls命令的路径正确,但仍然无法执行,可能是因为ls命令没有安装或者被删除了。可以使用dpkg -l或者yum list命令查看ls命令是否安装在系统中。如果未安装,可以使用适合系统的包管理器安装ls命令,如apt-get或yum。

  3. 命令权限问题:如果ls命令的路径正确且已安装,但仍然无法执行,可能是因为当前用户没有执行ls命令的权限。可以使用ls -l命令查看ls命令的权限设置。如果权限不正确,可以使用chmod命令修改权限。例如,使用chmod +x ls命令给ls命令添加可执行权限。

  4. 环境变量问题:ls命令依赖于环境变量,如果环境变量不正确,可能导致ls命令无法执行。可以通过echo $PATH命令查看当前的环境变量设置。确认是否包含ls命令所在的目录。如果不包含,可以通过或者export PATH=$PATH:/usr/bin来添加ls命令所在的目录到环境变量中。

    修改文件:/etc/profile

    export PATH=$PATH:/usr/bin

    image-20240506100029860

  5. 系统文件损坏:如果以上方法都无法解决ls命令失效的问题,可能是因为系统文件损坏导致的。可以尝试使用备份文件或者重新安装系统来修复问题。

总结起来,如果ls命令失效了,需要通过确认命令路径、安装情况、权限设置、环境变量和系统文件等因素来进行排查和解决问题。