前言

最近想自己出一个Web题目了,🍆学长告诉我搭建环境要用到docker-compose,于是便想先把博客迁移到Docker里,顺便学一学docker的基本操作。

把博客迁移到Docker里就不需要宝塔面板了,所以重置成Ubuntu系统。重置后需要再次建立ssh连接。docker配置的过程参考使用docker搭建nginx挂载hexo博客

安装Docker

Docker常用命令

  • 搜索镜像
docker search IMAGENAME
  • 拉取镜像
docker pull IMAGENAME
  • 查看本地镜像
docker images
  • 删除本地镜像
docker rmi IMAGENAME

所以我们这里拉取nginx镜像

docker search nginx
docker pull nginx

配置docker-compose

cd /home
mkdir blog
cd blog
mkdir {www,log,conf}        #创建挂载目录
vim docker-compose.yml        #创建docker-compose文件

配置docker-compose文件

version: '3'
services:
    nginx:
        restart: 'always'
        image: 'nginx'
        container_name: 'blog'
        ports:
            - '80:80'        #将容器内80端口映射到外部IP的80端口
            - '443:443'
        volumes:
                - '/home/blog/www/public:/usr/share/nginx/html'
                    #这里的/home/blog/www/public是本机的目录,放置了博客的静态文件
                    #/usr/share/nginx/html是docker容器内的目录
                       #这里把本机目录挂载到了容器内
                - '/home/blog/log:/var/log/nginx/'        #对应的是日志文件
                - '/home/blog/conf:/etc/nginx/conf.d'        #对应的是配置文件

保存以后退出

配置nginx

cd conf
vim default.conf        #配置nginx

写入以下内容

server {
listen       80;
server_name  localhost;        #这里可以填入你的域名

#charset koi8-r;
#access_log  /var/log/nginx/log/host.access.log  main;
root   /usr/share/nginx/html;
location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
    ## 下面三行是添加的。
    autoindex on;
    autoindex_exact_size on;
    autoindex_localtime on;
}

#error_page  404              /404.html;

# redirect server error pages to the static page /50x.html
#
error_page   500 502 503 504  /50x.html;
location = /50x.html {
    root   /usr/share/nginx/html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
#    proxy_pass   http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
#    root           html;
#    fastcgi_pass   127.0.0.1:9000;
#    fastcgi_index  index.php;
#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
#    include        fastcgi_params;
#}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
#    deny  all;
#}
}

上传静态文件

在本地!!!

因为运行hexo g时会生成静态文件public,所以我们在本地生成静态文件以后将它上传到远程服务器。

scp -r /mnt/e/blog/public root@xxx.xxx.xxx.xxx:/home/blog/www
# /mnt/e/blog/public是你本地的public目录地址
# xxx.xxx.xxx.xxx表示你远程服务器的地址
# /home/blog/www表示上传到远程服务器的位置

运行docker-compose

在服务器端

cd /home/blog
docker-compose up -d        #-d指在后台运行

至此博客便成功迁移到Docker中了,访问你的远程服务器IP,就可以发现博客已经出现了。

实现自动化部署

光是这样还是不行的,因为hexo只能在本机生成静态文件,而要让它同步到博客上还需要每次都scp一下,这当然是不现实的,于是我想到之前用过一个钩子函数post-receive,每次hexo部署完成以后,自动启动钩子,进行更新同步的操作,那么我们开始吧!具体可以参考我的另一篇文章

创建钩子函数

/home/blog/www/目录下

mkdir repos
cd repos
git init --bare blog.git        #创建一个裸库
cd blog.git/hooks
vim post-receive            #创建钩子函数

写入以下内容

#!/bin/bash
DIR=/home/blog/www
rm -rf ${DIR}/public/            #首先删除所有静态文件
mkdir ${DIR}/public            #新建一个文件夹用于存放静态文件
git --work-tree=${DIR}/public --git-dir=/home/blog/www/repos/blog.git checkout -f
                    #将部署后产生的静态文件上传到博客根目录
docker-compose up -d            #docker重新部署
docker restart blog            #docker重启容器

之后修改hexo的站点配置文件

deploy:
    type: git
    repository:
        github: #这里是你的github.io页面地址
        server: <你的用户名>@服务器IP:/home/blog/www/repos/blog.git
    branch: master

至此这一次博客迁移宣告成功!每次写完文章只要

hexo cl
hexo g -d

即可!

后记

  • 感谢🍆!🍆是我偶像!

  • Googlenb!