Docker

Drupal 8:在 Docker 环境里运行

今天的任务是在本地创建一个可以运行在 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

用 Docker 搭建本地开发环境

使用 Docker 可以在本地为网站搭建一个开发环境,在本地开发时,通常我们会把网站的代码共享到容器里,这样可以直接编辑网站代码,然后立即看到运行结果。在生产环境下,我们需要把网站的代码 Build 到镜像里。在本地使用 Docker,需要用到 Docker for Windows 或 Docker for Mac 。它提供了很好的本地体验,但最大的问题是共享数据卷的性能非常差。注意这并不是 Docker 本身的问题。你在生产环境上用的 Docker 的共享数据卷不会有任何性能问题。

下面先介绍下原因,然后介绍一下我的解决方案。Docker for Windows 以下简称为 DFW,Docker for Mac 以下简称为 DFM。

原因

首先要知道 Docker 引擎只能在 Linux 核心的系统上运行,Windows 与 macOS 系统上是不能直接运行 Docker 引擎的。最开始的解决方案是在本地创建虚拟机,也就是 Docker Machine 提供的功能。创建一台 Linux 系统的虚拟机,并且上面已经安装好了 Docker 。 后来 Docker 公司为了让 Docker 在我们平时工作的电脑上有很好的本地化体验,推出了我们现在用的 Docker for Windows 与 Docker for Mac。

Discourse + Docker + 阿里云的痛苦经历

Discourse 论坛我遇到两次资源占满的情况,第一次通过升级解决了问题,过年以后又遇到了占满 CPU 与内存的情况。即使没人访问一样会占满服务器的所有资源。 这次原因可能是之前服务器磁盘满了,Discourse 会在后台循环处理一些任务,比如给用户发送邮件,如果任务无法执行,会不断的重试。这应该就是导致占满资源的原因。在下面这个页面上你会看到重试的任务。访问地址:

sidekiq/retries

导致任务不断重试是因为我的邮件配置有问题。可以使用阿里云的邮件推送服务,宁皓网有相关的课程。

我折腾了一圈,升级 Discourse,升级 Docker,更新 Docker 配置,更换服务器,恢复备份。但实际上,只需要几步就能解决:

cd /var/discourse
./launcher enter app
redis-cli flushall

折腾过程

我用了一台 1 核 2G 的阿里云 ECS 服务器。遇到问题以后,重新启动应用可以维持一段时间,越往后就越严重。最开始想到的是升级 Discourse。

在 Docker 本地开发环境上极快地运行 Drupal

这个方法只在 macOS 上测试过,抱歉啊 :)

在本地,我们可以使用 Docker for Windows 或者 Docker for Mac 作为应用的开发环境。不过如果你打算使用 Docker 的数据卷存储应用的代码,特别是应用的文件比较多,比如 Drupal ,在运行它的时候你会觉得特别慢。这是因为 Docker for Windows 与 Docker for Mac 都使用了本地化的虚拟技术,这是为了给我们提供一个更顺流的体验,但是数据卷的性能是个暂时没能解决的问题。我找到了一个解决方法,就是使用 Unison 同步文件,暂时只在 macOS 上测试过。

安装 Unison 与必备

在 macOS 上安装了 Homebrew 以后,可以很容易用它安装 Unison 。另外你还需要让 Unison 可以监视文件的变化,当有变化时就去执行同步的动作,这些再安装一下 unison-fsmonitor 。

# 安装 unison
brew install unison

# 安装 unox 的依赖
pip install MacFSEvents

# unox 是在 macOS 上用的 unison-fsmonitor 脚本
curl -o /usr/local/bin/unison-fsmonitor -L https://raw.githubusercontent.com/hnsl/unox/master/unox.py
chmod +x /usr/local/bin/unison-fsmonitor

Docker Swarm:创建服务器集群

Docker Swarm 是创建服务器集群用的工具。把一堆服务器绑到一块儿用,让它们看起来像是一台服务器,通过统一的接口在这些服务器上运行应用。

集群里的服务器之间相互知道彼此,它们也知道哪些服务器上运行了什么样的服务,如果访问的服务在服务器上不存在,它会把访问转移到集群里的正确的服务器上去处理。一个服务可以用多个容器来支持,这些容器运行在集群里的不同的服务器上,请求可以均衡的分布给这些容器。当有服务器挂掉以后,在它上面运行的服务会被转移到其它的服务器上运行。

Docker Swarm 只需要几行命令就可以为应用创建一个强大的集群,为你的应用提供高可用的服务。宁皓网的 《 Docker:集群 》介绍了使用 Docker Swarm 创建集群服务器的方法。

模拟集群环境

如果你已经有了几台服务器,安装 Docker 以后就可以去创建一个服务器集群了,如果你想在本地测试 Docker Swarm 的功能,可以模拟一个集群环境,也就是在本地创建几台 Linux 系统的虚拟机,安装 Docker ,配置集群。下面介绍使用 Vagrant 创建虚拟机的方法。

Docker Compose:创建本地开发 PHP 应用的环境

Docker Compose 可以让我们用一个文件来描述应用需要的环境,在上面定义应用需要的各种服务,比如 web,数据库,脚本解释,缓存等等,我们也可以配置服务需要的网络与数据卷。这篇文章会创建一个运行 PHP 应用的环境,代码可以在 github 上找到,参考宁皓网课程《Docker:容器化应用》。

定义了下面这些服务:

  • db:使用 mariadb 作为应用的数据库
  • php:解释 php 脚本,使用 php-fpm
  • web:使用 NGINX 作为应用的 web 服务器
  • console:常用工具
  • redis:缓存
  • phpmyadmin:管理数据库的 web 界面

准备

在本地安装 Docker for Mac 或 Docker for Windows ,然后启动 docker ,再打开你喜爱的文本编辑器与命令行工具。为项目创建一个目录,在根目录下创建一个 docker-compose.yml 文件。

Docker:应用从开发到生产的正确方法

扯淡的文章,主要目的是说服你放弃现有的开发环境,比如这些:WAMP,MAMP,XAMPP,Acquia Dev Desktop ... 无论您是一个人,还是一个团队,考虑一下在开发与生产环境中使用 Docker 。

从前

美好的回忆,但那已经是过去。多年前,打算学 PHP 的时候,搜遍互联网寻找搭建运行 PHP 网站的方法,到七八个网站下载环境需要的不同的部分,安装以后还要考虑怎么配置,把它们拼到一块儿工作,当时对我来说是件很难的事情。后来我发现了 WAMP ,只需要到一个地方下载个东西,然后安装一下就可以拥有一个完整的开发环境,感觉很美好。之后很长一段时间我都是用它在本地设计网站,后来我换了 macOS ,所以又用了一阵子 MAMP 。

历史

选择 WAMP 这样的工具,跟我当时的情况有关。设计的网站主要是企业网站,这些网站做好以后很少修改,网站的运行环境一般是虚拟主机,一般只提供使用 FTP 传输文件的权限。使用 WAMP,也限制了整个开发流程,一般像这样:在本地做好网站,感觉差不多了以后就停止继续设计。然后打包网站文件,导出在本地的数据库。把网站文件包扔到虚拟主机上,在线解压,导入数据库。修改网站的配置文件,让网站可以正常运行。从此网站跟本地之间几乎就没有关系了,出现问题直接在线修改。

Docker:把应用放到容器里

在现实生活中,容器就是用来装东西的东西。把你的应用放到容器里,容器里的环境你可以自由定制,你可以在里面安装配置应用需要的任何东西,然后你可以把这个装载着应用的容器拿到任何地方去运行,这些地方不需要知道容器里面到底有什么,它只需要知道怎么样去运行这个容器就行了。Docker 提供了一系列的工具,让我们把应用放到容器里变得更简单。

镜像与容器

镜像与容器,image and container。基于镜像可以去创建容器,镜像有点像是容器的模板,比如你用 centos 镜像创建一个容器,这个容器里的环境就相当于是一个 centos 系统。镜像里可能预装了一些东西,比如 nginx 镜像包含了 nginx 这个 web 服务器,mongodb 镜像里面已经安装好了 mongodb 数据库。这些镜像会基于某些系统类型的镜像去创建,比如 debian,alpine 等等。

我们自己也可以制作镜像,在一个 Dockerfile 文件里描述你的镜像,一般要基于某个系统类型的镜像,然后描述一下安装什么样的软件,做什么配置,公布哪些端口等等,执行 docker build 命令可以生成这个镜像。你可以把自己制作的镜像发布到公开的或者私有的镜像仓库里。

统计

15260
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点