介绍
Docker Compose使得处理Docker容器的编排过程(如开机,关机,并建立内部容器链接和卷)很容易。 本文提供了一个使用Docker Compose安装应用程序的实际示例,在这种情况下,WordPress使用PHPMyAdmin作为额外的。 WordPress通常在LAMP上运行,这意味着Linux,Apache,MySQL / MariaDB和PHP。官方WordPress Docker镜像包括Apache和PHP,所以我们唯一需要担心的是MariaDB。先决条件
要遵循本文,您需要以下内容:- Ubuntu 14.04 Droplet
- 使用sudo特权的非root用户( 与Ubuntu 14.04初始服务器设置介绍了如何设置起来。)
- 从安装说明和DockerDocker Compose如何在Ubuntu 14.04安装和使用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开始撰写名为新容器
wordpress
并下载
wordpress
从Docker Hub的形象。 我们可以像这样把图像:
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文件是空白敏感)
docker-compose.yml
wordpress:
image: wordpress
links:
- wordpress_db:mysql
wordpress_db:
image: mariadb
我们所做的是定义一个新的容器调用
wordpress_db
并告诉它使用
mariadb
从Docker Hub的形象。 我们也告诉我们的
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
部分,
但一定要改变examplepass
到一个更安全的密码!
docker-compose.yml
wordpress_db:
...
environment:
MYSQL_ROOT_PASSWORD: examplepass
...
这将设置内部的环境变量
wordpress_db
称为容器
MYSQL_ROOT_PASSWORD
你想要的密码。 该MariaDB的Docker映像配置为检查此环境变量,当它启动,并会采取用root帐户被定义为密码设置数据库照顾
MYSQL_ROOT_PASSWORD
。 虽然我们在这里,让我们还设置一个端口转发,以便我们可以连接到我们的WordPress安装一旦实际加载。根据
wordpress
部分添加以下两行:
docker-compose.yml
wordpress:
...
ports:
- 8080:80
...
第一个端口号是主机上的端口号,第二个端口号是容器内的端口。因此,此配置将主机端口8080上的请求转发到容器内的默认Web服务器端口80。
注意:如果你想的WordPress主机上的默认Web服务器端口80上运行,前行更改为80:80
,这样的请求到端口80的主机上被转发到端口80 WordPress的容器内。 您完整的
docker-compose.yml
文件现在应该是这样的:
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浏览器并浏览到IP 在8080端口上的DigitalOcean箱(例如,如果你的服务器的IP地址为
123.456.789.123,你应该输入
http://123.456.789.123:8080到浏览器)。 您应该会看到一个新的WordPress安装页面,并能像往常一样完成安装和博客。 因为这些都是官方Docker镜像,并且都遵循了Docker的最佳实践,每个镜像都有预定义的持久性卷,这意味着如果重新启动容器,您的博客帖子仍然会存在。您可以了解更多关于在Docker卷的
Docker的数据量的教程 。
第3步 - 添加PhpMyAdmin容器
伟大,这是相对无痛。让我们尝试得到一点花哨。 到目前为止,我们只使用官方图像,Docker团队需要极大的努力来确保准确。您可能已经注意到,我们没有给WordPress容器任何环境变量来配置它。一旦我们将它连接到一个正确配置的MariaDB容器,一切都正常工作。 这是因为有其实际把持WordPress的Docker容器内的脚本MYSQL_ROOT_PASSWORD
从我们的可变
wordpress_db
容器,并使用该连接到WordPress。 让我们走出去官方图像区域一点点的,并使用一个
社区贡献phpMyAdmin的形象 。 来吧,编辑
docker-compose.yml
一次:
nano docker-compose.yml
将以下内容粘贴到文件末尾:
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
容器设置你前面。 这抓住
docker-phpmyadmin
由社区成员
corbinu
,它链接到我们的
wordpress_db
名为容器
mysql
(从里面的意思
phpmyadmin
到主机名容器引用
mysql
将被转发到我们的
wordpress_db
容器)上公开的端口8181的端口80主机系统,最后用我们的MariaDB用户名和密码设置几个环境变量。 这张图片不会自动抓取
MYSQL_ROOT_PASSWORD
从环境变量
wordpress_db
容器的环境的方式
wordpress
形象一样。 实际上,我们必须复制
MYSQL_ROOT_PASSWORD: examplepass
从行
wordpress_db
容器,并设置用户名
root
。 完整的
docker-compose.yml
文件现在应该是这样的:
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安装。一旦完成,(使用端口8181,如这一次再次访问你的服务器的IP地址
http://123.456.789.123:8181 )。你会被PhpMyAdmin登录屏幕打扰。 来吧,使用用户名登录
root
和密码,您在YAML文件中设置,你就可以浏览你的数据库。 你会发现,服务器包括
wordpress
数据库,其中包含了所有来自你的WordPress数据安装。 你可以添加尽可能多的容器,你喜欢这种方式,并以任何方式链接他们所有你喜欢。正如你所看到的,这种方法是相当强大的 - 不是处理每个单个组件的配置和先决条件,并将它们全部设置在同一台服务器上,你可以像Lego块一样插入片段,并添加组件片段。使用类似的工具
Docker群 ,你甚至可以透明地运行这些容器在多个服务器! 这是一个超出本教程的范围。 Docker提供了一些[文件]((
https://docs.docker.com/swarm/install-w-machine/)就可以了),如果你有兴趣。
第4步 - 创建WordPress网站
由于您的新WordPress网站的所有文件都存储在您的Docker容器中,当您停止容器并再次启动时,您的文件会发生什么? 默认情况下,WordPress容器的文档根是持久的。这是因为来自Docker Hub的WordPress映像是这样配置的。如果您对WordPress网站进行更改,请停止应用程序组,然后重新启动,您的网站仍将保留您所做的更改。 让我们试试看。 从Web浏览器访问到你的WordPress(如 http://123.456.789.123:8080 )。 编辑已经存在的 世界,你好!职。然后,使用以下命令停止所有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
当它开始和拷贝文件的适当存在空。通常你必须自己做这一步。