我想从Docker容器中运行我的Symfony3应用程序。据我所知,我可以使用docker安装/创建多个图像,并将它们旋转到一个容纳我的应用程序的容器中。
我在Docker上经历了一些关于如何做到这一点的码头,我看到我可以有一个码头图像,如:
但我仍然觉得很难理解将多个图像旋转到一个容器中的概念。
此外,我看到了一个名为DockerFile的东西,它显然可以将我的开发环境构建到一个我也可以使用的容器中。
问题1: 有人可以澄清整个过程我仍然觉得很难把它包围起来。
问题2: 我如何构建DockerFile以及它是什么?
答案 0 :(得分:3)
您不想将多个图像旋转到一个容器中。您可能甚至不需要docker文件(但对于PHP,您可能会这样做。)
关于码头工人的常见口头禅是每个容器的一个过程"并且在使用它几个月后,我发现这是一个很好的建议,即使它并不总是可以实现。对于PHP应用程序,无论是它的交响乐,Cake,Laravel,Wordpress等等,我都是这样做的。我使用apache,听起来你也可能更熟悉apache。如果需要,您可以轻松替换官方nginx容器,对我的示例进行微小更改。
我通常使用official httpd container,the 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链接。