介绍
Docker Compose使处理Docker容器的管制过程(如启动、关闭和设置集装箱内部链接和卷)非常容易。
本文提供了使用Docker Compose来安装应用程序的真实世界的例子,在这种情况下,WordPress使用PHPMyAdmin作为一个额外。WordPress通常运行在LAMP堆栈上,这意味着Linux,Apache,MySQL/MariaDB和PHP。
前提条件
为了遵循这篇文章,您将需要以下内容:
- Ubuntu 14.04 Droplet
- 具有 sudo 特权的非根用户(Initial Server Setup with Ubuntu 14.04解释了如何设置此设置)
- Docker 和 Docker Compose 从 [如何在 Ubuntu 14.04 上安装和使用 Docker Compose 中的说明中安装(https://andsky.com/tech/tutorials/how-to-install-and-use-docker-compose-on-ubuntu-14-04)
第1步:安装WordPress
我們將使用官方的 WordPress和 MariaDBDocker圖像. 如果你有興趣,有大量的更多信息,關於這些圖像和他們的配置選項在他們的GitHub和Docker Hub頁面。
让我们开始创建一个文件夹,我们的数据将生活在那里,并创建一个最小的docker-compose.yml
文件来运行我们的WordPress容器:
1mkdir ~/wordpress && cd $_
然后用您最喜欢的文本编辑器创建一个 `~/wordpress/docker-compose.yml (如果您没有偏好,纳米很容易):
1nano ~/wordpress/docker-compose.yml
然后在下列情况下吃:
1[label ~/wordpress/docker-compose.yml]
2wordpress:
3 image: wordpress
这只是告诉Docker Compose启动一个名为WordPress
的新容器,并从Docker Hub下载WordPress
图像。
我们可以把图像举起来这样:
1docker-compose up
您将看到Docker下载并从Docker Hub中提取WordPress图像,一段时间后您将收到一些类似下面的错误消息:
1[secondary_label Output]
2wordpress_1 | error: missing WORDPRESS_DB_HOST and MYSQL_PORT_3306_TCP environment variables
3wordpress_1 | Did you forget to --link some_mysql_container:mysql or set an external db
4wordpress_1 | with -e WORDPRESS_DB_HOST=hostname:port?
5dockercompose_wordpress_1 exited with code 1
这是WordPress抱怨它找不到一个数据库. 让我们在混合中添加一个MariaDB图像,并链接它来修复它。
第2步:安装MariaDB
要将 MariaDB 图像添加到组中,请使用文本编辑器重新打开 docker-compose.yml
:
1nano ~/wordpress/docker-compose.yml
更改 `dxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdx
1[label docker-compose.yml]
2wordpress:
3 image: wordpress
4 links:
5 - wordpress_db:mysql
6wordpress_db:
7 image: mariadb
我们在这里做的是定义一个名为wordpress_db
的新容器,并告诉它从Docker Hub中使用mariadb
图像,我们还告诉我们的wordpress_db
容器将我们的wordpress_db
容器链接到wordpress
容器,并将其称为mysql
(在wordpress
容器内,主机名称mysql
将转发到我们的wordpress_db
容器)。
如果你再次运行docker-compose up
,你会看到它下载了MariaDB图像,你还会看到我们还没有到达那里:
1[secondary_label Output]
2wordpress_db_1 | error: database is uninitialized and MYSQL_ROOT_PASSWORD not set
3wordpress_db_1 | Did you forget to add -e MYSQL_ROOT_PASSWORD=... ?
4wordpress_1 | error: missing required WORDPRESS_DB_PASSWORD environment variable
5wordpress_1 | Did you forget to -e WORDPRESS_DB_PASSWORD=... ?
6wordpress_1 |
7wordpress_1 | (Also of interest might be WORDPRESS_DB_USER and WORDPRESS_DB_NAME.)
8wordpress_wordpress_db_1 exited with code 1
9wordpress_wordpress_1 exited with code 1
10Gracefully stopping... (press Ctrl+C again to force)
WordPress仍在抱怨无法找到数据库,现在我们有来自MariaDB的新投诉说没有设置根密码。
显然,仅仅连接两个容器是不够的,让我们继续设置MYSQL_ROOT_PASSWORD
变量,以便我们实际上可以开火。
再次编辑 Docker Compose 文件:
1nano ~/wordpress/docker-compose.yml
将这两个行添加到wordpress_db
部分的 end 中,但 请确保将examplepass
更改为更安全的密码!
1[label docker-compose.yml]
2wordpress_db:
3...
4 environment:
5 MYSQL_ROOT_PASSWORD: examplepass
6...
这将设置一个环境变量在wordpress_db
容器内,名为MYSQL_ROOT_PASSWORD
与您想要的密码。MariaDB Docker 图像配置为在启动时检查此环境变量,并将负责设置 DB 使用根帐户,该密码定义为MYSQL_ROOT_PASSWORD
。
當我們正在進行時,讓我們也設定一個前端,以便我們可以連接到我們的WordPress安裝,一旦它實際上加載。
1[label docker-compose.yml]
2wordpress:
3...
4 ports:
5 - 8080:80
6...
第一个端口号是主机上的端口号,第二个端口号是容器内部的端口,因此,此配置将主机的端口 8080 上的请求转移到容器内部的默认 Web 服务器端口 80。
<$>[注]
注: 如果您希望Wordpress在主机上的默认网页服务器端口80上运行,请将前一行更改为 80:80
,以便主机上的端口80请求转发到Wordpress容器内的端口80。
您的完整的 'docker-compose.yml' 文件现在应该是这样的:
1[label docker-compose.yml]
2wordpress:
3 image: wordpress
4 links:
5 - wordpress_db:mysql
6 ports:
7 - 8080:80
8wordpress_db:
9 image: mariadb
10 environment:
11 MYSQL_ROOT_PASSWORD: examplepass
有了这个配置,我们实际上可以继续前进并启动WordPress,这次,让我们用d
选项运行它,这将告诉docker-compose
在背景中运行容器,以便您可以继续使用您的终端:
1docker-compose up -d
一旦它平静下来,打开一个网页浏览器,并浏览到您的DigitalOcean框的IP 在端口8080(例如,如果您的服务器的IP地址是123.456.789.123你应该输入您的浏览器 http://123.456.789.123:8080。
您应该看到一个新的WordPress安装页面,并可以像往常一样完成安装和博客。
由于这些都是官方的Docker图像,并遵循了Docker的所有最佳实践,因此每个图像都为您提供预定义的持久卷,这意味着如果您重新启动容器,您的博客帖子仍然在那里。
步骤 3 — 添加一个PhpMyAdmin容器
很棒,这是相对无痛的.让我们试着得到一点幻想。
到目前为止,我们只使用官方图像,Docker 团队努力确保它们是准确的,您可能已经注意到我们不必给 WordPress 容器任何环境变量来配置它。
这是因为WordPress Docker容器内部有一个脚本,它实际上从我们的WordPress_db容器中获取MYSQL_ROOT_PASSWORD
变量,并使用它连接到WordPress。
让我们走出官方图像区域一点点,并使用一个 社区贡献的PhpMyAdmin图像。
1nano docker-compose.yml
将下列内容放在文件的末尾:
1[label docker-compose.yml]
2phpmyadmin:
3 image: corbinu/docker-phpmyadmin
4 links:
5 - wordpress_db:mysql
6 ports:
7 - 8181:80
8 environment:
9 MYSQL_USERNAME: root
10 MYSQL_ROOT_PASSWORD: examplepass
请确保用您之前设置的wordpress_db
容器中完全相同的根密码更换examplepass。
这将docker-phpmyadmin
从社区成员corbinu
抓取,将其链接到我们的wordpress_db
容器中,名为mysql
(意思是从phpmyadmin
容器内部引用到mysql
主机名将被转发到我们的wordpress_db
容器),将其端口80暴露在主机系统的端口8181上,最后将一些环境变量设置为我们的MariaDB用户名和密码。
完整的 'docker-compose.yml' 文件现在应该是这样的:
1[label docker-compose.yml]
2wordpress:
3 image: wordpress
4 links:
5 - wordpress_db:mysql
6 ports:
7 - 8080:80
8wordpress_db:
9 image: mariadb
10 environment:
11 MYSQL_ROOT_PASSWORD: examplepass
12phpmyadmin:
13 image: corbinu/docker-phpmyadmin
14 links:
15 - wordpress_db:mysql
16 ports:
17 - 8181:80
18 environment:
19 MYSQL_USERNAME: root
20 MYSQL_ROOT_PASSWORD: examplepass
现在,重新启动应用组:
1docker-compose up -d
您将看到PhpMyAdmin安装完成后,再次访问您的服务器的IP地址(这次使用端口8181,例如 http://123.456.789.123:8181).您将被PhpMyAdmin登录屏幕欢迎。
继续使用您在YAML文件中设置的用户名根
和密码登录,您将能够浏览您的数据库,您将注意到服务器包含一个WordPress
数据库,其中包含您的WordPress安装的所有数据。
正如你所看到的,这种方法非常强大,而不是处理每个组件的配置和先决条件,并将它们设置在同一个服务器上,你可以像Lego块一样连接这些组件并将组件添加到一起。 使用像Docker Swarm(https://docs.docker.com/swarm/install-w-machine/)这样的工具,你甚至可以透明地在多个服务器上运行这些容器! 尽管如此,Docker提供了一些 文档的内容,如果你感兴趣。
第4步:创建WordPress网站
由于您的新的WordPress网站的所有文件都存储在您的Docker容器中,当您关闭容器并重新启动它时,会发生什么?
默认情况下,WordPress容器的文档根是持久的,这是因为Docker Hub的WordPress图像是这样配置的. 如果你对WordPress网站做出更改,停止应用组,然后重新启动,你的网站仍然会有你所做的更改。
让我们试试吧。
從網頁瀏覽器到您的 WordPress (例如 http://123.456.789.123:8080)。 編輯已經存在的 Hello World! 帖子。 然後用以下命令停止所有 Docker 容器:
1docker-compose stop
尝试再次加载WordPress网站,您将看到网站已下载,重新启动Docker容器:
1docker-compose up -d
再次加载WordPress网站,您应该看到您的博客网站和您之前所做的更改,这表明您所做的更改即使在容器停止时也被保存。
步骤 5 — 在主机文件系统中存储文档根(可选)
可以使用 Docker 数据量将 WordPress 文档根存储在主机文件系统中,以便在主机和容器之间共享文件。
<$>[注] 注: 有关使用 Docker 数据量的更多细节,请参阅 Docker 数据量教程。
让我们再试一试,再一次打开你的 docker-compose.yml
文件:
1nano ~/wordpress/docker-compose.yml
在WordPress:
部分中,添加以下几行:
1[label ~/wordpress/docker-compose.yml]
2wordpress:
3...
4 volumes:
5 - ~/wordpress/wp_html:/var/www/html
6 ...
停止您目前正在运行的docker-compose
会话:
1docker-compose stop
移除现有容器,以便我们可以将音量绘制到主机文件系统:
1docker-compose rm wordpress
重新启动WordPress:
1docker-compose -d
一旦提示返回,WordPress应该再次启动并运行 - 这次使用主机文件系统来存储文档根。
如果你看看你的~/wordpress
目录,你会看到它现在有一个wp_html
目录:
1ls ~/wordpress
所有WordPress源文件都在里面,您所做的更改将由WordPress容器实时收集。
这种体验比平时更顺畅 - WordPress Docker 容器配置为在启动时检查 /var/www/html
是否空,并在那里适当地复制文件。
结论
你应该有一个完整的WordPress部署和运行. 你应该能够使用相同的方法来部署相当广泛的系统,使用可用的图像在Docker Hub. 确保找出哪些卷是持久的,哪些不是每个容器你 创建。
快乐的Docker!