使用 Docker 容器配置 LAMP 环境 - 入门版

大家好,
我是开发团队野生队的成员 Mandai。

Docker 容器并非设计为作为一个完整的单一容器运行,而是
多个容器协同工作以运行单一服务。

首先,我想创建一个网络系统,其中一台服务器上的两个 Docker 容器协同工作。

本文是 Docker 入门系列文章的第四篇,将通过回顾基础知识帮助您理解 Docker。
如果您想阅读 Docker 入门系列的前几篇文章,请点击以下链接。

 

这个目标

这次,我将尝试使用 Docker 创建一个基本的 LAMP 配置。为了解释
什么是基本的 LAMP 配置,我将阐述我设想的配置方案。

  • 一个运行 Apache+PHP 的 Docker 容器
  • 一个运行 MySQL 的 Docker 容器
  • 连接不同的容器,它们就能像本地安装的容器一样运行。
  • 从虚拟机外部看,它就像一个普通的 Web 系统。

我设想的情况是这样的。

这将

  • 您可以了解如何启动多个容器(尽管这并不那么简单)。
  • 学习如何将容器连接在一起
  • 这让我不禁思考,将容器放在不同的服务器上是否可行。

我希望自己能理解这类事情。

我打算安装 WordPress,看看能不能正常运行。
和上次一样,我会在 VirtualBox 虚拟机上的 Ubuntu 系统下进行操作。

 

准备必要的 Docker 镜像

这次所需的 Docker 镜像为:

  • MySQL Docker 镜像
  • Apache + PHP Docker 镜像


前者使用官方的 MySQL Docker 镜像,后者使用官方的 WordPress Docker 镜像

现在,从 Docker Hub 拉取 MySQL Docker 镜像并启动 Docker 容器。

vagrant@vagrant:~$ docker run --name mymysql -e MYSQL_ROOT_PASSWORD=[mysql 密码] -d mysql:latest 无法在本地找到镜像 'mysql:latest' latest: 从 library/mysql 拉取 86e6c3163927: 拉取完成 68f4b3625ea4: 拉取完成 04f7e78a2c8a: 拉取完成 1bade56c3b6b: 拉取完成 dd6387e14c18: 拉取完成 ca30c0626c9b: 拉取完成 0dc5e226a795: 拉取完成 6c164b0f04cb: 拉取完成 5c74d058f7b5: 拉取完成 0fd3b6e12567: 拉取完成 e8126a9d061e: 拉取完成 d17cffff8039: 拉取完成1924f4186d05:拉取完成 14961e5db73a:拉取完成 摘要:sha256:16de02081c408c41361126aaa718f91693688d39a216a74ac8dab841db050228 状态:已下载 mysql:latest 的更新镜像 12cb7271b424e8043d7bb36484061f49331a87be25bcd415e4a9a481a6b33c53

我们来检查一下 Docker 容器的启动情况。

vagrant@vagrant:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 12cb7271b424 mysql:latest "/entrypoint.sh mysql" 3 seconds ago Up 3 seconds 3306/tcp mymysql

它已成功启动。
接下来,拉取包含 WordPress 的 Docker 镜像并启动 Docker 容器。

vagrant@vagrant:~$ docker run --name mywordpress --link mymysql:mysql -p 8080:80 -d wordpress 无法在本地找到镜像“wordpress:latest” latest: 从 library/wordpress 拉取 9482852a6953: 拉取完成 81de90fd7f09: 拉取完成 57ae0639bf23: 拉取完成 c4f7968ac19e: 拉取完成 d06608e0df69: 拉取完成 7ab219b6a3ea: 拉取完成 049be7b00a71: 拉取完成 1ac57811ebb0: 拉取完成 5f7f35d35a61: 拉取完成 e7ff06ab86e9: 拉取完成 50cbe3cba4bd: 拉取完成 ef9f3544f906: 拉取完成0544870563ee:拉取完成 6b7e8b5d0ef6:拉取完成 4fb33229649f:拉取完成 d0cabc0feb31:拉取完成 6fb545ed9179:拉取完成 9e9f602b9253:拉取完成 8d3522c82327:拉取完成 26c9007116c8:拉取完成 19faf318b397:拉取完成 04c297e0e874:拉取完成 0b9e66c139d3:拉取完成 52cddd72d1ca:拉取完成 19d7bfb3a2a7:拉取完成 15031c83aa88:拉取完成 9c3238040649:拉取完成 492d7fea8944:拉取完成676505bb515e:拉取完成 eea959e50c85:拉取完成 1029747e7634:拉取完成 155de5677313:拉取完成 摘要:sha256:bfd7e102741d73cce4ec58b2d937586c670f31df1c80aeaf4d5c525eb3c6ac06 状态:已下载 wordpress:latest 的更新镜像 8606df07f39f2a22dbdefd916b42c1747ca1df86f4a012620862c039d110887f

完成上述步骤后,检查 Docker 容器是否正在运行。

vagrant@vagrant:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8606df07f39f wordpress "/entrypoint.sh apach" 3 seconds ago Up 3 seconds 0.0.0.0:8080->80/tcp mywordpress 12cb7271b424 mysql:latest "/entrypoint.sh mysql" 2 minutes ago Up 2 minutes 3306/tcp mymysql

至此,所有必需组件的安装都已完成。WordPress
Docker 镜像不包含 MySQL,但根据 Docker Hub 上的说明,您可以自行添加。

  • 如果在安装时添加“--link mymysql:mysql”选项,它将被设置为使用名为mymysql的Docker容器的MySQL容器。
  • 由于 WORDPRESS_DB_HOST 使用的是链接的 mysql 容器,因此其默认值未指定。
  • 目前未指定 WORDPRESS_DB_USER,因为我们将以 root 用户身份访问 mymysql 容器(建议更改此设置)。
  • 如果您不指定 WORDPRESS_DB_PASSWORD,则会从 mysql 容器中获取在启动连接的 mysql 容器时设置的 MYSQL_ROOT_PASSWORD 变量,因此无需再次指定(尽管建议更改它)。
  • WORDPRESS_DB_NAME 的默认值为 wordpress。如果您想使用其他数据库名称,请输入该名称。

只要记住这些要点,似乎就可以跨容器连接到数据库而不会出现任何问题。

 

通过浏览器安装 WordPress

让我们再次从浏览器中查看 WordPress 安装界面。
由于 Docker 运行在 Ubuntu 虚拟机上,我们需要在 Vagrantfile 文件中写入以下内容,将主机上的 18080 端口转发到虚拟机上的 8080 端口。

config.vm.network "forwarded_port", guest: 8080, host: 18080

虚拟机上的 8080 端口转发到 WordPress Docker 容器上的 80 端口,因此 18080 端口连接到 Docker 容器上的 80 端口。

当我访问 http://localhost:18080/ 时,设置界面流畅地显示了出来。

wordpress_installation_01

选择日语作为语言,然后点击“继续”。

wordpress_installation_02
请输入所需的登录信息

wordpress_installation_03

搞定。很简单。

wordpress_installation_04

接下来会出现登录表单,请输入您之前输入的用户名和密码。

wordpress_installation_05

我进入了仪表盘界面。

一切都发生得很快,但令人惊讶的是,如果你使用 Rails 之类的工具正确创建了一个 Web 服务,你可以创建一个 Docker 镜像,其中包含 Dockerfile 中的 git clone 和 rake 命令,并以相同的方式部署它。

您也可以通过指定 IP 地址将 AWS RDS 用作数据库,而且部署 nginx Docker 容器之类的操作也非常简单。这
一切都取决于您如何连接 Docker 容器。
就是这样。

如果您觉得这篇文章有用,请点击【点赞】!
0
加载中...
0票,平均分:0.00/10
1,795
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

万代洋一

我的主要工作是开发社交游戏的Web API,但我也很荣幸能够从事其他各种工作,包括市场营销。
我在Beyond中的肖像权采用CC0协议。