侧边栏壁纸
博主头像
可乐没气的猫博主等级

四分之一的职业法师|二次元的分享家

  • 累计撰写 12 篇文章
  • 累计创建 6 个标签
  • 累计收到 19 条评论

目 录CONTENT

文章目录

20220228 Docker安装Halo、Nginx、Wiz

可乐没气的猫
2022-02-28 / 2 评论 / 7 点赞 / 3,774 阅读 / 6,257 字

前言

时隔两年多,准备再次启用自己的个人博客,从Wordpress到Hexo,再到Hugo,又到Typecho,兜兜转转最后还是决定体验下轻量的Halo博客。
为了减少一些不必要的麻烦,入手了腾讯云全球服务器。域名选购的老牌厂商namesilo的域名。
之前搭建的博客都是用lamp或者宝塔一键搭建的。为了节省服务器资源,选择了更加轻量centos-docker方式。
说干就干,all in docker,all in one vps!这里记录一下使用Docker Halo + Docker Nginx+Docker wiz的搭建过程。

访问地址

Docker Halo地址:可乐没气的猫
Docker Wizx地址:猫的私人笔记

Dokcer简介

在开始之前还是说下Dokcer吧,正好也记录一下我的理解。
首先要说的,就是一个应用的大致运行流程:应用调用系统的函数库(对于内核的指令封装),函数库调用内核指令,指令操作计算机硬件。
无论是Ubuntu还是CentOS,都是基于Linux内核的,这些操作系统的区别就是,提供的函数库不同,所以一个应用运行在不同操作系统上,会因为找不到需要的函数库而出错。
Docker技术就是将一个应用及其运行所需的运行环境、依赖等打包成镜像,只调用Linux内核。各个容器应用互相隔离,互不干扰(沙箱机制)。
所以Docker应用可以运行在任何Linux系统上,因为仅仅使用到Linux内核。

Docker部署流程

首先是在服务器上安装Dokcer,这里我参考的是Docker官方安装文档,海外vps无需要考虑网络限制相关问题。
namesilo域名解析删除全部解析,腾讯云全球服务器有个坑需要备注下,域名解析的NS服务器设置为腾讯云专有:DNS解析DNSPod
namesilo ns设置
也可以参照这篇博客记录:namesilo购买的域名在腾讯云Linux服务器中的解析设置
剩下的解析交给DNSPod去处理,添加一级域名的解析,二级域名根据你的场景再添加解析,支持一年的免费SSL证书,这个非常香。
namesilo域名解析交给dnspod

Docker安装Halo

装好Dokcer后,参考Halo官方文档运行Halo容器。这里要注意的是,需要在云服务器的安全组规则里暴露端口(Halo配置文件中指定的端口),然后就能通过IP:端口号访问Halo博客。如果之前有装过Halo,想保留数据的话,只需备份~/.halo文件夹中的内容即可(参考版本升级)。
考虑到后续会使用到Nginx,这里创建一个网络,将Halo容器加入网络中。

docker network create halongwiz

检查一下docker network

docker network ls
NETWORK ID     NAME        DRIVER    SCOPE
de27fbcc82bd   halongwiz   bridge    local

创建Halo容器,并加入刚才的网络。

docker run -it \
-d \
--name halo \
-p 8090:8090 \
-v ~/.halo:/root/.halo \
--network halongwiz \
--restart=unless-stopped \
halohub/halo:latest

这里只加了“--network halongwiz”,其余与官方文档相同。
容器运行成功的话,通过IP:端口号可以看到Halo的index页面。

Docker安装Nginx

首先拉取Nginx镜像。

docker pull nginx:latest

latest表示拉取最新的版本,也可以指定版本。
因为Dokcer镜像仅包含应用所需的依赖,所以直接修改容器内配置文件很麻烦(连vi命令都没有),而且容器内的修改对外是不可见的,对新容器也是不可复用的,所以使用目录/文件挂载的方式,将容器内目录/文件与宿主机目录/文件绑定,这样只需修改宿主机文件就可以,容器删除后,修改的文件也可以保留。
目录/文件挂载语法:

-v [宿主机目录]:[容器内目录]
-v [宿主机文件]:[容器内文件]

先创建个Nginx容器,复制要用到的文件。

docker run --name mn -p 81:80 -d nginx

复制容器内文件到宿主机内。

mkdir -p /data/nginx/conf /data/nginx/conf.d
docker cp mn:/etc/nginx/nginx.conf /data/nginx/conf/
docker cp mn:/etc/nginx/conf.d/default.conf /data/nginx/conf.d/
docker cp mn:/usr/share/nginx/html /data/nginx

删除容器。

docker rm mn -f

创建新的Nginx容器。

docker run \
--name nginx \
-p 80:80 \
-p 443:443 \
-v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /data/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf \
-v /data/nginx/html:/usr/share/nginx/html \
-v /data/nginx/log:/var/log/nginx \
-v /data/nginx/certs:/etc/nginx/certs \
--network halongwiz \
--restart=unless-stopped \
-d \
nginx

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

这里需要注意的是,服务器暴露80端口和443端口(一般默认会放行),以及Docker容器之间互相隔离,但是要做反向代理就必须让Nginx容器能访问Halo容器。

这里我参考的是这篇文章,创建了bridge网络,创建容器的时候将容器加入网络,这样同一网络的容器就能互相访问。也可以使用link参数,左边是容器名,右边是容器别名,使用别名访问容器,这种方式对容器的创建顺序有要求。
容器运行成功的话,通过IP:端口号可以看到Nginx的index页面。

Docker安装Wiz

修改启动参数,启动服务,修改映射端口

docker run -it \
-d \
--name wiz \
-p 8070:80  \
-p 9269:9269/udp \
-v  ~/wizdata:/wiz/storage \
-v  /etc/localtime:/etc/localtime \
--network halonginx \
--restart=always \
wiznote/wizserver

容器运行成功的话,通过IP:8070可以看到wiz的登录页面。

安装完Halo、Nginx、Wiz,使用docker container ls看下容器是否创建成功。

docker container ls
CONTAINER ID   IMAGE                 COMMAND                  CREATED        STATUS          PORTS                                          NAMES
e8fcbe8ab0ac   wiznote/wizserver     "bash /wiz/app/entry…"   22 hours ago   Up 30 minutes   0.0.0.0:9269->9269/udp, 0.0.0.0:8070->80/tcp   wiz
0cf06b855315   nginx                 "/docker-entrypoint.…"   30 hours ago   Up 6 hours      0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp       nginx
807b80ecbe66   halohub/halo:latest   "/bin/sh -c 'java -X…"   30 hours ago   Up 9 hours      0.0.0.0:8090->8090/tcp                         halo

Docker更新

使用 Watchtower 来自动更新 WizNote 的镜像:https://github.com/containrrr/watchtower

反向代理及配置SSL证书

可以在nginx.conf中进行配置,但是因为nginx.conf最后有一行include /etc/nginx/conf.d/*.conf,所以我就直接在default.conf中进行修改了。
将购买的SSL证书上传到certs文件夹内。
这里直接贴上我的配置,带#号的都是注释。nginx配置参考这篇文章,日志配置参考这篇文章。

server {
    listen      80;
    server_name findmyfun.xyz;
    #return 301  https://$host$request_uri;
    return 301 https://$server_name$request_uri;
}
 
server {
    listen       443 ssl;
    server_name  findmyfun.xyz;  
    access_log /var/log/nginx/findmyfun_xyz_access.log main;
    error_log /var/log/nginx/findmyfun_xyz_error.log error;
    
    ssl_certificate     /etc/nginx/certs/findmyfun.xyz.crt; 
    ssl_certificate_key /etc/nginx/certs/findmyfun.xyz.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;

    gzip                on;
    gzip_min_length     1k;
    gzip_proxied        no-cache no-store private auth;
    gzip_http_version   1.0;
    gzip_comp_level     3;
    gzip_types          text/plain text/css application/x-javascript application/json application/xml application/javascript;
    gzip_disable        "MSIE [1-6]\.";
    gzip_vary           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;
    }
}
server {
    listen      80;
    server_name wiz.findmyfun.xyz;
    #return 301  https://$host$request_uri;
    return 301 https://$server_name$request_uri;
}
 
server {
    listen       443 ssl;
    server_name  wiz.findmyfun.xyz;  
    access_log /var/log/nginx/wiz_findmyfun_xyz_access.log main;
    error_log /var/log/nginx/wiz_findmyfun_xyz_error.log error;
    
    ssl_certificate     /etc/nginx/certs/wiz.findmyfun.xyz.crt; 
    ssl_certificate_key /etc/nginx/certs/wiz.findmyfun.xyz.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;
 
    gzip                on;
    gzip_min_length     1k;
    gzip_proxied        no-cache no-store private auth;
    gzip_http_version   1.0;
    gzip_comp_level     3;
    gzip_types          text/plain text/css application/x-javascript application/json application/xml application/javascript;
    gzip_disable        "MSIE [1-6]\.";
    gzip_vary           on;

    client_max_body_size 1024m;
    location / {
           proxy_pass http://wiz;
           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 nginx

在浏览器地址栏输入域名,测试是否成功。
成功访问到博客和笔记后,服务器安全组规则删除放行的Halo端口|wiz端口(8090|8070),Nginx默认端口80和443,根据域名会自动转发到微服务

结语

这次使用Docker部署Halo、Wiz及Nginx,通过Nginx容器对其他容器进行反向代理,就酱~~~ Enjoy it!!!

参考博客

1、Hexo还是Hugo?Typecho还是Wordpress?读完这篇或许你就有答案了!
2、使用 Docker 部署 Halo
3、Docker安装Halo、Nginx
4、HALO搭建博客之配置SSL
5、Docker容器互访三种方式

7

评论区