如何在Ubuntu14.04上使用DockerCompose安装Wordpress和PhpMyAdmin
介绍
Docker Compose 使处理 Docker 容器的编排过程(例如启动、关闭和设置容器内链接和卷)变得非常容易。
本文提供了一个使用 Docker Compose 安装应用程序的真实示例,在本例中是带有 PHPMyAdmin 的 WordPress 作为额外的。 WordPress 通常在 LAMP 堆栈上运行,这意味着 Linux、Apache、MySQL/MariaDB 和 PHP。 官方的 WordPress Docker 镜像为我们包括了 Apache 和 PHP,所以我们唯一需要担心的是 MariaDB。
先决条件
要阅读本文,您将需要以下内容:
- Ubuntu 14.04 液滴
- 具有 sudo 权限的非 root 用户(Initial Server Setup with Ubuntu 14.04 解释了如何设置。)
- 根据 如何在 Ubuntu 14.04 上安装和使用 Docker Compose 中的说明安装 Docker 和 Docker Compose
第 1 步 — 安装 WordPress
我们将使用官方的 WordPress 和 MariaDB Docker 镜像。 如果您好奇,可以在它们各自的 GitHub 和 Docker Hub 页面上找到有关这些图像及其配置选项的更多信息。
让我们首先创建一个存放数据的文件夹,然后创建一个最小的 docker-compose.yml
文件来运行我们的 WordPress 容器:
mkdir ~/wordpress && cd $_
然后用你喜欢的文本编辑器创建一个 ~/wordpress/docker-compose.yml
(如果你没有偏好,nano 很容易):
nano ~/wordpress/docker-compose.yml
并粘贴以下内容:
~/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 文件对空格敏感)
码头工人-compose.yml
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 更改为更安全的密码!
码头工人-compose.yml
wordpress_db: ... environment: MYSQL_ROOT_PASSWORD: examplepass ...
这将使用您想要的密码在 wordpress_db
容器内设置一个名为 MYSQL_ROOT_PASSWORD
的环境变量。 MariaDB Docker 映像配置为在启动时检查此环境变量,并将负责使用密码定义为 MYSQL_ROOT_PASSWORD
的 root 帐户设置数据库。
当我们这样做的时候,让我们也设置一个端口转发,以便我们可以在它实际加载后连接到我们的 WordPress 安装。 在 wordpress
部分下添加这两行:
码头工人-compose.yml
wordpress: ... ports: - 8080:80 ...
第一个端口号是主机上的端口号,第二个端口号是容器内部的端口号。 因此,此配置将主机端口 8080 上的请求转发到容器内的默认 Web 服务器端口 80。
注意: 如果您希望 Wordpress 在主机上的默认 Web 服务器端口 80 上运行,请将上一行更改为 80:80
以便将对主机上端口 80 的请求转发到端口80 在 Wordpress 容器内。
您的完整 docker-compose.yml
文件现在应该如下所示:
码头工人-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
你会看到一大堆文字飞过你的屏幕。 一旦平静下来,打开网络浏览器并在端口 8080 上浏览到您的 DigitalOcean 盒子的 IP(例如,如果您的服务器的 IP 地址是 123.456.789.123 你应该输入 http ://123.456.789.123:8080 进入您的浏览器。)
您应该会看到一个全新的 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
将以下内容粘贴到文件末尾:
码头工人-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
容器中完全相同的 root 密码。
这将由社区成员 corbinu
抓取 docker-phpmyadmin
,将其链接到我们的 wordpress_db
容器,名称为 mysql
(意思是从 phpmyadmin
容器内部对主机名 mysql
的引用将被转发到我们的 wordpress_db
容器),在主机系统的端口 8181 上公开其端口 80,最后使用我们的 MariaDB 用户名和密码设置几个环境变量. 此图像不会像 wordpress
图像那样自动从 wordpress_db
容器的环境中获取 MYSQL_ROOT_PASSWORD
环境变量。 我们实际上必须从 wordpress_db
容器中复制 MYSQL_ROOT_PASSWORD: examplepass
行,并将用户名设置为 root
。
完整的 docker-compose.yml
文件现在应该如下所示:
码头工人-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 安装的所有数据。
您可以通过这种方式添加任意数量的容器,并以您喜欢的任何方式将它们全部链接起来。 如您所见,该方法非常强大——您无需处理每个单独组件的配置和先决条件并将它们全部设置在同一台服务器上,而是可以像乐高积木一样将各个部分拼凑在一起并逐个添加组件。 使用 Docker Swarm 之类的工具,您甚至可以在多个服务器上透明地运行这些容器! 不过,这有点超出了本教程的范围。 如果您有兴趣,Docker 提供了一些 文档。
第 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/docker-compose.yml
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 上可用的映像部署各种各样的系统。 请务必弄清楚哪些卷是持久的,哪些不是您创建的每个容器。
快乐 Dockering!