用 Docker 来部署 PHP + MySQL 的站点

我有一个关于户外方面的网站,最近两年很少打理了,但是又不想关闭。而迁移时会遇到各种各样的问题,比如操作系统和软件版本问题,于是就花了点时间把网站完全的放到 Docker 里。

请查阅 Podman + Kubernetes Pod 这种更好的部署方式: https://youya.org/2019/08/31/podman-is-a-good-docker-alternative/

网站用的是 PHP Laravel 4.2 框架,数据库用的是 MariaDB/MySQL,Web 容器用的是 PHP FPM + Nginx。现在要做 DNMP(Docker+Nginx+MariaDB+PHP) 化。

调整网站源码结构

将 Nginx 配置文件和 MariaDB 导出的备份文件都放在源码仓库里。最终源码仓库里会有三个目录,分别是:

  • website 放置网站源码
  • nginx 放置 Nginx 配置文件
  • sql 放置网站数据库备份

启动 Nginx 容器

docker run -d -p 80:80 --hostname=nginx-container \
    --name=nginx -v /path/to/git-repo/website:/var/www/html \
    -v /path/to/git-repo/nginx:/etc/nginx/conf.d siji/nginx:1.12.2

之所以给容器自定义一个主机名(--hostname=nginx-container)是因为 Laravel 4.2 是通过主机名来寻找配置文件的。

启动 MariaDB 容器

docker run -d --name=mariadb --net=container:nginx \
    -v /var/lib/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mariadb:10.3

--net=container:nginx意思是让 MariaDB 容器和 Nginx 容器共享同一个网络,这样两个容器之间就可能直接通过本地回环地址(127.0.0.1)通信了,不需要暴露 MariaDB 的端口了。

然后将备份的数据库导入 MariaDB:

docker exec -i mariadb mysql -uroot -p123456 < /path/to/git-repo/sql/db-user.sql
docker exec -i mariadb mysql -uroot -p123456 -D dbname < /path/to/git-repo/sql/website-data.sql

其中db-user.sql里面创建数据库和用户的命令,website-data.sql是网站数据备份。

启动 PHP FPM 容器

docker run -d --name=php-fpm --net=container:nginx \
    -v /path/to/git-repo/website:/var/www/html siji/php:7-fpm

检查状态

docker ps
netstat -tnlp

以上命令会看到这三个容器正在运行,并且只监听了80端口,而 MariaDB 和 PHP FPM 的端口都在容器里面并没有暴露出来。

现在就可以在浏览器里进行访问了。