使用 docker 部署 drupal 8

原文标题:使用 docker 部署 drupal 8 的6个理由

原文链接:https://blog.wodby.com/6-reasons-to-deploy-drupal-8-with-docker-how-to-guide-b2f073e61672


4.jpeg

查看开源计划Docker4Drupal.org可以帮助你部署基于docker的本地drupal 8开发环境。

在这篇文章里面,我首先会阐述为什么应该使用docker来部署drupal8项目,并且会使用docker hub的官方镜像来演示如何使用docker部署drupal8.

什么是Docker

docker允许你将你的应用和它依赖的环境打包到一个叫做容器的标准单元内。

你的应用,比如说druapl网站,这个应用依赖于web服务器(nginx/apache)和数据库(mysql/mariadb/postgresql)。

通常来说,如果你想要基于现有的网站重新部署一个新的网站副本,你需要通过操作系统的包管理器比如apt-get或者yum来手动部署依赖并且配置环境,安装扩展等等,这些都是很繁琐很复杂的过程。

当然,你也可以使用一些譬如Puppet, Ansible, Salt, Chef等编排工具来自动化你的安装和配置过程。

或者你也能可以使用完全不一样的方法:容器虚拟化Docker。通过使用docker,你可以打包你的应用到容器里面,并且可以部署在几乎所有的机器上,你可以把应用部署在你的手提电脑上,或者生产服务器上,或者你个人的vps上,甚至在vagrant里面。

2.png

容器让你从细节中抽象出来

如果你想要更深入学习Docker,推荐阅读官方的文档“Understanding Docker”,这是一篇写得非常棒的文章。

6个理由使用docker部署drupal

1.托管无关

万一你想要把网站迁移到其他的主机提供商,使用docker的话就很容易做到,因为你的网站都是一些容器集合,而这些容器可以运行在各种机器上面。

2.克隆 

如果你想要启动一个新的环境,例如开发环境或者测试环境,那么使用docker很容易实现,你只需要使用同一个镜像启动另外的容器就行了。

3.环境一致

我们都知道这么一类问题,你在开发环境中不能重现某一些神秘的bug,最终发现是因为缺失某一些扩展或者扩展的版本不一致导致的。如果使用docker的话,诸如此类的环境问题就不存在了。

4.隔离

如果你有多个网站或者一个网站的多个实例部署在同一台服务器的花,那么将它们隔离是非常重要的。你也不想因为其中一个应用的高负载影响到其他的应用。尽管隔离的实现比较棘手,但是docker的容器之间是相互隔离的。

5.优化基础设施

毫无疑问的是我们通过配置nginx,php,mariadb来优化我们的应用性能,如果你不擅长这些,那么你能够从docker hub中获取别人已经制作好的容器镜像。

6.可扩展 

每个容器都可以被纵向扩展,比如增加更多的资源,也可以被横向扩展,比如克隆更多的容器和使用负载均衡。

起飞!

自从这篇文章发布之后,我们已经启动了docker4drupal的项目,我们推荐基于docker部署本地开发环境。参考docker4drupal

接下来我们开始部署drupal8,使用到了两个docker容器:Apache2+php和mariadb。

在这个演示中,我将在使用Ubuntu 14.04 LT的DigitalOcean主机上搭建一个最小化的drupal网站。

通过ssh以root的身份连接vps,简单起见,我们将会关闭默认的防火墙避免它的配置影响我们部署(实际项目中我们并不推荐这么做):

$ ufw disable Firewall stopped and disabled on system startup

安装docker:

$ wget -qO- https://get.docker.com/ | sh

检查是否成功:

$ docker -D infoContainers: 0Images: 0Server Version: 1.9.1Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs Dirs: 0
 Dirperm1 Supported: falseExecution Driver: native-0.2Logging Driver: json-file
Kernel Version: 3.13.0–68-generic
Operating System: Ubuntu 14.04.3 LTSCPUs: 1Total Memory: 490 MiBName: drupal8-dockerID: GUMM:PUBZ:VJOF:52B7:ZIEN:UCJC:4QA2:BSP5:UGSW:FGPV:AZY6:ASZDWARNING: No swap limit support

我们可以看到安装成功之后既没有镜像也没有容器,还可以看到docker的版本等等。默认情况下,docker使用AUFS,他可以像git一样使用docker的镜像版本,也就是说,当你想要更新存在的镜像的时候,他不会重新下载整个镜像,而是拉取新一层的。

接着我们可以开始下载docker的镜像了。我们将使用MariaDB和Drupal的的官方镜像。默认情况下,如果我们不指定镜像的绝对路径,docker将从Docker Hub中搜索并下载镜像,并且因为我们不需要指定具体某个版本的镜像,所以docker会默认使用“latest”这个标签。

$ docker pull mariadb

1.png

AUFS in action: layers of the image have been downloading

接下来我们下载drupal的镜像。这次我们指定标签为:8.0.1

$ docker pull drupal:8.0.1

让我们快速看一下这个镜像的Dockerfile文件。正如你所见到的,该镜像继承了官方的php+ apache的docker镜像,并且apache的重写模块已经开启,额外的类库和扩展也已经安装,opcache的配置也已经被更新,最后drupal本身也已经被下载到镜像里面了。

# from https://www.drupal.org/requirements/php#drupalversionsFROM php:5.6-apacheRUN a2enmod rewrite# install the PHP extensions we needRUN apt-get update && apt-get install -y libpng12-dev libjpeg-dev libpq-dev \
	&& rm -rf /var/lib/apt/lists/* \
	&& docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \
	&& docker-php-ext-install gd mbstring opcache pdo pdo_mysql pdo_pgsql zip# set recommended PHP.ini settings# see https://secure.php.net/manual/en/opcache.installation.phpRUN { \		echo 'opcache.memory_consumption=128'; \		echo 'opcache.interned_strings_buffer=8'; \		echo 'opcache.max_accelerated_files=4000'; \		echo 'opcache.revalidate_freq=60'; \		echo 'opcache.fast_shutdown=1'; \		echo 'opcache.enable_cli=1'; \
	} > /usr/local/etc/php/conf.d/opcache-recommended.iniWORKDIR /var/www/html# https://www.drupal.org/node/3060/releaseENV DRUPAL_VERSION 8.0.1ENV DRUPAL_MD5 423cc4d28da066d099986ac0844f6abbRUN curl -fSL "http://ftp.drupal.org/files/projects/drupal-${DRUPAL_VERSION}.tar.gz" -o drupal.tar.gz \
	&& echo "${DRUPAL_MD5} *drupal.tar.gz" | md5sum -c - \
	&& tar -xz --strip-components=1 -f drupal.tar.gz \
	&& rm drupal.tar.gz \
	&& chown -R www-data:www-data sites

让我们来看一下我们下载的镜像

$ docker images

5.png

"docker images"命令会显示所有已经下载的镜像。

这些镜像非常大,因为它们在debian jessie系统上面使用了它的APT打包系统进行组装,安装了很多很重的依赖。

现在,让我们使用MariaDB镜像来运行一个容器。使用v(volume)参数,我们告诉docker从存储数据的宿主机中创建一个新的挂载到容器中。默认情况下,数据将会存储在容器中,这意味着如果重建容器的话(比如升级MariaDB),这些数据将会丢失。

从查看镜像输出的内容中,我们还可以看到运行的容器的哈希识别码(identifier)。

$ docker run -e MYSQL_ROOT_PASSWORD=admin -e MYSQL_DATABASE=drupal8 -e MYSQL_USER=drupal8 -e MYSQL_PASSWORD=drupal8 -v mariadb:/var/lib/mysql -d --name mariadb mariadb

接下来我们运行一个Drupal的容器并连接到刚刚创建的MariaDB容器,并且绑定80端口。这个link只是在/etc/hosts里面的一条记录,用于指定Docker在容器安装期间创建的虚拟网络中MariaDB容器的IP。

$ docker run --name drupal8 --link mariadb:mysql -p 80:80 -d drupal:8.0.1

让我们看一下我们创建的容器:

$ docker ps

6.png

Command docker ps shows running containers

通过浏览器打开ip,我们可以看到drupal的安装界面。安装过程和普通的没什么区别,除了其中一点不同 - 你需要指定数据库主机:mysql,这个是我们创建MariaDB容器的时候指定的名字。

7.png

Change DB host to the name of the link (mysql) between the containers

以上就是全部内容了,尽情享受全新安装的drupal 8!。