使用Docker搭建Nginx环境挂载Hexo博客

使用Docker搭建Nginx环境挂载Hexo博客

介绍

原先我的博客是挂载在github pages上面的,但是因为github pages的服务器在国外,国内访问速度就会有点感人,于是就想把我的博客挂载在自己阿里云的服务器上面。

环境

  1. 一台有独立ip的服务器(centos 7)
  2. 在本地搭建好了hexo框架

实现

因为我的博客是hexo写的,众所周知这是一个快速生成静态博客的框架,既然是静态网页,web服务器方面当然是选择nginx了,为什么选择nginx不选择apache呢,因为nginx轻量级,同样起web服务,比apache 占用更少的内存及资源、抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能、高度模块化的设计,编写模块相对简单、社区活跃。等等的优点。
既然选择了nginx,那选择如何搭建了,普通安装或者编译nginx,多多少少会有各种残留,这对一个系统洁癖的人来说,却是非常痛苦的,所以我选择了使用docker安装nginx。

安装docker

1
➜ curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

然后进入阿里云docker库首页https://dev.aliyun.com/
登入
然后进入管理中心
点击加速器,复制链接

1
2
3
4
5
6
7
8
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://dev.aliyun.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

安装docker-compose

下载shell脚本

1
➜ sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

修改权限

1
➜ sudo chmod +x /usr/local/bin/docker-compose

将当前用户加入root组

1
2
3
sudo su
gpasswd -a heroin root
su heroin

测试

1
2
➜ docker-compose --version
docker-compose version 1.22.0, build 1719ceb

通过docker-compose管理生成容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
➜ cd /home/   
➜ mkdir blog && cd blog   //创建一个blog的目录
➜ vi docker-compose.yml   //创建一个名叫docker-compose.yml的文件
#写入
version: '3'
services:
nginx:
restart: 'always'
image: 'nginx'
ports:
- '80:80'
- '443:443'
volumes:
- '/home/blog/www/public:/usr/share/nginx/html' #这里的/home/blog/www/public是主机的目录,意思是把这个目录挂载到容器的/usr/share/nginx/html目录中,该目录防止了网页的静态文件
- '/home/blog/log:/var/log/nginx/' #同理,log文件夹里是nginx的日志文件
- '/home/blog/conf:/etc/nginx/conf.d'  #同理,配置文件
#:wq保存退出

注意删除上边的汉字注释及前部的空格,有些服务器默认不对中文支持

创建挂载目录
在/home/blog/下创建/www、/log、/conf三个目录

1
2
3
➜ mkdir {www,log,conf}
➜ cd conf
➜ vi default.conf

添加以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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 0.0.0.1:80
#
location ~ \.php$ {
proxy_pass http://0.0.0.1;
}

# pass the PHP scripts to FastCGI server listening on 0.0.0.1:9000
#
location ~ \.php$ {
root html;
fastcgi_pass 0.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;
}
}

获取nginx镜像

  1. 拉取镜像:

    docker search nginx

pull第一个nginx官方的镜像

1
docker pull nginx

查看获取到的镜像

1
2
3
➜ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 06144b287844 2 weeks ago 109MB

可以看到镜像已经pull下来了

上传静态文件

在本地hexo的博客目录下
运行hexo g生成静态文件
他会在该目录下生成一个public的一个文件,里面是关于你博客的所有静态文件,然后这个文件scp到服务器的/home/blog/www/下

1
2
3
4
➜ scp /home/kevin/blog/public root@119.23.241.xxxx:/home/blog/www
# /home/kevin/blog/public是你本地的public目录地址
# 119.23.24.xxxx表示你远程服务器的地址
# /home/blog/www/public表示上传到远程服务器的位置

然后进入服务器端

1
2
3
➜ cd /home/blog
➜ docker-compose up -d
# -d表示后台运行的意思

然后在浏览器输入你服务器的ip
发现博客已经挂在成功了,
因为我的服务器是阿里云的,所以还有加一步,去阿里的控制台配置防火墙入口规则,添加80端口和443端口。

解决 error creating overlay mount to /var/lib/docker/overlay2

重新开启服务器运行docker-compose up -d指令时可能出现下面的错误:

1
2
/usr/bin/docker-current: Error response from daemon: error creating overlay mount to /var/lib/docker/overlay2/65f3c109fb903539820f84856d2725af784f2f03f95b1f0214e34184e4d61ff7-init/merged: invalid argument.
See '/usr/bin/docker-current run --help'.

一个可行的方案如下(改变storage driver类型, 禁用selinux):

  • 停止docker服务
1
systemctl stop docker
  • 清理镜像
1
rm -rf /var/lib/docker
  • 修改存储类型
1
vi /etc/sysconfig/docker-storage

把空的DOCKER_STORAGE_OPTIONS参数改为overlay:

1
DOCKER_STORAGE_OPTIONS="--storage-driver overlay"
  • 禁用selinux
1
vi /etc/sysconfig/docker

去掉option的--selinux-enabled

  • 重新启动docker
1
systemctl start docker

应该就能解决问题了

方案抄自 Ysssssssssssssss的博客 和 redis的讨论: error creating overlay mount to …/merged: invalid argument., 基本可以确定是启用selinux导致的。

解决-bash: docker-compose: command not found

利用pip(python)方式进行安装

虽然很简单,还是有URL确认,x权限设定等需要做,如果使用pip进行安装虽然看似绕远,实质上也是绕远,安装来一看吧。CentOS上需要先行安装yum的一个额外的包,这个包里面才有python-pip,缺省的没有。

1
2
3
4
yum -y install epel-release
yum -y install python-pip
pip install docker-compose
docker-compose version