Docker Compose使得处理Docker容器的编排过程(例如启动,关闭和设置容器内链接和卷)非常容易。
本文提供了一个使用Docker Compose来安装应用程序的实际示例,在这种情况下,WordPress使用PHPMyAdmin作为额外的。WordPress通常在LAMP堆栈上运行,这意味着Linux,Apache,MySQL / MariaDB和PHP。官方的WordPress Docker镜像包括Apache和PHP,所以我们唯一需要担心的是MariaDB。
要阅读本文,您需要具备以下条件:
sudo
命令的非root账号的Ubuntu服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。我们将使用官方的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图像,一段时间后您将收到类似于以下内容的错误消息:
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图像添加到混合中并将其链接起来以修复它。
要将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的新投诉,说没有设置root密码。
似乎只是链接两个容器是不够的。让我们继续设置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映像配置为在启动时检查此环境变量,并将使用root帐户设置数据库,并将密码定义为MYSQL_ROOT_PASSWORD
。
虽然我们正在使用它,但我们还设置了一个前向端口,以便我们可以在实际加载后连接到我们的WordPress安装。在该wordpress
部分下添加以下两行:
wordpress:
...
ports:
- 8080:80
...
第一个端口号是主机上的端口号,第二个端口号是容器内的端口号。因此,此配置将主机端口8080上的请求转发到容器内的默认Web服务器端口80。
注意:如果您希望Wordpress在主机上的默认Web服务器端口80上运行,请将上一行更改为80:80
以便将对主机上端口80的请求转发到Wordpress容器内的端口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浏览器并浏览到 端口8080上的DigitalOcean盒的IP (例如,如果您的服务器的IP地址是123.456.789.123,您应该输入#http://123.456.789.123:8080到你的浏览器。)
您应该看到一个全新的WordPress安装页面,并且能够像往常一样完成安装和博客。
因为这些都是Docker的官方映像,并且遵循Docker的所有最佳实践,所以这些映像中的每一个都有预先定义的持久卷 - 这意味着如果重新启动容器,您的博客文章仍然会存在。
太好了,那是相对无痛的。让我们尝试一下。
到目前为止,我们只使用官方图像,Docker团队非常努力确保准确。您可能已经注意到我们没有必要为WordPress容器提供任何环境变量来配置它。一旦我们将它连接到正确配置的MariaDB容器,一切都正常工作。
这是因为WordPress Docker容器中有一个脚本实际上MYSQL_ROOT_PASSWORD
从wordpress_db
容器中获取变量并使用它连接到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
请务必使用您之前设置的wordpress_db
容器中的完全相同的root密码替换examplepass。
这docker-phpmyadmin
由社区成员corbinu
抓取,用名称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登录屏幕的欢迎。
继续使用root
您在YAML文件中设置的用户名和密码登录,您将能够浏览您的数据库。您会注意到服务器包含一个wordpress
数据库,其中包含WordPress安装中的所有数据。
您可以通过这种方式添加任意数量的容器,并以任何方式将它们全部链接起来。正如您所看到的,这种方法非常强大 - 而不是处理每个组件的配置和先决条件,并将它们全部设置在同一台服务器上,您可以像Lego块一样插入各个部分并逐个添加组件。使用像Docker Swarm这样的工具,您甚至可以在多个服务器上透明地运行这些容器!这虽然是本教程的范围。如果您有兴趣,Docker会在其上提供一些[文档]((https://docs.docker.com/swarm/install-w-machine/)))。
由于新WordPress站点的所有文件都存储在Docker容器中,当您停止容器并再次启动时,文件会发生什么?
默认情况下,WordPress容器的文档根目录是持久的。这是因为Docker Hub中的WordPress图像是以这种方式配置的。如果您对WordPress网站进行了更改,请停止该应用程序组,然后重新启动它,您的网站仍将进行所做的更改。
我们来试试吧。
从Web浏览器转到您的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上提供的映像部署各种各样的系统。请务必确定哪些卷是持久的,哪些卷不是您创建的每个容器。
更多Ubuntu教程请前往腾讯云+社区学习更多知识。
参考文献:《How To Install Wordpress and PhpMyAdmin with Docker Compose on Ubuntu 14.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。