Docker容器中的Symfony环境

时间:2016-07-15 14:57:40

标签: php nginx docker

我想从Docker容器中运行我的Symfony3应用程序。据我所知,我可以使用docker安装/创建多个图像,并将它们旋转到一个容纳我的应用程序的容器中。

我在Docker上经历了一些关于如何做到这一点的码头,我看到我可以有一个码头图像,如:

  • Ubuntu的
  • PHP
  • Nginx - >据我所知,它就像一个Apache服务器,理论上它将处理所有的请求和响应。

但我仍然觉得很难理解将多个图像旋转到一个容器中的概念。

此外,我看到了一个名为DockerFile的东西,它显然可以将我的开发环境构建到一个我也可以使用的容器中。

问题1: 有人可以澄清整个过程我仍然觉得很难把它包围起来。

问题2: 我如何构建DockerFile以及它是什么?

1 个答案:

答案 0 :(得分:3)

您不想将多个图像旋转到一个容器中。您可能甚至不需要docker文件(但对于PHP,您可能会这样做。)

关于码头工人的常见口头禅是每个容器的一个过程"并且在使用它几个月后,我发现这是一个很好的建议,即使它并不总是可以实现。对于PHP应用程序,无论是它的交响乐,Cake,Laravel,Wordpress等等,我都是这样做的。我使用apache,听起来你也可能更熟悉apache。如果需要,您可以轻松替换官方nginx容器,对我的示例进行微小更改。

  • 一个容器运行PHP-FPM
  • 一个容器运行Apache(httpd)
  • 如果你需要一个数据库,一个容器用于mysql
  • 可选地,作曲家的容器。
  • docker-compose来编排所有这些容器

我通常使用official httpd containerthe official mysql container,并按照描述扩展offical php fpm container以包含我需要的模组。下面是一个PHP-FPM dockerfile的示例,它添加了一些您的应用可能需要的外部库:

FROM php:5.5-fpm

RUN apt-get update && apt-get install -y \
    php5-mysql \
    php5-curl \
    php5-common \
    php5-gd \
    php5-imagick \
    php5-intl \
    php5-dev \
    php5-sqlite \
    php5-xdebug \
    php5-memcached \
    \
    libmemcached-dev \
    libmcrypt-dev \
    libfreetype6-dev \
    libxml2-dev \
    libmagickwand-dev \
    libjpeg62-turbo-dev \
    libpng-dev && \
    \
    docker-php-ext-install pdo pdo_mysql && \
    docker-php-ext-install soap && \
    docker-php-ext-configure gd --with-jpeg-dir=/usr/include/ && \
    docker-php-ext-install gd && \
    docker-php-ext-install iconv mcrypt && \
    \
    pecl install imagick && \
    docker-php-ext-enable imagick && \
    pecl install memcached  && \
    docker-php-ext-enable memcached && \
    \
    pecl install xdebug && \
    docker-php-ext-enable xdebug && \
    \
    mkdir -p /app/content && \
    mkdir -p /app/usr/local/apache2 && \
    cd /app/usr/local/apache2 && \
    ln -s ../../../content htdocs

COPY copy/xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini

这构建了一个我实际用于开发的图像。除了安装依赖项之外,它还复制xdebug的配置,并设置文件夹结构以保存我的应用程序。

您可以像这样构建此容器:

docker build -f nameoffile.Dockerfile -t myhubaccount/myphpcontainer \ ./path/to/folder/where/dockerfile/is

这会在您的机器上构建标记为myhubaccount/myphpcontainer的图像,您可以在撰写文件中引用它。

告诉这些容器如何相互通信的基本撰写文件可能如下所示:

<强>搬运工-compose.yml

version: '2'

services:
  httpd:
    image: httpd:latest
    volumes:
      - ./docker_conf/httpd.conf:/usr/local/apache2/conf/httpd.conf
      - ./webroot:/usr/local/apache2/htdocs
    ports:
      - "80:80"
    links:
      - fpm
    logging:
      options:
        max-size: "0"

database:
  image: mysql
  ports:
    - "3306:3306"
  volumes:
    - ./schema.sql:/docker-entrypoint-initdb.d/schema.sql
  environment:
    MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
    MYSQL_DATABASE: development
  logging:
    options:
      max-size: "5k"

fpm:
  image: myhubaccount/myphpcontainer
  volumes:
    - ./webroot:/app/content
  links:
     - database
  logging:
    options:
      max-size: "50k"

我认为突出显示此文件的几个部分是有益的。首先,对于php-fpm,你需要设置apache来与fpm服务器通信。 httpd下的links对象告诉容器有另一个域名为&#34; fpm&#34;的容器,而docker知道如何解析该名称,因此与fpm服务器的任何通信都可以使用名称。我们必须在httpd容器中挂载(在卷下)apache配置。它看起来像默认配置,但添加了这部分以适应php-fpm:

ProxyTimeout 30
<FilesMatch ".*\.php$">
    SetHandler "proxy:fcgi://fpm:9000"
</FilesMatch>

这告诉apache将对php文件的请求转发到fpm服务器并提供结果。

ports条目导致容器的端口80被转发到docker机器的端口80。这是linux上的localhost,或Mac和Windows上的docker-machine ip。您可以使用控制台命令docker-machine ip找到此IP。

我们在mysql容器上做同样的事情,以便我们使用像Mysql Workbench这样的工具直接访问mysql。您可以阅读官方mysql容器允许的环境变量以及它们的用途。

如果需要与数据库通信,我们对fpm有links。在这种情况下,数据库的主机名只是&#34;数据库&#34;。

logging项不是必需的,只是个人偏好以防止日志输出过多。

完成所有这些后,您可以使用docker-compose up调出环境。如果你想看一下容器的样子,你可以在docker-compose exec fpm bash的正在运行的容器上获得一个shell,代替&#34; fpm&#34;使用您要查看的容器的名称。这里需要注意的是容器实际上必须包含bash二进制文件。所有这些都在这里,但有些容器没有。

我希望这能提供足够的特定于php的示例来帮助您了解docker类型的工作方式。我建议重新阅读文档,以免困扰Docker和Docker Compose。如果您有兴趣构建自己的容器,我还建议您阅读Dockerfiles以获取官方图片。 The docs具有Docker团队认为具有示范性的Dockerfiles链接。