当前位置: 首页>>技术教程>>正文


如何在Ubuntu 18.04 Bionic Beaver Linux上使用docker-compose创建基于docker的LAMP堆栈

, , ,

目的

通过本教程,您将能够使用Docker技术创建LAMP环境。

要求

  • 根权限
  • Docker基础知识

困难

介质

约定

  • -要求linux命令可以直接以root用户身份或通过使用root特权以root特权执行sudo命令
  • $-要求linux命令以常规non-privileged用户身份执行

介绍

docker_logoDocker是一个开源项目,旨在在内部提供软件containers。您可以将容器视为一种”package”,这是一个隔离的环境,与主机共享内核,并包含应用程序所需的所有内容。所有容器都使用images(它们的中央图像存储库是Dockerhub)。

在本教程中,我们将看到如何基于dockerized组件创建LAMP堆栈:遵循“每个容器一个服务”的理念,我们将使用docker-compose,用于整理容器成分的工具。

集装箱一项服务与多项服务

在每个容器中使用一项服务,而不是在同一容器中运行多个服务,有很多优点。例如,模块化(我们可以将容器重用于不同的目的),或者具有更好的可维护性:将重点放在特定的环境环境上而不是一次考虑所有环境更容易。如果要尊重这一理念,则必须为LAMP堆栈的每个组件创建一个容器:一个用于apache-php,一个用于数据库。不同的容器必须能够相互交谈:为了轻松编排链接的容器,我们将使用docker-compose

初步步骤

在继续之前,我们需要安装dockerdocker-compose在我们的系统上:

# apt-get install docker docker-compose

这些软件包将在几秒钟内安装完毕,docker服务将自动启动。现在,我们可以为项目及其内部创建一个目录,另一个目录用于保存将由Apache服务的页面。 DocumentRoot将是一个有意义的名称。在这种情况下,唯一可以投放的页面是index.php

$ mkdir -p dockerized-lamp/DocumentRoot
$ echo "<?php phpinfo(); ?>" > dockerized-lamp/DocumentRoot/index.php

在这里,我们的代码仅包含在phpinfo函数:它的输出(一个页面,显示有关php的信息,如果您不知道的话)将默认为我们的服务器显示的内容。现在,让我们使用我们最喜欢的编辑器来创建docker-compose.yml我们的项目文件。



Php-apache

现在,我们可以开始提供有关如何构建容器并将其连接到docker-compose文件的说明。这是一个使用yaml句法。所有定义都必须提供到services部分。

version: '3'
services:
    php-apache:
        image: php:7.2.1-apache
        ports:
            - 80:80
        volumes:
            - ./DocumentRoot:/var/www/html
        links:
            - 'mariadb'

让我们看看我们在这里所做的事情。我们插入文件的第一行,version,指定我们要使用的docker-compose语法版本,在这种情况下为版本3,提供最新的主版本。在 – 的里面services部分,我们开始通过指定服务名称来描述我们的服务,php-apache(任意名称,您可以使用任意名称),然后说明构建它的说明。

image关键字让docker知道我们要用来构建容器的图像:在这种情况下,我使用了7.2.1-apache它将为我们提供php 7.2.1以及apache网络服务器。需要另一个php版本?您只需要从图像页面上提供的众多选项中进行选择dockerhub

我们提供的第二条指令是ports:我们告诉码头工人映射端口80在我们的主机上,到港口80在容器上:这种方式将在我们直接在系统上运行Web服务器时出现。

然后,我们使用volumes指定一个指令bind mount。由于在开发过程中代码变化很大且速度很快,因此将代码直接放在容器中是没有意义的:这样,我们每次进行一些修改时都应该重新构建它。相反,我们要做的是告诉docker bind-mountDocumentRoot目录,位于/var/www/html在容器内。这个目录代表主要的apacheVirtualHost文档根目录,因此我们放入其中的代码将立即可用。

最后,我们使用了link关键字指定mariadb作为其论据。看起来似乎不需要此关键字来在两个容器之间创建连接:即使不指定它,mariadb服务可以从为该容器建造的容器内部到达apache-php服务,方法是将其名称用作主机名。关键字有两件事:首先让我们选择指定一个alias我们可以使用它的名称来引用服务。因此,例如,通过编写:

link:
    mariadb:database-service

该服务也可以使用database-service。第二件事link确实是指定依赖项:在这种情况下,php-apache服务将被视为依赖于mariadb一种,因此在构建或启动环境时,后者将在前者之前启动。



安装PHP扩展

默认的php-apache dockerfile不包含某些php扩展名,例如mysqli或pdo。要安装它们,我们必须基于该文件构建自己的dockerfile。为此,我们在项目内部创建一个名为php-apache的目录(这将是我们build context)及其内部的dockerfile。将以下代码粘贴并保存为php-apache /Dockerfile:


FROM php:7.2.1-apache
MAINTAINER egidio docile
RUN docker-php-ext-install pdo pdo_mysql mysqli

如您所见,FROM指令,我们指定此dockerfile应基于默认文件。然后我们加入了RUN说明:使用图片本身提供的脚本,docker-php-ext-install,其中包括使用pdo和mysqli所需的扩展。在这一点上,如果要使用自定义泊坞文件,则必须在docker-compose.yml中稍微更改php-apache部分,方法是:

version: '3'
services:
    php-apache:
        build:
            context: ./php-apache
        ports:
            -  80:80
        volumes:
            - ./DocumentRoot:/var/www/html
        links:
            - 'mariadb'

有什么变化?我们没有直接指定要使用的远程映像,而是提供了context指令,在build部分,以便我们将自动使用包含在我们创建的目录中且此处作为参数提供的dockerfile。构建镜像时,上下文目录由docker守护进程导入,因此,如果我们要添加其他文件,则必须将它们也放置在该目录中。

数据库服务

LAMP环境的重要部分中的数据库,用于持久性。在这种情况下,我们将使用mariadb

mariadb:
    image: mariadb:10.1
    volumes:
        - mariadb:/var/lib/mysql
    environment:
        TZ: "Europe/Rome"
        MYSQL_ALLOW_EMPTY_PASSWORD: "no"
        MYSQL_ROOT_PASSWORD: "rootpwd"
        MYSQL_USER: 'testuser'
        MYSQL_PASSWORD: 'testpassword'
        MYSQL_DATABASE: 'testdb'

我们已经知道image关键字是。同样的volumes指令,除了这次我们没有声明bind mount,相反,我们引用了一个named volume,以获得持久性。重要的是暂时关注一下两者之间的差异。

如前所述,bind mount这是将主机目录挂载到容器中的一种快速方法,以便可以从受限环境内部访问该目录中包含的文件:指定绑定挂载,short syntax是:

<host_path>:<mountpoint_inside_the_container>

主机路径可以是相对路径(相对于docker-compose文件),也可以是绝对路径,而容器内的安装点必须以绝对形式指定。

一种named volume有所不同:这是适当的docker volume用于持久性,通常比绑定安装更可取,因为它不依赖于主机文件结构(容器的许多优点之一就是其可移植性)。用于引用a的语法named volume服务定义中的内容是:

<volume_name>:<mountpoint_inside_container>

一种named volume生命周期独立于使用它的容器的生命周期,并且必须在volumes我们将在稍后看到docker-compose文件的“部分”。

现在回到服务的定义。我们使用的最后一个关键字是environment:它允许我们设置一些环境变量,这些变量会影响服务的行为。首先我们用TZ指定我们的数据库时区:在这种情况下,我使用了”Europe/Rome”。其他变量的名称说明了它们的用途:通过使用它们,我们将重要的详细信息设置为要创建的默认数据库(testdb)的名称,要创建的用户及其密码。我们还设置了root用户密码,并决定不允许使用空密码。



卷部分

在本节中,我们必须声明named volume我们从mariadb服务器定义:

volumes:
    mariadb:

最后,这是我们文件的整体外观:

version: '3'
services:
    php-apache:
        image: php:7.2.1-apache
        ports:
            - 80:80
        volumes:
            - ./DocumentRoot:/var/www/html:z
        links:
            - 'mariadb'

    mariadb:
        image: mariadb:10.1
        volumes:
            - mariadb:/var/lib/mysql
        environment:
            TZ: "Europe/Rome"
            MYSQL_ALLOW_EMPTY_PASSWORD: "no"
            MYSQL_ROOT_PASSWORD: "rootpwd"
            MYSQL_USER: 'testuser'
            MYSQL_PASSWORD: 'testpassword'
            MYSQL_DATABASE: 'testdb'

volumes:
    mariadb:

尊重缩进以正确解释文件确实很重要。

让我们建立环境

在为我们的服务指定了所有说明后,我们可以使用docker-compose up命令来建立它们。该命令必须在与docker-compose.yml文件位于:

# docker-compose up

几分钟,我们就可以开始了。最后,如果一切顺利,请导航至localhost在主机上,我们将看到放入其中的php脚本的输出DocumentRoot

phpinfo-output

现在可以使用我们的灯泡环境了。

总结思想

我们已经看到了如何创建一个基本的LAMP环境,使用docker并协调容器和服务docker-compose。我们使用的设置专注于开发,可以进一步扩展和调整以适应不同的需求:Docker文档,这是一个非常好的书面资料,您可以参考它来扩展Docker知识。如有任何疑问或疑问,请随时发表评论。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/7734.html,未经允许,请勿转载。