轻松搞定|将 PHP 和 Couchbase 应用部署为 Docker - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dataman
V2EX    推广

轻松搞定|将 PHP 和 Couchbase 应用部署为 Docker

  •  
  •   dataman 2017-07-10 16:49:00 +08:00 2658 次点击
    这是一个创建于 3065 天前的主题,其中的信息可能已经有所发展或是发生改变。

    image

    数人云之前分享了《如何用 Docker 实现 PHP 命令行程序的 CI/CD 》,详细地介绍了整体过程中的思路以及以及注意事项,今天带来的文章将阐述怎样部署一个 PHP 应用容器,并且与后端 Couchbase Server 容器进行通信。

    本篇文章讲述如何创建一个自动提供的 Couchbase 节点和简化 PHP 应用程序读取写入 Couchbase NoSQ 数据库。

    首先定义代表两个容器的项目结构:

    root -- couchbase -- -- configure.sh -- -- Dockerfile -- php -- -- application -- -- -- index.php -- -- configuration -- -- -- php.ini -- -- Dockerfile -- docker-compose.yml 

    每个容器都有包含自身构建镜像步骤对应的 Dockerfile 文件,docker-compose.yml将使用定义好的端口和环境变量信息构建和部署容器。

    每个容器都有包含自身构建镜像步骤对应的 Dockerfile 文件,docker-compose.yml 将使用定义好的端口和环境变量信息构建和部署容器。

    PHP 应用程序容器化

    本文是 PHP 容器化教程,首先构建简单的 PHP 应用程序并对其进行容器化,因为要自动化部署,所以在本地存储 php.ini 文件,并在构建过程中复制。

    在此之前,为index.php文件中添加一些代码:

    <?php header("Content-Type: application/json"); $cluster = new CouchbaseCluster("couchbase://" . getenv("COUCHBASE_HOST")); $bucket = $cluster->openBucket(getenv("COUCHBASE_BUCKET_NAME"), getenv("COUCHBASE_BUCKET_PASSWORD")); try { $result = $bucket->get("nraboy"); } catch (CouchbaseException $e) { $bucket->insert("nraboy", array( "name" => "Nic Raboy", "social_media" => array( "twitter" => "https://www.twitter.com/nraboy", "website" => "https://www.thepolyglotdeveloper.com" ) )); $result = $bucket->get("nraboy"); } echo json_encode($result->value); ?> 

    所有打印数据都将是 JSON 格式,与 Couchbase 集群建立一个连接,并在该集群中打开一个特定的 Bucket,稍后使用环境变量来定义集群名和 Bucket,将在部署过程中进行设置。

    应用程序连接 Couchbase 并且成功打开 Bucket,尝试通过 Couchbase 读取文档。若该文档不存在,将会创建并读取该文档,所获文档会被打印出来。

    这是一个简单的应用,现在可以专注于应用程序的 Docker 方面。

    打开 Dockerfile 文件,内容如下:

    FROM php:5.6.30-apache RUN apt-get update RUN apt-get install -y wget lsb-release RUN wget http://packages.couchbase.com/releases/couchbase-release/couchbase-release-1.0-2-amd64.deb RUN dpkg -i couchbase-release-1.0-2-amd64.deb RUN rm couchbase-release-1.0-2-amd64.deb RUN apt-get update RUN apt-get install -y libcouchbase-dev build-essential php5-dev zlib1g-dev RUN pecl install pcs-1.3.3 RUN pecl install couchbase WORKDIR /var/www/html COPY ./configuration/php.ini /usr/local/etc/php/ COPY ./application/ /var/www/html/ RUN chown www-data:www-data . -R 

    将使用 Apache 镜像,如果曾经使用过 PHP 和 Couchbase,下面看起来会很熟悉,所有依赖关系都是直接从 Couchbase 官方 SDK 文档中获取,RUN 命令表示依赖关系将在构建时收集安装,而非运行过程中。

    依赖安装完成后,把php.ini文件以及index.php文件复制到构建镜像的过程中去。首先从php.ini文件这一步:

    最好是从官方的 PHP GitHub 仓库下载php.ini文件,而非粘贴一冗长的配置文件。扩展唯一要做的改变,根据 Couchbase SDK 文档 找到扩展部分,在 php.ini 文件中添加一行 extension=couchbase.so

    此时,可以构建 PHP 映像,并将其部署为容器。但我们多做一些:创建一个 Compose 文件。

    打开docker-compose.yml文件内容如下:

    version: '2' services: couchbase: build: ./couchbase ports: - 8091:8091 - 8092:8092 - 8093:8093 environment: - COUCHBASE_ADMINISTRATOR_USERNAME=Administrator - COUCHBASE_ADMINISTRATOR_PASSWORD=password - COUCHBASE_BUCKET=default - COUCHBASE_BUCKET_PASSWORD= php: build: ./php ports: - 8080:80 environment: - COUCHBASE_HOST=couchbase - COUCHBASE_BUCKET_NAME=default - COUCHBASE_BUCKET_PASSWORD= restart: always 

    这里包括了另外一个名为 Couchbase 的服务,使用了一系列端口映射环境变量的。此处有一些重要的注意事项,COUCHBASE_HOST在 PHP 服务的设置,Key 对应的值必须与数据库的服务名称 Couchbase 相匹配。

    使用 Docker 部署上述容器

    基础工作完成,是时候开始部署两个容器了,开始创建一系列有用的微服务。是时候开始部署两个容器了,这样就能创建一系列有用的微服务。

    从 Docker CLI 执行以下操作:

    docker-compose run -d --service-ports --name couchbase couchbase docker-compose run -d --service-ports --name php php 

    以上命令将使用 Compose 文件中定义的端口,构建对应镜像和部署成为容器。从 Web 浏览器,ht****tp:// localhost:8091 可以转到 Couchbase Server 仪表板,http:// localhost:8080 可以进入 PHP 应用程序。

    成功后,即可看到保存在数据库中并显示在屏幕上的信息。

    结论

    以上是部署一个 PHP 应用容器并且与后端的 Couchbase Server 容器进行通信的过程,虽然选择的应用很简单,但方法可以很容易地推广到任意 PHP 应用框架容器化和部署。

    5 条回复    2017-07-11 15:42:38 +08:00
    cxbig
        1
    cxbig  
       2017-07-11 14:28:48 +08:00 via Android
    写这么多 run 和 copy,layer 太散,最佳实践都是尽量少用
    php.ini 这类配置文件应该运行时挂进去,不然改一个参数就要重新 build 太麻烦
    安全考虑我不会把整个项目文件夹权限都给 www-data,只给日志等文件夹写入权限
    你这两个不同的容器用同一个 Dockerfile ?那有什么必要 build 两次?而且 image 名字和版本也不标注,重用很麻烦
    extreme
        2
    extreme  
       2017-07-11 14:43:30 +08:00


    无聊

    天天是你置顶,天天置顶这样的东西。
    Dart
        3
    Dart  
       2017-07-11 15:35:39 +08:00 via Android
    @cxbig 你敢质疑数人云?难道你是 daocloud ?哈哈哈
    dataman
        4
    dataman  
    OP
       2017-07-11 15:42:00 +08:00
    @Dart 没有没有~表达观点挺好的~大家都是在互相学习~
    dataman
        5
    dataman  
    OP
       2017-07-11 15:42:38 +08:00
    @cxbig 从你评论镜像的 layer 太散(太多)这点,可以看出,你已经跨过了容器入门的门槛. 我们只是按原文翻译过来。
    最佳实践如在 Dockerfile 中合并 run 命令, 镜像加 tag 并且 push 到镜像仓库, 挂载配置文件等,
    在我们平常工作和为企业服务当中一直在遵循。
    欢迎更多业界人士一同来交流~
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     942 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 18:10 PVG 02:10 LAX 10:10 JFK 13:10
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86