簡體   English   中英

Docker容器中的Symfony環境

[英]Symfony environment in Docker container

我想從Docker容器中運行我的Symfony3應用程序。 據我所知,我可以使用docker安裝/創建多個圖像,並將它們旋轉到一個容納我的應用程序的容器中。

我一直在Docker的一些碼頭上看看我是怎么做到的,我看到我可以有一個碼頭圖像,例如:

  • Ubuntu的
  • PHP
  • Nginx - >據我所知,它就像一台Apache服務器,理論上它將處理所有的請求和響應。

但我仍然覺得很難理解將多個圖像旋轉到一個容器中的概念。

我還看到了一個名為DockerFile的東西,它顯然可以將我的開發環境構建到一個我也可以使用的容器中。

問題1:有人可以澄清整個過程我仍然覺得很難繞過它。

問題2:如何構建DockerFile以及它是什么?

您不希望將多個圖像旋轉到一個容器中。 您可能甚至不需要docker文件(但對於PHP,您可能會這樣做)。

關於碼頭工人的常見口號是“每個容器一個過程”,在使用它幾個月后,我發現這是一個很好的建議,即使它並不總是可以實現。 對於PHP應用程序,無論是交響樂,蛋糕,Laravel,Wordpress等等,我都是這樣做的。 我使用apache,聽起來你也可能更熟悉apache。 如果需要,您可以輕松替換官方nginx容器,並對我的示例進行微小更改。

  • 一個容器運行PHP-FPM
  • 一個容器運行Apache(httpd)
  • 如果你需要一個數據庫,一個容器用於mysql
  • 可選地,用於作曲家的容器。
  • docker-compose來編排所有這些容器

我通常使用官方的httpd容器官方的mysql容器 ,並按照描述包含我需要的mod的官方php fpm容器 下面是一個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文件中引用它。

告訴這些容器如何相互通信的基本撰寫文件可能如下所示:

泊塢窗,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被轉發到docker機器的端口80。 這是linux上的localhost,或Mac和Windows上的docker-machine ip。 你可以使用console命令docker-machine ip找到這個docker-machine ip

我們在mysql容器上做同樣的事情,以便我們使用Mysql Workbench之類的工具直接訪問mysql。 您可以閱讀官方mysql容器允許的環境變量及其功能。

如果需要與數據庫通信,我們有fpm的links 在這種情況下,數據庫的主機名只是“數據庫”。

logging項不是必需的,只是個人偏好以保持日志輸出變得過多。

一旦掌握了所有這些,就可以通過docker-compose up環境。 如果你想看看容器的樣子,你可以在一個正在運行的容器上使用docker-compose exec fpm bash獲取一個shell,用你要查看的容器名稱替換“fpm”。 這里需要注意的是容器實際上必須包含bash二進制文件。 所有這些都在這里,但有些容器沒有。

我希望這能提供足夠的特定於php的示例來幫助您了解docker類型的工作方式。 我建議重新閱讀文檔,以免困擾Docker和Docker Compose。 如果您有興趣構建自己的容器,我還建議您閱讀Dockerfiles以獲取官方圖片。 這些文檔具有Docker團隊認為具有示范性的Dockerfiles鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM