docker安装halo+mysql+nginx搭建个人博客

docker 安装halo+mysql+nginx搭建个人博客(debian or ubuntu)

1 简介

本文主要介绍debian和国内腾讯云ubuntu下安装docker,使用docker安装halo+mysql+nginx,nginx代理,以及ufw-docker防火墙的开启。

最后实现一个使用域名访问的个人博客网站,禁用ip访问,禁用8090端口。
全文:13059 字

本文其他地址
博客站点:https://mustvv.com/archives/dockerhalo
https://zhuanlan.zhihu.com/p/477859981

1.1 halo

一款现代化的开源博客/CMS系统。学习地址:https://halo.run/

1.2 mysql

MySQL 是流行的关系型数据库管理系统。学习地址: https://www.runoob.com/mysql/mysql-tutorial.html

1.3 nginx

Nginx是高性能的 Web和反向代理服务器。

学习地址:https://www.runoob.com/linux/nginx-install-setup.html ; https://www.cnblogs.com/ysocean/p/9392908.html

1.4 docker

Docker 是一个开源的应用容器引擎。学习地址:https://www.runoob.com/docker/docker-tutorial.html

2 搭建准备

服务器一台,带宽尽量大,腾讯云有8M的轻量型还不错。

其他云 Debian 11 X86 64 -->下转3

腾讯云 Ubuntu 20.04.3 LTS -->下转4

若需要域名访问,则同时准备 购买域名+ssl证书(阿里云免费)+域名备案!见后文参考链接

3 Debian 11搭建

3.1 系统初始配置 选择使用


# 开启bbr
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf && echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf && sysctl -p 

# 软件列表升级以及预装软件
apt update && apt upgrade -y &&apt install vim sudo tmux ufw git curl wget zip net-tools -y

# 设置ls
echo "export LS_OPTIONS='--color=auto'" >> ~/.bashrc && echo "eval \"\$(dircolors)\"" >> ~/.bashrc && echo "alias ls='ls $LS_OPTIONS'" >> ~/.bashrc && echo "alias ll='ls $LS_OPTIONS -l'" >> ~/.bashrc && echo "alias l='ls $LS_OPTIONS -lA'" >> ~/.bashrc && source .bashrc

# 时区
timedatectl set-timezone Asia/Shanghai 

# 设置ssh免密登录"xxxxxxxxxxxxxxx" 为你本地电脑的id_rsa.pub
mkdir -p ~/.ssh && chmod 700 ~/.ssh/ && touch ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys && echo "xxxxxxxxxxxxxxx" >> ~/.ssh/authorized_keys

# 重启
reboot

3.2 Debian 一键安装docker

sudo apt-get update && sudo apt-get install ca-certificates curl gnupg lsb-release -y && curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg && echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null && sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io -y && sudo systemctl enable docker && sudo systemctl start docker && sudo docker run hello-world && docker rm -f $(docker ps -aq) && docker rmi -f $(docker images -aq) && echo > /root/.bash_history && echo finish!

发现最后输出finish! 即为成功。不同系统安装命令不同,参考https://docs.docker.com/engine/install/debian/

3.3 docker安装mysql

# 创建 Docker 自定义桥接网络
docker network create halo-mysql-nginx-net 
# 拉取 MySQL 镜像
docker pull mysql:8.0.27
# 创建文件夹
mkdir -p ~/.halo/mysql

# 启动 MySQL 实例 xxxxxxxxx为你自己设置的密码
docker run --name halo-mysql -v ~/.halo/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=xxxxxxxx --net halo-mysql-nginx-net --restart=unless-stopped -d mysql:8.0.27

# 进入 MySQL 容器中登录 MySQL 并创建 Halo 需要的数据库
docker exec -it halo-mysql /bin/bash

# 登录 MySQL
mysql -u root -p
# 输入 MySQL 数据库密码

# 创建数据库
create database halodb character set utf8mb4 collate utf8mb4_bin;

# 使用 exit 退出MySQL 
# 使用 exit 退出容器 因为之前设置了--restart=unless-stopped 不用担心容器停止


docker安装mysql命令解释

--name halo-mysql                  # 设置容器名字
-v ~/.halo/mysql:/var/lib/mysql    # 卷挂载。 本地地址:容器内部地址
-e MYSQL_ROOT_PASSWORD=xxxxxxxx    # 设置mysql密码
--net halo-mysql-nginx-net         # 挂载网络
--restart=unless-stopped           # 除非手动停止否则自动重启
-d                                 # 后台运行
mysql:8.0.27                       # mysql版本

3.4 docker安装halo

# 创建 Halo 工作目录
mkdir -p ~/.halo/halo && cd ~/.halo/halo

# 下载示例配置文件到工作目录
wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml

# vim编辑配置文件 
vim application.yaml
# 你需要做如下几个步骤:

# 注释 H2 database configuration.部分
# 启用 MySQL database configuration.部分
# 修改 datasource 下的 url 中的 ip 地址部分为容器名称并修改密码为您设定的 MySQL 密码

# 可以进入vim 后 ggdG 删除所有内容,再复制以下内容 粘贴

# 修改后的application.yaml文件内容如下:

server:
  port: 8090

  # Response data gzip.
  compression:
    enabled: false
spring:
  datasource:

    # H2 database configuration.
    #driver-class-name: org.h2.Driver
    #url: jdbc:h2:file:~/.halo/db/halo
    #username: admin
    #password: 123456

    # MySQL database configuration.
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://halo-mysql:3306/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
    username: root
    password: xxxxxxxx

  # H2 database console configuration.
    h2:
    console:
      settings:
        web-allow-others: false
      path: /h2-console
      enabled: false

halo:

  # Your admin client path is https://your-domain/{admin-path}
  admin-path: admin

  # memory or level
  cache: memory

启用halo

# 启用
docker run -it -d --name halo -p 8090:8090 -v ~/.halo/halo:/root/.halo --net halo-mysql-nginx-net --restart=unless-stopped halohub/halo:1.4.17

docker安装halo命令解释

-it -d                             # 运行方式
--name halo                        # 设置容器名字
-p 8090:8090                       # 端口设置
-v ~/.halo/halo:/root/.halo        # 卷挂载。 本地地址:容器内部地址
--net halo-mysql-nginx-net         # 挂载网络
--restart=unless-stopped           # 除非手动停止否则自动重启
halohub/halo:1.4.17                # halo版本

到这里就可以去浏览器 使用ip:8090打开个人博客网站。会看到 Halo 安装向导

以下是配置nginx代理,需要自己拥有一个域名(哪里便宜买哪里),ssl证书(这里用的是阿里云证书因为个人免费)。

一定要配置好域名解析和放好证书的位置!!!!

域名解析参考:https://www.alibabacloud.com/help/zh/doc-detail/39903.htm

阿里云证书申请参考:https://help.aliyun.com/document_detail/156645.html

同时,域名解析到国内服务器需要进行备案!!不备案不能用80和443!

域名备案:https://cloud.tencent.com/product/ba

# 下载好证书,获得7381140_blog.mustvv.com_nginx.zip
# 将其传到服务器内 这里使用win下的scp 也可使用其他服务器文件传输工具直接拖
scp mustvv.com_nginx.zip root@你的服务器ip:/root/.halo/nginx/certificate
# 服务器上解压
unzip mustvv.com_nginx.zip 

# 往容器内传文件
docker cp mustvv.com.key halo-nginx:/etc/nginx/certs
docker cp mustvv.com.pem halo-nginx:/etc/nginx/certs


3.5 docker安装nginx

# 先运行一个nginx容器test
docker run --name test -p 81:80 -d nginx

# 建立服务器本地的文件夹
mkdir -p ~/.halo/nginx/data/nginx/conf ~/.halo/nginx/data/nginx/conf.d ~/.halo/nginx/data/nginx

# 从容器拷贝文件到本地方便之后挂载test
docker cp test:/etc/nginx/nginx.conf ~/.halo/nginx/data/nginx/conf && docker cp test:/etc/nginx/conf.d/default.conf ~/.halo/nginx/data/nginx/conf.d && docker cp test:/usr/share/nginx/html ~/.halo/nginx/data/nginx

# 删除这个测试容器
docker rm test -f

# 再安装需要的nginx容器
docker run \
--name halo-nginx \
-p 80:80 \
-p 443:443 \
-v ~/.halo/nginx/data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v ~/.halo/nginx/data/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf \
-v ~/.halo/nginx/data/nginx/html:/usr/share/nginx/html \
-v ~/.halo/nginx/data/nginx/log:/var/log/nginx \
-v ~/.halo/nginx/data/nginx/certs:/etc/nginx/certs \
--network halo-mysql-nginx-net \
--restart=unless-stopped \
-d \
nginx

此时访问服务器ip地址 看到Welcome to nginx! 即为成功

docker安装nginx参数说明

--name halo-nginx                 # 给容器取名为halo-nginx
-p 80:80                          # 容器80端口映射到宿主机80端口,HTTP
-p 443:443                        # 容器443端口映射到宿主机443端口,HTTPS
-v ~/.halo/nginx/data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf               # nginx.conf可以配置反向代理
-v ~/.halo/nginx/data/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf  # default.conf可以配置反向代理
-v ~/.halo/nginx/data/nginx/html:/usr/share/nginx/html            # 挂载html目录,存放静态网页
-v ~/.halo/nginx/data/nginx/log:/var/log/nginx                    # 挂载log目录,存放日志
-v ~/.halo/nginx/data/nginx/certs:/etc/nginx/certs                # 挂载certs目录,存放ssl证书
--network halo-net                # 将Nginx容器加入与Halo容器同一网络。
--restart=unless-stopped          # Docker启动时自动启动这个容器
-d                                # 设置后台容器运行

修改本地nginx配置文件default.conf ,之后容器restart即可同步进去容器的配置

vim /root/.halo/nginx/data/nginx/conf.d/default.conf

删除原有全部内容 并修改如下:

每个server功能:第一个 禁用ip访问;第二个 强制跳转https;第三个禁用https的ip访问 ; 第四个只允许https的域名访问

域名和证书要改成你自己的!!!!!!!!!!

return 400 404 444 看自己选择

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name _;
        return 404;
}

server {
    listen      80;
    server_name blog.mustvv.com;
    return 301  https://$host$request_uri;
}

server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    ssl_certificate     /etc/nginx/certs/7381140_blog.mustvv.com.pem;
    ssl_certificate_key /etc/nginx/certs/7381140_blog.mustvv.com.key;
    server_name _;
    return 404;
}

server {
    listen       443 ssl;
    server_name  blog.mustvv.com;

    ssl_certificate     /etc/nginx/certs/7381140_blog.mustvv.com.pem;
    ssl_certificate_key /etc/nginx/certs/7381140_blog.mustvv.com.key;

    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    client_max_body_size 1024m;
    location / {
      proxy_pass http://halo:8090;
      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;
    }
}
# 重启nginx 服务
docker restart halo-nginx

3.6 docker禁用8090端口访问

缘由:原文:https://github.com/chaifeng/ufw-docker

UFW 是 Ubuntu 上很流行的一个 iptables 前端,可以非常方便的管理防火墙的规则。但是当安装了 Docker,UFW 无法管理 Docker 发布出来的端口了。

具体现象是:

  1. 在一个对外提供服务的服务器上启用了 UFW,并且默认阻止所有未被允许的传入连接。
  2. 运行了一个 Docker 容器,并且使用 -p 选项来把该容器的某个端口发布到服务器的所有 IP 地址上。比如:docker run -d --name httpd -p 0.0.0.0:8080:80 httpd:alpine 将会运行一个 httpd 服务,并且将容器的 80 端口发布到服务器的 8080 端口上。
  3. UFW 将不会阻止所有对 8080 端口访问的请求,用命令 ufw deny 8080 也无法阻止外部访问这个端口。

这个问题其实挺严重的,这意味着本来只是为了在内部提供服务的一个端口被暴露在公共网络上。

以下是具体使用:

# 获取文件 替换git链接 参考https://doc.fastgit.org/zh-cn/guide.html
sudo wget -O /usr/local/bin/ufw-docker \
  https://hub.fastgit.xyz/chaifeng/ufw-docker/raw/master/ufw-docker
# 基于权限
chmod +x /usr/local/bin/ufw-docker

# 重启ufw 
sudo systemctl restart ufw
# 把 UFW 和 Docker 的相关规则添加到文件 `after.rules` 的末尾
ufw-docker install

# 开启443 https端口
ufw route allow proto tcp from any to any port 443

# 此时访问博客唯一方式是域名访问

4 腾讯云ubuntu搭建

4.1 系统初始配置 选择使用

# 开启bbr
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf && echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf && sysctl -p 

# 软件列表升级以及预装软件
apt update && apt upgrade -y &&apt install vim sudo tmux ufw git curl wget zip net-tools -y

# 设置ssh免密登录"xxxxxxxxxxxxxxx" 为你本地电脑的id_rsa.pub
mkdir -p ~/.ssh && chmod 700 ~/.ssh/ && touch ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys && echo "xxxxxxxxxxxxxxx" >> ~/.ssh/authorized_keys

# 重启
reboot

4.2 腾讯云ubuntu一键安装docker 注意使用腾讯云服务器

sudo apt-get update && sudo apt-get install ca-certificates curl gnupg lsb-release -y && curl -fsSL https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg && echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu/ \
  $(lsb_release -cs) stable " | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null && sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io -y && sudo systemctl enable docker && sudo systemctl start docker && sudo docker run hello-world && docker rm -f $(docker ps -aq) && docker rmi -f $(docker images -aq) && echo > /root/.bash_history && echo finish!

发现最后输出finish! 即为成功。不同系统安装命令不同,参考https://docs.docker.com/engine/install/

其实不同厂Ubuntu不同的原因如下,为了安装连接的稳定性需要更换一些链接。

1为了确认所下载软件包的合法性,需要添加软件源的 GPG 密钥

curl -fsSL <https://download.docker.com/linux/ubuntu/gpg> | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 阿里云:
curl -fsSL <http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg> | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 腾讯云
curl -fsSL <https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu/gpg> | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

2向 sources.list 中添加 Docker 软件源

echo \\
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg]  \\
  $(lsb_release -cs) stable "| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 阿里云:
echo \\
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg]  \\
  $(lsb_release -cs) stable " | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 腾讯云
echo \\
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg]  \\
  $(lsb_release -cs) stable " | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

4.3其他步骤如上3.3 docker安装mysql 开始

参考文章

https://www.grandpa2.fun/archives/docker安装halonginx#toc-head-4

https://docs.halo.run/getting-started/install/docker/#nginx

https://github.com/chaifeng/ufw-docker

你可能感兴趣的:(linux,nginx,docker,mysql)