Featured image of post 使用 Docker 定制化自己博客基础环境

使用 Docker 定制化自己博客基础环境

- 无非就是在造重复的轮子啦 OvO

前言

本文主要介绍为什么选用 docker 和 docker-compose 作为搭建本站的基础环境,以及具体的搭建方法,给建站初学者提供一些思路。

起因

最初是为了解决环境的问题。从 5 年前野路子学来的 lnmp.org 一键搭建(目前似乎已经被收购?),到宝塔面板一键部署环境,似乎(不是)都是一个很好的选择。毕竟都是人家已经写好的嘛 = =,可供自己定制化发挥的空间太小。你所使用的功能,都是他们已经高度 集成化、模块化、一键化、懒人化 的。况且他们的产品定位大多是服务于政企网站,实现低运维的愿景。这与个人博客 技术选型激进性、高可折腾性 的目标背道而驰 XD。So,自己动手,丰衣足食!

实现目标

用于快速构建常用开发语言所需要的运行时或开发环境(基于服务),并且能 统一管理 各服务的状态,轻量化 配置服务,简化 数据备份流程,方便 本地调试及 跨平台 迁移、部署。

已实现的服务:

  • Nginx / Caddy:Web 服务器
  • PHP(Only FPM):世界上最好的语言(确信)
  • MySQL:数据库
  • Redis:缓存
  • Gitea:代码托管
  • Portainer:Docker 管理工具
  • phpMyAdmin:数据库管理工具

整体结构大概是这样:

整体架构

工具介绍及其安装

为什么使用 Docker 及 Docker Compose?在开始之前,先介绍一下这两个概念。

什么是 Docker?

容器是在主机上运行的沙盒进程,与该主机上运行的所有其他进程隔离。这种隔离利用了内核命名空间(namespace)和 cgroup,这些功能在 Linux 中已经存在很长时间了。Docker 使这些功能变得平易近人且易于使用。总而言之,容器:

  • 是镜像的可运行实例。您可以使用 Docker API 或 CLI 创建、启动、停止、移动或删除容器。
  • 可以在本地机、虚拟机上运行,也可以部署到云端。
  • 是可移植的(并且可以在任何操作系统上运行)。
  • 与其他容器隔离,并运行自己的软件、二进制文件、配置等。

如果您熟悉 chroot,那么可以将容器视为 chroot 的扩展版本。文件系统来自镜像。然而,容器增加了使用 chroot 时不可用的额外隔离。

—— 来自 Docker 官方文档

什么是 Docker Compose?

Docker Compose 是一个帮助您定义和共享多容器应用程序的工具。使用 Compose,您可以创建一个 YAML 文件来定义服务,并且使用单个命令就可以启动或拆除所有内容。

使用 Compose 的一大优点是您可以在文件中定义应用程序堆栈,将其保存在项目存储库的根目录中(现在是版本控制的),并轻松地让其他人为您的项目做出贡献。有人只需要克隆您的存储库并使用 Compose 启动应用程序。事实上,您现在可能会在 GitHub / GitLab 上看到不少项目正是这样做的。

—— 来自 Docker 官方文档

Docker 的安装

安装的详细说明可参考 官方文档。

快速安装:安装前确保已经卸载了旧版本的 Docker,且假定操作系统为 Ubuntu / Debian / CentOS。

Tips:鉴于国内网络环境,如果遇到下载缓慢的问题,可以使用国内镜像源安装 Docker,例如 北京外国语大学的镜像源。

1
2
3
4
5
6
# 可选,设置镜像源
export DOWNLOAD_URL="https://mirrors.bfsu.edu.cn/docker-ce"
# 如您使用 curl
curl -fsSL https://get.docker.com/ | sudo -E sh
# 如您使用 wget
wget -O- https://get.docker.com/ | sudo -E sh

Docker Compose 的安装

可参考 Docker Compose 安装 - 官方文档。

用上面的 get.docker.com 脚本安装 Docker 时,会一并装好 Compose V2 插件(docker-compose-plugin),用 docker compose(中间是空格)调用,一般不需要再单独安装:

1
docker compose version

如果你更习惯旧的独立版 docker-compose 命令,也可以用包管理器安装:

1
2
3
4
# Ubuntu/Debian
sudo apt install docker-compose
# CentOS
sudo yum install docker-compose

注意:独立版 docker-compose(Compose V1)已经停止维护,新环境推荐直接用 docker compose。下文的 docker-compose xxx 命令都可以等价写成 docker compose xxx。

使用 docker-compose 构建基础环境

下面开始介绍如何使用 docker-compose 构建基础环境。

代码拉取

1
git clone https://git.cloudorz.com/mt/server.git --depth=1

服务配置

这里需要修改一些服务的配置文件,以 Caddy 为例。Caddy 的配置文件是 Caddyfile,一个把站点交给 PHP-FPM 处理的最小示例如下(仅作示意,文件位置、站点目录以仓库里的实际配置为准):

1
2
3
4
5
example.com {
    root * /var/www/html
    php_fastcgi php-fpm-82:9000
    file_server
}
  • example.com 换成你自己的域名,Caddy 会自动申请和续期 HTTPS 证书;
  • php_fastcgi 后面写的是 PHP-FPM 容器的服务名和端口。同一个 Compose 项目里的容器默认在同一个网络中,可以直接用服务名互相访问,同理 PHP 连接 MySQL 时主机名填 mysql 即可;
  • Caddy 把脚本的绝对路径传给 PHP-FPM,所以两个容器要挂载同一个宿主机目录,并且容器内的路径保持一致(这里都是 /var/www/html)。

启动服务

按需启动服务,这里以启动 Caddy + PHP + MySQL + phpMyAdmin 为例:

1
docker-compose up -d caddy php-fpm-82 mysql phpmyadmin

随后查看服务状态:

1
docker-compose ps

各服务的 STATUS 显示为 Up 就说明启动成功了:

启动与查看状态

常用命令

1
2
3
4
5
6
# 查看某个服务的日志
docker-compose logs -f caddy
# 修改配置后重启某个服务
docker-compose restart caddy
# 停止并删除所有容器(数据卷 / 挂载目录里的数据会保留)
docker-compose down

参考

由 Hugo 强力驱动