前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
简介
Docker Compose 让处理 Docker 容器的编排过程(如启动、关闭和设置容器内部链接和卷)变得非常简单。
本文提供了一个使用 Docker Compose 安装应用程序的实际示例,本例中是 WordPress,附加 PHPMyAdmin。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
我们将使用官方 WordPress 和 MariaDB Docker 镜像。如果您感兴趣,可以在它们各自的 GitHub 和 Docker Hub 页面上找到有关这些镜像及其配置选项的更多信息。
让我们首先创建一个文件夹,用于存放我们的数据,并创建一个最小的 docker-compose.yml
文件来运行我们的 WordPress 容器:
mkdir ~/wordpress && cd $_
然后使用您喜欢的文本编辑器(如果您没有偏好,nano 很容易)创建 ~/wordpress/docker-compose.yml
:
nano ~/wordpress/docker-compose.yml
并粘贴以下内容:
wordpress:
image: wordpress
这只是告诉 Docker Compose 启动一个名为 wordpress
的新容器,并从 Docker Hub 下载 wordpress
镜像。
我们可以这样启动镜像:
docker-compose up
您将看到 Docker 从 Docker Hub 下载并提取 WordPress 镜像,一段时间后,您将收到类似以下的错误消息:
wordpress_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 镜像,但您还会看到我们还没有完成:
wordpress_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 那里得到了一个新的投诉,说没有设置根密码。
似乎仅仅链接这两个容器还不够。让我们继续设置 MYSQL_ROOT_PASSWORD
变量,以便我们实际上可以启动这个东西。
再次编辑 Docker Compose 文件:
nano ~/wordpress/docker-compose.yml
在 wordpress_db
部分的末尾添加以下两行,但一定要将 examplepass
更改为更安全的密码!
wordpress_db:
...
environment:
MYSQL_ROOT_PASSWORD: examplepass
...
这将在 wordpress_db
容器内设置一个名为 MYSQL_ROOT_PASSWORD
的环境变量,其中包含您想要的密码。MariaDB Docker 镜像配置为在启动时检查此环境变量,并将负责使用定义为 MYSQL_ROOT_PASSWORD
的密码设置根帐户的 DB。
在此同时,让我们还设置一个端口转发,以便在实际加载 WordPress 安装后可以连接到我们的 WordPress。在 wordpress
部分下添加以下两行:
wordpress:
...
ports:
- 8080:80
...
第一个端口号是主机上的端口号,第二个端口号是容器内部的端口号。因此,此配置将主机上的 8080 端口的请求转发到容器内部的默认 Web 服务器端口 80。
您的完整的 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
您将看到大量文本在屏幕上飞过。一旦它平静下来,打开一个 Web 浏览器,浏览到您的 DigitalOcean 服务器的 IP 地址和端口 8080(例如,如果您的服务器的 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
在文件末尾粘贴以下内容:
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
镜像,将其与我们的 wordpress_db
容器链接起来,使用名称为 mysql
(这意味着从 phpmyadmin
容器内部对主机名 mysql
的引用将被转发到我们的 wordpress_db
容器),将其端口 80 映射到主机系统的端口 8181,并最后设置了一些 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 的登录界面。
使用用户名 root
和你在 YAML 文件中设置的密码登录,然后你就可以浏览你的数据库了。你会注意到服务器包含一个 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 站点。你应该能看到你的博客站点和之前所做的更改。这表明你所做的更改即使在停止容器时也会被保存。
第五步 — 在主机文件系统上存储文档根目录(可选)
可以使用 Docker 数据卷将 WordPress 的文档根目录存储在主机文件系统上,以实现主机和容器之间的文件共享。
让我们试一试。再次打开你的 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 愉快!