本文主要介绍使用
Docker Compose
部署Halo 2.x
和MySQL
, 主要针对小白。 有一定基础的, 可以直接去官网查看。
先使用下面命令, 判断系统是都已经安装 Docker
, 如果已经安装, 会正常数据 Docker
的版本。 如果已经安装, 跳过此步骤。
root@nukixPC:~$ docker --version
Docker version 24.0.7, build afdd53b
如果没有安装,使用下面命令进行一键安装。
root@nukixPC:~/Desktop$ curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# Executing docker install script, commit: e5543d473431b782227f8908005543bb4389b8de
+ sudo -E sh -c 'apt-get update -qq >/dev/null'
+ sudo -E sh -c 'DEBIAN_FRONTEND=noninteractive apt-get install -y -qq apt-transport-https ca-certificates curl >/dev/null'
+ sudo -E sh -c 'install -m 0755 -d /etc/apt/keyrings'
+ sudo -E sh -c 'curl -fsSL "https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg" | gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg'
+ sudo -E sh -c 'chmod a+r /etc/apt/keyrings/docker.gpg'
+ sudo -E sh -c 'echo "deb [arch=arm64 signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu jammy stable" > /etc/apt/sources.list.d/docker.list'
+ sudo -E sh -c 'apt-get update -qq >/dev/null'
+ sudo -E sh -c 'DEBIAN_FRONTEND=noninteractive apt-get install -y -qq docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-ce-rootless-extras docker-buildx-plugin >/dev/null'
+ sudo -E sh -c 'docker version'
Client: Docker Engine - Community
Version: 24.0.7
API version: 1.43
Go version: go1.20.10
Git commit: afdd53b
Built: Thu Oct 26 09:08:26 2023
OS/Arch: linux/arm64
Context: default
Server: Docker Engine - Community
Engine:
Version: 24.0.7
API version: 1.43 (minimum version 1.12)
Go version: go1.20.10
Git commit: 311b9ff
Built: Thu Oct 26 09:08:26 2023
OS/Arch: linux/arm64
Experimental: false
containerd:
Version: 1.6.26
GitCommit: 3dd1e886e55dd695541fdcd67420c2888645a495
runc:
Version: 1.1.10
GitCommit: v1.1.10-0-g18a0cb0
docker-init:
Version: 0.19.0
GitCommit: de40ad0
================================================================================
To run Docker as a non-privileged user, consider setting up the
Docker daemon in rootless mode for your user:
dockerd-rootless-setuptool.sh install
Visit https://docs.docker.com/go/rootless/ to learn about rootless mode.
To run the Docker daemon as a fully privileged service, but granting non-root
users access, refer to https://docs.docker.com/go/daemon-access/
WARNING: Access to the remote API on a privileged Docker daemon is equivalent
to root access on the host. Refer to the 'Docker daemon attack surface'
documentation for details: https://docs.docker.com/go/attack-surface/
================================================================================
安装完后, 再使用 docker --version
确认安装成功即可。
先使用下面命令, 判断系统是都已经安装 Docker Compose
, 如果已经安装, 会正常数据 Docker Compose
的版本。 如果已经安装, 跳过此步骤。由于版本的差异, docker compose
与 docker-compose
其中一个可以使用即可。
root@nukixPC:~$ docker compose version
Docker Compose version v2.21.0
[root@nukixPC ~]# docker-compose --version
Docker Compose version v2.17.3
如果没有安装,使用下面命令进行一键安装。
root@nukixPC:~/Desktop$ sudo curl -L https://get.daocloud.io/docker/compose/releases/download/v2.23.3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 162 100 162 0 0 708 0 --:--:-- --:--:-- --:--:-- 710
安装完后, 再使用 docker compose version
与 docker-compose --version
确认安装, 其中一个安装成功即可, 哪个成功, 下面就使用哪个作为语句。
# 启动 docker 服务
systemctl start docker
# 停止 docker 服务
systemctl stop docker
# 重新启动 docker 服务
systemctl restart docker
# 把 docker 设置为开机启动
systemctl enable docker
# 取消 docker 开机启动
systemctl disable docker
# 下面的命令根据 docker compose version 与 docker-compose --version 决定使用哪一个
# 根据 docker-compose.yaml 配置启动服务(必须 cd 到 docker-compose.yaml 目录)
docker compose up -d
docker-compose up -d
# 根据 docker-compose.yaml 配置停止服务(必须 cd 到 docker-compose.yaml 目录)
docker compose down
docker-compose down
注意: 确保每次改配置前, 先调用 docker compose down
关闭容器。
首先创建一个文件夹, 任意位置即可, 官方推荐使用 ~/halo
目录。
mkdir ~/halo && cd ~/halo
然后创建 docker-compose.yaml
配置文件。
vim ~/halo/docker-compose.yaml
把下面配置文件复制进去
version: "3"
services:
halo:
image: halohub/halo:2.11
container_name: halo
restart: on-failure:3
depends_on:
halodb:
condition: service_healthy
networks:
halo_network:
volumes:
- ./halo2:/root/.halo2
ports:
- "8090:8090"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
interval: 30s
timeout: 5s
retries: 5
start_period: 30s
command:
- --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/
halodb:
image: mysql:8.1.0
container_name: halodb
restart: on-failure:3
networks:
halo_network:
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:
- "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:
然后在 ~/halo
文件夹中, 使用配置启动容器。(如果上面 docker-compose --version
可用, 那么此处应该使用 sudo docker-compose up -d
)
root@nukixPC:~/halo$ sudo docker compose up -d
[+] Running 22/22
? halodb 10 layers [??????????] 0B/0B Pulled 87.4s
? e39ec8f010eb Pull complete 49.0s
? e2b7fadc33ec Pull complete 33.7s
? 9d193449aafd Pull complete 38.2s
? 6ea497c74b15 Pull complete 38.9s
? 7778acbf55f3 Pull complete 40.8s
? b65a5d7a2435 Pull complete 40.3s
? cef9fb0078a5 Pull complete 58.7s
? 5b6dc73ec724 Pull complete 42.2s
? d992bb39e209 Pull complete 77.5s
? 4431432b89a3 Pull complete 50.4s
? halo 10 layers [??????????] 0B/0B Pulled 42.6s
? 7734efb8b826 Pull complete 19.3s
? 99aeb38bcf66 Pull complete 12.2s
? f11698de8208 Pull complete 16.2s
? fba9be95bc5e Pull complete 20.0s
? 2aeadb252420 Pull complete 17.6s
? b7b59b0b46ed Pull complete 36.6s
? be3c46ee9bf6 Pull complete 22.3s
? e9881bf6fa6f Pull complete 23.4s
? 52f80228d2cb Pull complete 32.0s
? 3dceb7e8fe22 Pull complete 27.0s
[+] Running 3/3
? Network halo_halo_network Created 0.1s
? Container halodb Healthy 0.1s
? Container halo Started 0.0s
执行完命令后可以使用下面命令查看状态。
netstat -nlt
用来查看端口占用情况, 上面的 docker-compose.yaml
文件配置了 Halo
的端口为 8090
, MySQL
的端口为 3306
。
root@nukixPC:~/halo$ netstat -nlt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:8090 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 :::3306 :::* LISTEN
tcp6 0 0 :::8090 :::* LISTEN
docker ps
可以查看运行中的容器。
root@nukixPC:~/Desktop/halo$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
19ac11fb439c halohub/halo:2.11 "sh -c 'java ${JVM_O…" 42 seconds ago Up 32 seconds (healthy) 0.0.0.0:8090->8090/tcp, :::8090->8090/tcp halo
08d024cbe9c1 mysql:8.1.0 "docker-entrypoint.s…" 42 seconds ago Up 41 seconds (healthy) 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp halodb
数据文件生成, 这时候可以看到 ~/halo
文件夹中多了 3 个文件夹。
其中 halo2
是 halo2 的数据文件夹, mysql
和 mysqlBackup
是 mysql 的数据文件夹。
root@nukixPC:~/halo$ ls
docker-compose.yaml halo2 mysql mysqlBackup
root@nukixPC:~/halo$ ls halo2
indices keys logs themes
root@nukixPC:~/halo$ ls mysql
'#ib_16384_0.dblwr' auto.cnf ca-key.pem halo mysql private_key.pem sys
'#ib_16384_1.dblwr' binlog.000001 ca.pem ib_buffer_pool mysql.ibd public_key.pem undo_001
'#innodb_redo' binlog.000002 client-cert.pem ibdata1 mysql.sock server-cert.pem undo_002
'#innodb_temp' binlog.index client-key.pem ibtmp1 performance_schema server-key.pem
root@nukixPC:~/halo$ ls mysqlBackup
这时候可以打开浏览器, 输入 http://[输入这台服务器的IP]:8090
即可进入 Halo 2
的配置页面, 配置完成即可进入博客。
需要修改两个地方, 一个是 mysql 容器配置的密码 MYSQL_ROOT_PASSWORD
, 另外一个是 Halo2
容器连接 mysql 时用到的密码 --spring.r2dbc.password
。 比如我要把密码修改为 88888888
, 那么修改 docker-compose.yaml
, 修改前记得使用 docker compose down
关闭容器。
...
- --spring.r2dbc.password=88888888
...
- MYSQL_ROOT_PASSWORD=88888888
...
使用命令 docker compose up -d
启动服务。 这时候大概率启动失败,halo 容器启动不了。
root@nukixPC:~/halo$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
92805e3dcc42 halohub/halo:2.11 "sh -c 'java ${JVM_O…" About a minute ago Up 2 seconds (health: starting) 0.0.0.0:8090->8090/tcp, :::8090->8090/tcp halo
ef5c6a3d9462 mysql:8.1.0 "docker-entrypoint.s…" About a minute ago Up About a minute (healthy) 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp halodb
这时候可以使用 docker logs [CONTAINER ID]
查看 log。
root@nukixPC:~/halo$ sudo docker logs 92805e3dcc42
...
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'r2dbcScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/R2dbcInitializationConfiguration.class]: Failed to execute database script
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1775) ~[spring-beans-6.1.1.jar:6.1.1]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) ~[spring-beans-6.1.1.jar:6.1.1]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) ~[spring-beans-6.1.1.jar:6.1.1]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325) ~[spring-beans-6.1.1.jar:6.1.1]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.1.1.jar:6.1.1]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323) ~[spring-beans-6.1.1.jar:6.1.1]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-6.1.1.jar:6.1.1]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:973) ~[spring-beans-6.1.1.jar:6.1.1]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:946) ~[spring-context-6.1.1.jar:6.1.1]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:616) ~[spring-context-6.1.1.jar:6.1.1]
at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.refresh(ReactiveWebServerApplicationContext.java:66) ~[spring-boot-3.2.0.jar:3.2.0]
会发现报错, 提示数据库连接失败。 这是因为首次进入的时候已经使用密码对数据库进行初始化, 所以直接改 docker-compose.yaml
配置不会生效。所以这里提供两种解决方法。
sudo rm -rd mysql*
删除上面提到的 mysql
和 mysqlBackup
文件夹。然后重新 docker compose up -d
即可启动。o#DwN&JSa56
, 改回去后 docker compose up -d
启动。再通过远程 mysql, 使用命令更换 mysql 密码。 修改完后, 在修改 docker-compose.yaml
为修改后的密码, 再次启动即可。比如我要把 halo 2
修改为 9090
端口, mysql
修改为 9089
端口, 那么先修改 docker-compose.yaml
。
...
ports:
- "9090:8090"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9090/actuator/health/readiness"]
# 外部访问地址,请根据实际需要修改
- --halo.external-url=http://localhost:9090/
...
ports:
- "9089:3306"
...
然后使用 docker compose up -d
启动容器即可。可以查看端口占用情况
parallels@ubuntu-linux-22-04-desktop:~/Desktop/halo$ netstat -nlt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:9089 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:9090 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 :::9089 :::* LISTEN
tcp6 0 0 :::9090 :::* LISTEN
可以看到端口成功被修改, 可以通过浏览器访问 http://[输入这台服务器的IP]:9090
即可打开博客。