安装MySQL
获取镜像
docker pull mysql:5.7
运行容器
docker run \
--name mysql \
-d \
-p 3306:3306 \
--restart unless-stopped \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7
docker ps
验证MySQL
# 通过Docker命令进入Mysql容器内部
docker exec -it mysql /bin/bash
# 或者
docker exec -it mysql bash
mysql -uroot -p
MySQL无法远程登录
检查1:查看防火墙或云主机安全策略
#查看已开发的端口
firewall-cmd --list-all
# 开发3306端口
firewall-cmd --add-port=3306/tcp --permanent
# 策略生效
firewall-cmd --reload
检查2:root用户的当前主机配置信息为localhost
Host列指定了允许用户登录所使用的IP,比如user=root Host=192.168.1.1。这里的意思就是说root用户只能通过192.168.1.1的客户端去访问。 user=root Host=localhost,表示只能通过本机客户端去访问。而%是个通配符 ,如果Host=192.168.1.%,那么就表示只要是IP地址前缀为“192.168.1.”的客户端都可以连接。如果 Host=% ,表示所有IP都有连接权限。
注意:在生产环境下不能为了省事将host设置为%,这样做会存在安全问题,具体的设置可以根据生产环境的IP进行设置
use mysql;
select Host,User from user;
update user set host = '%' where user ='root';
flush privileges;
新建数据库halo
create database halodb character set utf8mb4 collate utf8mb4_bin;
安装Halo
docker拉取Halo镜像
docker pull halohub/halo:2.5.2
运行容器
docker run \
-it -d \
--name halo \
-p 8090:8090 \
-v ~/.halo2:/root/.halo2 \
--restart=unless-stopped \
halohub/halo:2.5.2 \
--halo.external-url=https://192.168.111.201/ \
--halo.security.initializer.superadminusername=admin \
--halo.security.initializer.superadminpassword=P@88w0rd \
--spring.r2dbc.url=r2dbc:pool:mysql://192.168.111.201:3306/halo \
--spring.r2dbc.username=halodb \
--spring.r2dbc.password=XjwKMKZ2EEahwpPF \
--spring.sql.init.platform=mysql
-it:开启输入功能并连接伪终端
-d:后台运行容器
--name:为容器指定一个名称
-p:端口映射,格式为 主机(宿主)端口:容器端口 ,可在 application.yaml 配置。
-v:工作目录映射。形式为:-v 宿主机路径:/root/.halo2,后者不能修改。
--restart: 建议设置为 unless-stopped,在 Docker 启动的时候自动启动 Halo 容器,除非主动关闭容器
变量详解:
参数名 | 描述 |
---|---|
| 数据库连接地址,详细可查阅下方的 |
| 数据库用户名 |
| 数据库密码 |
| 数据库平台名称,支持 |
| 外部访问链接,如果需要在公网访问,需要配置为实际访问地址 |
| 初始超级管理员用户名 |
| 初始超级管理员密码 |
数据库配置:
链接方式 | 链接地址格式 |
|
---|---|---|
PostgreSQL |
| postgresql |
MySQL |
| mysql |
MariaDB |
| mysql |
H2 Database |
| h2 |
用浏览器访问 /console
即可进入 Halo 管理页面,用户名和密码为启动参数中的 superadminusername
和 superadminpassword
。
出错情况1
[root@node-3 ~]# docker start cb67ca97f90d
cb67ca97f90d
[root@node-3 ~]#
[root@node-3 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f9828b3ebe50 mysql:5.7 "docker-entrypoint.s…" 2 hours ago Up 2 hours 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
[root@node-3 ~]# docker logs halo
[0.002s][warning][os,thread] Failed to start thread "GC Thread#0" - pthread_create failed (EPERM) for attributes: stacksize: 1024k, guardsize: 4k, detached.
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Cannot create worker GC thread. Out of system resources.
# An error report file with more information is saved as:
# /application/hs_err_pid6.log
[0.002s][warning][os,thread] Failed to start thread "GC Thread#0" - pthread_create failed (EPERM) for attributes: stacksize: 1024k, guardsize: 4k, detached.
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Cannot create worker GC thread. Out of system resources.
# An error report file with more information is saved as:
# /application/hs_err_pid6.log
解决办法:升级docker
出错情况2:无法连接127.0.1.1:3306
Caused by: io.netty.channel.AbstractChannel$AnnotatedConnectException: finishConnect(..) failed: Connection refused: localhost/127.0.0.1:3306
Caused by: java.net.ConnectException: finishConnect(..) failed: Connection refused
at io.netty.channel.unix.Errors.newConnectException0(Errors.java:166) ~[netty-transport-native-unix-common-4.1.91.Final.jar:4.1.91.Final]
at io.netty.channel.unix.Errors.handleConnectErrno(Errors.java:131) ~[netty-transport-native-unix-common-4.1.91.Final.jar:4.1.91.Final]
at io.netty.channel.unix.Socket.finishConnect(Socket.java:359) ~[netty-transport-native-unix-common-4.1.91.Final.jar:4.1.91.Final]
at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.doFinishConnect(AbstractEpollChannel.java:710) ~[netty-transport-classes-epoll-4.1.91.Final.jar:4.1.91.Final]
at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.finishConnect(AbstractEpollChannel.java:687) ~[netty-transport-classes-epoll-4.1.91.Final.jar:4.1.91.Final]
at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.epollOutReady(AbstractEpollChannel.java:567) ~[netty-transport-classes-epoll-4.1.91.Final.jar:4.1.91.Final]
at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:489) ~[netty-transport-classes-epoll-4.1.91.Final.jar:4.1.91.Final]
at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:397) ~[netty-transport-classes-epoll-4.1.91.Final.jar:4.1.91.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) ~[netty-common-4.1.91.Final.jar:4.1.91.Final]
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.91.Final.jar:4.1.91.Final]
at java.base/java.lang.Thread.run(Unknown Source) ~[na:na]
如果使用MySQL数据库,我们需要更改容器的网络配置。
Docker默认的网络模式是bridge,因此默认容器内无法访问本地127.0.0.1
--net,指定容器的网络配置:
--net=bridge 这个是默认值,连接到默认的网桥。
--net=host 容器使用本地主机的网络,它拥有完全的本地主机接口访问权限
--net=container:NAME_or_ID 让 Docker 使用其他容器的网路,共享IP和PORT等网络资源,两者进程可以直接通过 lo 环回接口通信
--net=none 容器使用自己的网络,但是不进行网络配置,之后用户可以自行配置
docker run \
-it -d \
--name halo \
-p 8090:8090 \
-v ~/.halo2:/root/.halo2 \
--net=host \
--restart=unless-stopped \
halohub/halo:2.6 \
--halo.external-url=https://192.168.111.201 \
--halo.security.initializer.superadminusername=admin \
--halo.security.initializer.superadminpassword=P@88w0rd \
--spring.sql.init.platform=mysql \
--spring.r2dbc.url=r2dbc:pool:mysql://192.168.111.201:3306/halodb \
--spring.r2dbc.username=halodb \
--spring.r2dbc.password=tbcCzGf3JfMZncpa
查看启动日志
docker logs -f halo
访问站点
反向代理实现域名访问
新建站点
配置反向代理
即可通过域名访问该站点,并可以通过申请证书开启https访问。