今天的任务是在本地创建一个可以运行在 Docker 上的 Drupal 8 项目。运行环境我已经做好了,用的就是 nest ,这个项目 Compose 了一个一般的 PHP 网站的运行环境,包含 NGINX,PHP,MariaDB,PHPMyAdmin 这些服务。Drupal 8 应该现在推荐用 PHP 的包管理工具 Composer 创建,安装 Drupal 可以用 Drupal Console 或 Drush。现在先介绍一下过程。
运行环境
先把我做的 nest 克隆到本地,放在 ninghao 这个目录的下面。如果你想更折腾一下,可以把 nest 仓库 fork 到自己的 github 帐号下面,然后克隆自己的 nest 远程,这样你可以修改项目,并且如果你觉得自己的修改对别人有帮助,可以对我的 nest 提交 pull request 。
下面我们直接克隆 ninghao 的 nest:
git clone https://github.com/ninghao/nest.git ninghao
修改:
cd ninghao cp example.env .env
你可以编辑 docker-compose-dev.yml 文件里的东西,比如 web 服务的端口号,db 服务的一些环境变量,像 root 用户的密码,创建的数据库的名字(app),用户(app),密码(123123)等等。
docker-sync.yml 文件里的内容也需要编辑一下,在 sync 的下面是创建的同步,默认有个 ninghao-unison-sync,这个名字你可能要改一下,因为每个项目都需要创建不同名字的同步。改了这个名字以后,把这个名字放在 docker-compose-dev.yml 里的 volumes 的下面,默认这里也有个 ninghao-unison-sync,把这个名字改成你在 docker-sync.yml 里修改之后的名字。
启动:
docker-sync-stack start
测试:
一切正常,你可以打开浏览器,访问 http://localhost:8080,在页面上会出现一个 “hello ~” 。
安装 Drupal 8
在环境里有个 console 服务,里面已经安装好了 composer,我们得用这个工具去创建 Drupal 8 项目。先进入到 console 服务,再用 composer 去创建一个 Drupal 8 项目,这个过程可能要花一段时间,这取决于你的网络。
docker-compose exec console bash cd /mnt/app/www
用 Composer 创建 Drupal 8 项目:
composer create-project drupal-composer/drupal-project:8.x-dev ninghao --stability dev --no-interaction
完成以后就可以使用 Drupal Console 去安装 Drupal 8 了:
cd ninghao drupal site:install --langcode=zh-hans --db-type=mysql --db-host=db --db-name=app --db-user=app --db-pass=123123 --db-prefix=ninghao_ --site-name=ninghao --site-mail=service@ninghao.net --account-name=wanghao --account-mail=wanghao@ninghao.net --account-pass=123123
上面用的是 Drupal Console 里的 site:install 命令,去安装 Drupal。命令里有很多选项可以设置在安装的时候需要填写的一些信息,比如网站的语言,使用的数据库,管理员的名字,邮箱等等。这些选项的值你需要根据自己的需求去调整。
- --langcode:网站的语言
- --db-type:数据库的类型
- --db-host:数据库的主机
- --db-name:数据库的名字
- --db-user:数据库的用户名
- --db-pass:数据库的用户对应的密码
- --db-prefix:数据库的前缀
- --site-name:网站名字
- --site-mail:网站邮件
- --account-name:管理员的名字
- --account-mail:管理员的邮件
- --account-pass:管理员的登录密码
安装完成以后,你得再修改一下 nginx 的配置,在 services/nginx/config/default.conf,修改一下 root 指令的值,设置成:
root /mnt/app/www/ninghao/web
ninghao 是存储 Drupal 项目的地方,你要根据自己的实际情况去修改这个目录的名字,web 是个子目录,我们用的 Composer 模板把 Drupal 本身与 Drupal 依赖的东西分离开了,Drupal 本身在 web 这个目录下存储,所以你可以把这个目录作为网站的根目录。编辑好以后,重启 web 服务:
docker-compose restart web
完成以后你就可以打开浏览器,访问 http://localhost:8080,应该会看到 Drupal 的初始界面,可以使用你在安装时指定的管理员登录到网站。
升级 Drupal 核心
composer update drupal/core --with-dependencies
要小心,这个命令可能会覆盖掉我们自己修改的一些东西,比如我会修改:
sites/development.services.yml
里面的配置,升级了核心以后,使用就不见了。所以我想应该创建一个不同的 services.yml 文件,然后在本地开发配置里指定去使用这个新的 yml 文件。
Composer
用 Composer 创建 Drupal 项目有两个模板可以使用,一个是 Drupal 官方提供的:drupal/drupal,还有一个是我们上面用的:drupal-composer/drupal-project。第二个 Composer 模板里面会把 Drupal 单独放在一个子目录(web)里,并且集成了 Drush 与 Drupal Console,所以就不需要单独去安装它们了。
权限问题
有个权限问题,就是 Drupal 的 settings.php ,这个文件对所有人只有只读权限,所以 docker-sync 在同步文件的时候,会遇到权限问题。我没找到好的办法解决,只能在 console 服务里,手工去为这个文件添加写入权限。还要设置一下它的有一级目录,default 目录的权限,也给它添加一个写入权限。
Drupal Docker
评论
到现在都没弄明白Docker是个什么东西?
7 年 5 个月 以前
我就直接跟你说 Docker 对你的益处算了……就是,在开发工作中,Docker 可以使你在开发阶段、测试阶段、上线阶段后,软件的运行环境是一模一样的,也就是说,你不需要再为开发环境和生成环境的不一样而导致的软件不可运行的问题付出巨大的 debug 的时间成本。而且,它可以用代码的方式固化你的软件运行环境,使得运行环境也是可以通过版本控制进行追踪……这也降低了你遇到问题 debug 的时间成本。over
7 年 5 个月 以前
接着上一条。第二个益处是,如果你的团队有多人进行协作,也会因为团队一起使用了 Docker,使得所有人的软件运行环境都是一样的,就避免了某些代码在某个同事的开发环境能运行,在你的开发环境不能运行的尴尬情况,也减少了你们的沟通成本和 debug 成本。另外,对于 Windows 用户,可能这是一个最简单的使用 Linux 进行开发的方式了。最后,其实是最重要的一点,就是 Docker 跟 Linux 内核是深度结合的,而且轻量,它可以几乎实时地通过多开运行实例来快速应对软件上线后,突然的流量大爆发,也就是说,Docker 可以让你们团结平稳地应对访问量暴增的情况,因为 Docker 实例拥有极强的水平扩展的能力。
7 年 5 个月 以前
如果 在服务器环境 是不是就不用 docker-sync-stack
7 年 4 个月 以前
一定还要装 映像 docker pull eugenmayer/unison
7 年 4 个月 以前
测试一下
7 年 3 个月 以前
浩哥,有个关于drupal的问题,请教你下。就是多人在本地开发drupal,然后怎么去合并每个人的数据库。就是多人开发数据库的迁移问题。多谢了。
7 年 2 个月 以前
您可以了解一下 Drupal 8 的配置管理,还有 Features 模块。
7 年 2 个月 以前
好的,太感谢你了。
7 年 2 个月 以前
如果放在服务器里面 如何配置 docker-compose
7 年 2 个月 以前
嗯。我应该再写个从开发到生产的课程。
7 年 2 个月 以前