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/dockerinstallhalo 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 系统初始配置 选择使用
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
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
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 network create halo-mysql-nginx-net
docker pull mysql:8.0.27
mkdir -p ~/.halo/mysql
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
docker exec -it halo-mysql /bin/bash
mysql -u root -p
create database halodb character set utf8mb4 collate utf8mb4_bin;
docker安装mysql命令解释
--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
3.4 docker安装halo
mkdir -p ~/.halo/halo && cd ~/.halo/halo
wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml
vim application.yaml
server:
port: 8090
compression:
enabled: false
spring:
datasource:
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:
console:
settings:
web-allow-others: false
path: /h2-console
enabled: false
halo:
admin-path: admin
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
到这里就可以去浏览器 使用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
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
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
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
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
-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-net
--restart=unless-stopped
-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;
}
}
docker restart halo-nginx
3.6 docker禁用8090端口访问
缘由:原文:https://github.com/chaifeng/ufw-docker
UFW 是 Ubuntu 上很流行的一个 iptables 前端,可以非常方便的管理防火墙的规则。但是当安装了 Docker,UFW 无法管理 Docker 发布出来的端口了。
具体现象是:
- 在一个对外提供服务的服务器上启用了 UFW,并且默认阻止所有未被允许的传入连接。
- 运行了一个 Docker 容器,并且使用
-p 选项来把该容器的某个端口发布到服务器的所有 IP 地址上。比如:docker run -d --name httpd -p 0.0.0.0:8080:80 httpd:alpine 将会运行一个 httpd 服务,并且将容器的 80 端口发布到服务器的 8080 端口上。 - UFW 将不会阻止所有对
8080 端口访问的请求,用命令 ufw deny 8080 也无法阻止外部访问这个端口。
这个问题其实挺严重的,这意味着本来只是为了在内部提供服务的一个端口被暴露在公共网络上。
以下是具体使用:
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
sudo systemctl restart ufw
ufw-docker install
ufw route allow proto tcp from any to any port 443
4 腾讯云ubuntu搭建
4.1 系统初始配置 选择使用
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
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
|