前言
本文主要介绍为什么选用 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,例如 北京外国语大学的镜像源。
| |
Docker Compose 的安装
用上面的 get.docker.com 脚本安装 Docker 时,会一并装好 Compose V2 插件(docker-compose-plugin),用 docker compose(中间是空格)调用,一般不需要再单独安装:
| |
如果你更习惯旧的独立版 docker-compose 命令,也可以用包管理器安装:
| |
注意:独立版
docker-compose(Compose V1)已经停止维护,新环境推荐直接用docker compose。下文的docker-compose xxx命令都可以等价写成docker compose xxx。
使用 docker-compose 构建基础环境
下面开始介绍如何使用 docker-compose 构建基础环境。
代码拉取
| |
服务配置
这里需要修改一些服务的配置文件,以 Caddy 为例。Caddy 的配置文件是 Caddyfile,一个把站点交给 PHP-FPM 处理的最小示例如下(仅作示意,文件位置、站点目录以仓库里的实际配置为准):
| |
example.com换成你自己的域名,Caddy 会自动申请和续期 HTTPS 证书;php_fastcgi后面写的是 PHP-FPM 容器的服务名和端口。同一个 Compose 项目里的容器默认在同一个网络中,可以直接用服务名互相访问,同理 PHP 连接 MySQL 时主机名填mysql即可;- Caddy 把脚本的绝对路径传给 PHP-FPM,所以两个容器要挂载同一个宿主机目录,并且容器内的路径保持一致(这里都是
/var/www/html)。
启动服务
按需启动服务,这里以启动 Caddy + PHP + MySQL + phpMyAdmin 为例:
| |
随后查看服务状态:
| |
各服务的 STATUS 显示为 Up 就说明启动成功了:
常用命令
| |