docker安装MySQL和Halo,并设置域名访问

CoderJia 88 2023-06-05

安装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

halo1.png验证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;

halo2.png安装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 容器,除非主动关闭容器

变量详解:

参数名

描述

spring.r2dbc.url

数据库连接地址,详细可查阅下方的 数据库配置

spring.r2dbc.username

数据库用户名

spring.r2dbc.password

数据库密码

spring.sql.init.platform

数据库平台名称,支持 postgresqlmysqlh2

halo.external-url

外部访问链接,如果需要在公网访问,需要配置为实际访问地址

halo.security.initializer.superadminusername

初始超级管理员用户名

halo.security.initializer.superadminpassword

初始超级管理员密码

数据库配置:

链接方式

链接地址格式

spring.sql.init.platform

PostgreSQL

r2dbc:pool:postgresql://{HOST}:{PORT}/{DATABASE}

postgresql

MySQL

r2dbc:pool:mysql://{HOST}:{PORT}/{DATABASE}

mysql

MariaDB

r2dbc:pool:mariadb://{HOST}:{PORT}/{DATABASE}

mysql

H2 Database

r2dbc:h2:file:///${halo.work-dir}/db/halo-next?MODE=MySQL&DB_CLOSE_ON_EXIT=FALSE

h2

用浏览器访问 /console 即可进入 Halo 管理页面,用户名和密码为启动参数中的 superadminusernamesuperadminpassword

出错情况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

访问站点

http://192.168.111.201:8090/

halo3.png反向代理实现域名访问

新建站点

halo4.5.pnghalo5.png 配置反向代理

halo6.png即可通过域名访问该站点,并可以通过申请证书开启https访问。