hexo博客docker部署阿里云的一点心得

1初衷:

自己的博客证书一直有问题,不管是宝塔里申请的Let‘s encrypt,还是阿里云的免费证书,于是想到部署上nginx配置,再用docker,多网站方便管理,就当学习了。

2思路:

  1. push代码到git触发action动作,docker build镜像到docker hub;
  2. 配置好nginx,多域名分发;
  3. 在阿里云上pull镜像,然后run。

3使用:

hexo、git actions、docker/docker-compose、docker hub、nginx、阿里云

4过程:

1. docker部分:

  1. 代码根目录写好Dockerfile;
# node环境镜像

FROM node:latest AS build-env

# 创建hexo-blog文件夹且设置成工作文件夹

RUN mkdir -p /usr/src/hexo-blog

WORKDIR /usr/src/hexo-blog

# 复制当前文件夹下面的所有文件到hexo-blog中

COPY . .

# 安装 hexo-cli

RUN npm --registry=https://registry.npm.taobao.org install hexo-cli -g && npm install

# 生成静态文件

RUN hexo clean && hexo g


# 配置nginx

FROM nginx:latest

ENV TZ=Asia/Shanghai

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

WORKDIR /usr/share/nginx/html

# 把上一部生成的HTML文件复制到Nginx中

COPY --from=build-env /usr/src/hexo-blog/public /usr/share/nginx/html

EXPOSE 80
  1. 注册一个docker hub账号;

2. git action 部分:

  1. 在github项目设置里配置secret,添加变量DOCKER_USERNAME、DOCKER_PASSWORD,分别是docker hub的账号密码;
  2. 在新建一个node的action,提交动作后自动执行action,此时镜像已经被打包到docker hub中,可上前查看,以后push代码自动触发action。
# deploy.yml

name: deploy blog to dockerhub

on:

push:

branches:

- hexo

jobs:

build:

runs-on: ubuntu-latest

steps:

# 切换分支

- name: Checkout # 将仓库内master分支的内容下载到工作目录

uses: actions/checkout@v2 # 脚本来自 https://github.com/actions/checkout

# 发布

- name: docker build

run: |

echo ${{secrets.DOCKER_PASSWORD}} | docker login -u ${{secrets.DOCKER_USERNAME}} --password-stdin

docker build -t maya1900/may-blog:latest .

docker push maya1900/may-blog:latest

3. 阿里云部分:

  1. 安装docker、docker-compose、nginx
  2. 写好nginx配置文件,一般在usr/local/nginx/conf/nginx.conf,(安装了宝塔面板的,配置位置变了/www/server/nginx/conf/nginx.conf,或者直接在软件商店里配置):

#user nobody;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;


events {
worker_connections 1024;
}

http {
server {
listen 443 ssl;
server_name maya1900.top www.maya1900.top;
root /usr/share/nginx/html;
index index.html index.htm;
ssl_certificate /usr/local/nginx/conf/cert/pem.pem;
ssl_certificate_key /usr/local/nginx/conf/cert/key.key;

default_type application/octet-stream;
gzip on;
gzip_min_length 5k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 3;
gzip_types text/plain application/json application/javascript text/css application/xml text/javascript image/jpeg image/gif image/png;
gzip_vary on;
location / {
proxy_pass http://127.0.0.1:8082;
}
}
server {
listen 80;
server_name maya1900.top www.maya1900.top;
root /usr/share/nginx/html;
index index.html index.htm;
rewrite ^(.*)$ https://$host$1; #将所有HTTP请求通过rewrite指令重定向到HTTPS。
default_type application/octet-stream;
location / {
proxy_pass http://127.0.0.1:8082;
}
}
server {
listen 443 ssl;
server_name todo.maya1900.top;
root /usr/share/nginx/html;
index index.html index.htm;
ssl_certificate /usr/local/nginx/conf/cert/pem.pem;
ssl_certificate_key /usr/local/nginx/conf/cert/key.key;

default_type application/octet-stream;
gzip on;
gzip_min_length 5k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 3;
gzip_types text/plain application/json application/javascript text/css application/xml text/javascript image/jpeg image/gif image/png;
gzip_vary on;
location / {
proxy_pass http://127.0.0.1:8083;
}
}
server {
listen 80;
server_name todo.maya1900.top;
root /usr/share/nginx/html;
index index.html index.htm;
# rewrite ^(.*)$ https://$host$1; #将所有HTTP请求通过rewrite指令重定向到HTTPS。
default_type application/octet-stream;
location / {
proxy_pass http://127.0.0.1:8083;
}
}
}
  1. 在服务器上随便找个地方新建docker-compose.yml,写好文件:
version: '3.7'
services:
blog:
container_name: may-blog
image: maya1900/may-blog:latest
ports:
- "8082:80"
restart: on-failure
todo:
container_name: todo
image: maya1900/todo:latest
ports:
- "8083:80"
restart: on-failure

  1. 在当前目录打开终端:
# 拉取镜像
docker-compose pull
# 运行镜像
docker-compose up -d
# 停止删除容器和镜像
docker-compose down

5. 证书问题

在nginx配置文件443那里配置好证书,同时在阿里云的ssl免费证书那再部署好,等待几分钟访问就没问题了

5遇见的坑:

  1. push时docker build总是失败? 路径不对
  2. docker run成功后访问没有站点了?
    1. 排查镜像是否正确
    2. nginx配置是否正确
    3. 先用服务器ip地址访问是否成功,看域名解析是否正确
  3. 能访问了证书还是不安全?
    1. 看是否在阿里云证书管理服务那进行了部署
  4. "客户端和服务器不支持常用的 SSL 协议版本或密码套件"?
    1. 配置玩证书后出现的,过了一会好了...可能是需要个解析过程
  5. 修改完nginx配置后不生效?
    1. 需要重启nginx服务

6参考:

感谢各位前辈们的帮助!

写给前端的Docker实战教程 - 掘金 (juejin.cn) 手把手教你用Docker搭建Hexo博客 - 腾讯云开发者社区-腾讯云 (tencent.com) 利用 GitHub Action 自动发布 Docker-阿里云开发者社区 (aliyun.com) 阿里云安装nginx,实现域名访问|服务器|proxy|ip_网易订阅 (163.com)

本文由 mdnice 多平台发布