如何在 Ubuntu 14.04 上使用 Docker Compose 安装 WordPress 和 PhpMyAdmin
介绍
Docker Compose 使处理 Docker 容器的编排过程(例如启动、关闭以及设置容器内链接和卷)变得非常容易。
本文提供了一个使用 Docker Compose 安装应用程序的真实示例,在本例中为带有 PHPMyAdmin 的 WordPress。 WordPress 通常在 LAMP 堆栈上运行,这意味着 Linux、Apache、MySQL/MariaDB 和 PHP。官方的 WordPress Docker 镜像包括 Apache 和 PHP,所以我们唯一需要担心的是 MariaDB。
先决条件
要阅读本文,您需要具备以下条件:
- Ubuntu 14.04 Droplet
- 具有 sudo 权限的非根用户(Ubuntu 14.04 的初始服务器设置说明了如何进行设置。)
- 根据如何在 Ubuntu 14.04 上安装和使用 Docker Compose 中的说明安装 Docker 和 Docker Compose
第 1 步 — 安装 WordPress
我们将使用官方的 MariaDB Docker 镜像。如果你很好奇,在它们各自的 GitHub 和 Docker Hub 页面上有更多关于这些图像及其配置选项的信息。
让我们首先创建一个存放数据的文件夹,并创建一个最小的 docker-compose.yml
文件来运行我们的 WordPress 容器:
mkdir ~/wordpress && cd $_
然后用你最喜欢的文本编辑器创建一个 ~/wordpress/docker-compose.yml
(如果你没有偏好,nano 很容易):
- nano ~/wordpress/docker-compose.yml
并粘贴以下内容:
wordpress:
image: wordpress
这只是告诉 Docker Compose 启动一个名为 wordpress
的新容器,并从 Docker Hub 下载 wordpress
图像。
我们可以像这样调出图像:
- docker-compose up
你会看到 Docker 从 Docker Hub 下载并提取 WordPress 镜像,一段时间后你会收到一些类似于下面的错误消息:
Outputwordpress_1 | error: missing WORDPRESS_DB_HOST and MYSQL_PORT_3306_TCP environment variables
wordpress_1 | Did you forget to --link some_mysql_container:mysql or set an external db
wordpress_1 | with -e WORDPRESS_DB_HOST=hostname:port?
dockercompose_wordpress_1 exited with code 1
这是 WordPress 抱怨找不到数据库。让我们将 MariaDB 图像添加到组合中并将其链接起来以解决该问题。
第 2 步 — 安装 MariaDB
要将 MariaDB 图像添加到组中,请使用文本编辑器重新打开 docker-compose.yml
:
nano ~/wordpress/docker-compose.yml
更改 docker-compose.yml
以匹配以下内容(注意缩进,YAML 文件对空格敏感)
wordpress:
image: wordpress
links:
- wordpress_db:mysql
wordpress_db:
image: mariadb
我们在这里所做的是定义一个名为 wordpress_db
的新容器,并告诉它使用来自 Docker Hub 的 mariadb
图像。我们还告诉我们的 wordpress
容器将我们的 wordpress_db
容器链接到 wordpress
容器并将其称为 mysql
(在内部wordpress
容器 主机名 mysql
将被转发到我们的 wordpress_db
容器)。
如果你再次运行 docker-compose up
,你会看到它下载了 MariaDB 镜像,你还会看到我们还没有完成:
Outputwordpress_db_1 | error: database is uninitialized and MYSQL_ROOT_PASSWORD not set
wordpress_db_1 | Did you forget to add -e MYSQL_ROOT_PASSWORD=... ?
wordpress_1 | error: missing required WORDPRESS_DB_PASSWORD environment variable
wordpress_1 | Did you forget to -e WORDPRESS_DB_PASSWORD=... ?
wordpress_1 |
wordpress_1 | (Also of interest might be WORDPRESS_DB_USER and WORDPRESS_DB_NAME.)
wordpress_wordpress_db_1 exited with code 1
wordpress_wordpress_1 exited with code 1
Gracefully stopping... (press Ctrl+C again to force)
WordPress 仍然抱怨找不到数据库,现在我们收到了来自 MariaDB 的新抱怨,说没有设置 root 密码。
看起来仅仅连接两个容器是不够的。让我们继续设置 MYSQL_ROOT_PASSWORD
变量,这样我们就可以真正启动它了。
再次编辑 Docker Compose 文件:
- nano ~/wordpress/docker-compose.yml
将这两行添加到 wordpress_db
部分的end,但一定要将 examplepass
更改为更安全的密码!
wordpress_db:
...
environment:
MYSQL_ROOT_PASSWORD: examplepass
...
这将在 wordpress_db
容器内设置一个名为 MYSQL_ROOT_PASSWORD
的环境变量,其中包含您想要的密码。 MariaDB Docker 映像配置为在启动时检查此环境变量,并将负责使用根帐户设置数据库,密码定义为 MYSQL_ROOT_PASSWORD
。
当我们这样做的时候,让我们也设置一个端口转发,这样我们就可以在它实际加载后连接到我们的 WordPress 安装。在 wordpress
部分下添加以下两行:
wordpress:
...
ports:
- 8080:80
...
第一个端口号是主机上的端口号,第二个端口号是容器内部的端口。因此,此配置将主机端口 8080 上的请求转发到容器内默认的 Web 服务器端口 80。
注意:如果您希望 WordPress 在主机上的默认 Web 服务器端口 80 上运行,请将上一行更改为 80:80
以便将对主机上 80 端口的请求转发到内部的 80 端口WordPress 容器。
您完整的 docker-compose.yml
文件现在应该如下所示:
wordpress:
image: wordpress
links:
- wordpress_db:mysql
ports:
- 8080:80
wordpress_db:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: examplepass
使用此配置,我们实际上可以继续并启动 WordPress。这一次,让我们使用 -d
选项运行它,这将告诉 docker-compose
在后台运行容器,以便您可以继续使用您的终端:
- docker-compose up -d
你会看到一大堆文字飞过你的屏幕。一旦平静下来,打开网络浏览器并浏览到IP
您应该会看到一个全新的 WordPress 安装页面,并且能够像往常一样完成安装和博客。
因为这些都是官方 Docker 镜像,并且遵循 Docker 的所有最佳实践,所以这些镜像中的每一个都有为您预定义的持久卷——这意味着如果您重新启动容器,您的博客文章将仍然存在。您可以在 Docker 数据卷教程中了解有关使用 Docker 卷的更多信息。
第 3 步 — 添加 PhpMyAdmin 容器
太好了,那是相对无痛的。让我们尝试变得有点花哨。
到目前为止,我们只使用官方镜像,Docker 团队竭尽全力确保其准确无误。您可能已经注意到,我们不必为 WordPress 容器提供任何环境变量来配置它。一旦我们将它链接到正确配置的 MariaDB 容器,一切都会正常工作。
这是因为 WordPress Docker 容器中有一个脚本实际上从我们的 wordpress_db
容器中获取 MYSQL_ROOT_PASSWORD
变量并使用它来连接到 WordPress。
让我们稍微跳出官方图像区域,使用社区贡献的 PhpMyAdmin 图像。继续编辑 docker-compose.yml
一次:
- nano docker-compose.yml
将以下内容粘贴到文件末尾:
phpmyadmin:
image: corbinu/docker-phpmyadmin
links:
- wordpress_db:mysql
ports:
- 8181:80
environment:
MYSQL_USERNAME: root
MYSQL_ROOT_PASSWORD: examplepass
请务必将 examplepass 替换为您之前设置的 wordpress_db
容器中的完全相同的根密码。
这通过社区成员 corbinu
获取 docker-phpmyadmin
,将其链接到我们的名为 mysql
的 wordpress_db
容器(意思是从 phpmyadmin
容器内部对主机名 mysql
的引用将被转发到我们的 wordpress_db
容器),在主机的端口 8181 上公开其端口 80系统,最后使用我们的 MariaDB 用户名和密码设置几个环境变量。此图像不会像 wordpress
图像那样自动从 wordpress_db
容器环境中获取 MYSQL_ROOT_PASSWORD
环境变量。我们实际上必须从 wordpress_db
容器中复制 MYSQL_ROOT_PASSWORD: examplepass
行,并将用户名设置为 root
。
完整的 docker-compose.yml
文件现在应该如下所示:
wordpress:
image: wordpress
links:
- wordpress_db:mysql
ports:
- 8080:80
wordpress_db:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: examplepass
phpmyadmin:
image: corbinu/docker-phpmyadmin
links:
- wordpress_db:mysql
ports:
- 8181:80
environment:
MYSQL_USERNAME: root
MYSQL_ROOT_PASSWORD: examplepass
现在再次启动应用程序组:
- docker-compose up -d
您将看到正在安装 PhpMyAdmin。完成后,再次访问您服务器的 IP 地址(这次使用端口 8181,例如 http://123.456.789.123:8181)。 PhpMyAdmin 登录屏幕会迎接您。
继续并使用您在 YAML 文件中设置的用户名 root
和密码登录,您将能够浏览您的数据库。您会注意到服务器包含一个 wordpress
数据库,其中包含您安装的 WordPress 中的所有数据。
您可以通过这种方式添加任意数量的容器,并以您喜欢的任何方式将它们全部链接起来。如您所见,该方法非常强大 — 无需处理每个单独组件的配置和先决条件并将它们全部设置在同一台服务器上,您可以像乐高积木一样将各个部分拼接在一起并逐个添加组件。如果您有兴趣,可以使用文档之类的工具。
第 4 步 — 创建 WordPress 站点
由于您的新 WordPress 站点的所有文件都存储在您的 Docker 容器中,当您停止容器并再次启动它时,您的文件会发生什么情况?
默认情况下,WordPress 容器的文档根目录是持久的。这是因为来自 Docker Hub 的 WordPress 镜像是这样配置的。如果您对 WordPress 站点进行更改,停止应用程序组,然后重新启动它,您的网站仍将具有您所做的更改。
让我们试试吧。
从网络浏览器转到您的 WordPress(例如 http://123.456.789.123:8080)。编辑 Hello World!已经存在的帖子。然后,使用以下命令停止所有 Docker 容器:
- docker-compose stop
尝试再次加载 WordPress 站点。您会看到该网站已关闭。再次启动 Docker 容器:
- docker-compose up -d
再次加载 WordPress 站点。您应该会看到您的博客站点和您之前所做的更改。这表明即使容器停止,您所做的更改也会被保存。
第 5 步 — 在主机文件系统上存储文档根目录(可选)
可以使用 Docker 数据卷将 WordPress 的文档根存储在主机文件系统上,以在主机和容器之间共享文件。
注意:有关使用 Docker 数据卷的更多详细信息,请查看 Docker 数据卷教程。
试一试吧。再次打开您的 docker-compose.yml
文件:
nano ~/wordpress/docker-compose.yml
在 wordpress:
部分添加以下行:
wordpress:
...
volumes:
- ~/wordpress/wp_html:/var/www/html
...
停止当前运行的 docker-compose
会话:
- docker-compose stop
删除现有容器,以便我们可以将卷映射到主机文件系统:
- docker-compose rm wordpress
再次启动 WordPress:
- docker-compose -d
一旦提示返回,WordPress 应该再次启动并运行——这次使用主机文件系统来存储文档根目录。
如果您查看 ~/wordpress
目录,您会看到其中现在有一个 wp_html
目录:
- ls ~/wordpress
所有的 WordPress 源文件都在里面。您所做的更改将由 WordPress 容器实时获取。
这种体验比平时更顺畅一些——WordPress Docker 容器被配置为在启动时检查 /var/www/html
是否为空,并适当地将文件复制到那里。通常您必须自己执行此步骤。
结论
你应该有一个完整的 WordPress 部署并运行。您应该能够使用相同的方法使用 Docker Hub 上提供的图像部署各种各样的系统。一定要弄清楚哪些卷是持久的,哪些不是你的每个容器
Docker 快乐!