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.Driverurl: jdbc:mysql://halo-mysql:3306/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=trueusername: rootpassword: xxxxxxxx# H2 database console configuration.h2:console:settings:web-allow-others: falsepath: /h2-consoleenabled: falsehalo:# Your admin client path is https://your-domain/{admin-path}admin-path: admin# memory or levelcache: 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] <https://download.docker.com/linux/ubuntu> \\$(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] <http://mirrors.aliyun.com/docker-ce/linux/ubuntu> \\$(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] <https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu/> \\$(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

docker安装halo+mysql+nginx搭建个人博客相关推荐

  1. 阿里云服务器+Hexo+Nginx搭建个人博客网站

    目录 前言 本地端(个人PC) 安装node.js Linux环境下 安装(不建议) 配置环境变量 测试安装是否成功 Windows环境下 安装(推荐) 安装Hexo 两种部署方法 第一种做法(Git ...

  2. python连接MySQL数据库搭建简易博客

    实现功能大概 将python和MySQL数据库交互进行 封装 --->>utils.py 文件程序 ---->blog.py # -*- coding: utf-8 -*- # @T ...

  3. ubuntu 14.04服务器上使用nginx搭建wordpress博客详解

    过程详解 1.更新apt-get sudo apt-get update 2.安装nginx sudo apt-get install nginx 3.启动nginx sudo service ngi ...

  4. 利用Vultr主机安转宝塔Web面板搭建wordpress博客建站教程

    本篇文章是针对新手个人站长,来教大家利用Vultr主机如何安装宝塔Web面板搭建wordpress博客的方法. 1.一台Vultr VPS主机. 2.注册Vultr账号创建VPS实例 创建VPS实例 ...

  5. docker,mysql,wordpress搭建个人博客

    文章目录 设置仓库 更新 apt 包索引 安装 apt 依赖包,用于通过HTTPS来获取仓库: 添加 Docker 的官方 GPG 密钥 设置稳定版仓库 安装 Docker Engine-Commun ...

  6. 用Halo搭建个人博客-前置工作

    文章目录 用Halo搭建个人博客-Step1:准备工作 一.准备工作:需要云主机 入门级[1核2G+40G云盘].公网IP 带宽[1MB] .域名(国内需备案) 购买云主机 (以阿里云ECS为例,其他 ...

  7. VPS服务-Docker搭建个人博客网站

    容器安装 本人购买的 VPS 服务器是 Centos 8 操作系统,为了基于 Docker 搭建 WordPress 个人博客网站,首先需要安装 Docker 环境的过程如下: 1.下载 docker ...

  8. Docker安装halo

    Docker安装halo 自定义Docker网络 查看当前Docker网络 [root@10-7-176-211 ~]# docker network ls NETWORK ID NAME DRIVE ...

  9. 用Docker搭建WordPress博客

    目录 用Docker搭建WordPress博客 一.WordPress简介 二.Docker安装 三.下载mysql镜像及wordpress镜像 四.启动mysql及wordpress 五.访问及初始 ...

最新文章

  1. 出门问问李志飞:小米让别人无路可走,我也要让它走起来没有那么方便
  2. Storm InvalidTopologyException: null
  3. Spring security+jwt服务鉴权完整代码
  4. 总结几种结构体初始化方法 (转)
  5. creator图片循环显示_Cocos creator 游戏背景循环滚动--Javascript编写
  6. STM32之端口复用与重映射
  7. CISA 发布关于 Treck TCP/IP 栈中新漏洞的 ICS 安全公告
  8. 方管图纸标注_图样中型材的标注方法
  9. chrome内核浏览器调用本地exe客户端
  10. 调用企业微信接口发送微信消息
  11. C语言n番战--数组(三)
  12. 红帽linux安装中文输入法,Redhat安装中文输入法
  13. 千锋云计算毕业设计论文:论文设计任务书
  14. 《老爸老妈浪漫史》Barney和Robin终于。。。
  15. 计算机 蓝牙鼠标卡顿,win系统蓝牙鼠标经常出现卡顿的解决方法
  16. 发送ajax请求接收json数据,ajax接收到的json数据是空的
  17. 快速定位网页中元素在源代码中的位置
  18. 为什么喧闹过后,京东还是市值第四的中国互联网公司?
  19. 专业分析远离社死!如何看待QQ出现大面积盗号?
  20. Java-虚拟机原理

热门文章

  1. oracle中mybatis查询使用group by 和oder导致rownum混乱,查不到排序前10的数
  2. 【愚公系列】2023年04月 攻防世界-MOBILE(APK逆向)
  3. 几行Python代码实现人像动漫化, 让头像独一无二
  4. MySQL_MaxWell 写入Clickhouse
  5. uni-app:新大陆PDA盘点RFID
  6. Linux之命令行下安装GNOME桌面
  7. 雅思7+、托福110+的英语大神,原来都悄悄关注了这几个视频号!
  8. 电力系统装备杂志电力系统装备杂志社电力系统装备编辑部2022年第12期目录
  9. vant组件时间选择器修改时间格式以及默认展示当天时间
  10. 我们为什么要读书---摘自人民日报