2016-07-15 154 views
1

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

我如何可以做到这一点我是经历在泊坞一些码头,我看到了,我可以有一个码头工人的图像,如:

  • Ubuntu的
  • PHP
  • 的Nginx - >正如我了解它就像一个Apache服务器,所以理论上它会处理所有的请求和响应。

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

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

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

问题2: 我该如何构建DockerFile,它是什么?

+0

你最好打赌的是通过一些教程来工作,并回到这里带着你遇到的具体问题或问题。请参阅:https://docs.docker.com/engine/getstarted/和其他地方。 – ldg

回答

3

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

关于码头工人通常的口头禅是“每个容器中的一个过程”,并与它一起工作了几个月之后,我觉得这是很好的建议,即使它并不总是可以实现的。对于PHP应用程序,无论是交响乐,蛋糕,Laravel,Wordpress等等,这都是我的方式。我使用apache,听起来你可能更熟悉apache。如果需要,你可以很容易地用官方的nginx容器替换我的例子。

  • 一个容器中运行PHP-FPM
  • 一个容器中运行的Apache(httpd的)
  • 如果你需要一个数据库,为MySQL
  • 可选的,作曲家的容器一个容器。
  • 搬运工-组成编排所有这些容器

我通常使用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对象告诉容器有一个域名为“fpm”的另一个容器,并且docker知道如何解析该名称,所以任何与fpm服务器的通信都可以使用该名称。我们必须在httpd容器中装入(在卷下)apache配置。它看起来像默认的配置,但这个部分加入到容纳PHP-FPM:

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

这告诉Apache对于PHP文件请求转发到服务器FPM和服务的结果。

ports条目导致容器的端口80被转发到码头工机器的端口80。这是linux上的本地主机,或者Mac和Windows上的docker-machine ip。你可以用控制台命令docker-machine ip找到这个IP地址。

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

对于fpm我们有links,如果需要与数据库交谈。在这种情况下,数据库的主机名只是“数据库”。

logging项目不是必需的,只是个人偏好让日志输出变得过度。

将所有这些设置好后,您就可以用docker-compose up调出环境。如果您想查看容器的外观,可以在运行容器上使用docker-compose exec fpm bash获得外壳,将“fpm”替换为您要查看的容器的名称。需要注意的是容器必须包含bash二进制文件。所有这些在这里都有,但有些容器没有。

我希望这给出了足够的PHP特定的示例来帮助您围绕Docker类型的作品进行包装。我会建议重新阅读Docker和Docker Compose的文档。如果您有兴趣构建自己的容器,我还建议阅读Dockerfiles官方图片。 The docs有链接到Docker团队认为是示例的Dockerfiles。

+0

不能要求更好的答案非常感谢你的时间。 – John