Docker容器:它们如何协同工作?

时间:2016-07-13 18:11:14

标签: nginx docker yii2 docker-compose alpine

我已经开始使用docker并构建了一个工作示例,如https://codeable.io/wordpress-developers-intro-docker中所示。我需要一个非常小的docker容器,因为部署将在emebedded系统上。

但我不清楚它是如何组合在一起的。

有两个Dockerfiles,一个用于Nginx:

FROM nginx:1.9-alpine
COPY nginx.conf /etc/nginx/conf.d/default.conf

nginx.conf定义为:

server {
  server_name _;
  listen 80 default_server;

  root   /var/www/html;
  index  index.php index.html;

  access_log /dev/stdout;
  error_log /dev/stdout info;

  location / {
    try_files $uri $uri/ /index.php?$args;
  }

  location ~ .php$ {
    include fastcgi_params;
    fastcgi_pass my-php:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }
}

另一个Dockerfuile适用于PHP:

Dockerfile.php-fpm:
FROM php:7.0.6-fpm-alpine
RUN docker-php-ext-install -j$(grep -c ^processor /proc/cpuinfo 2>/dev/null || 1) \
    iconv gd mbstring fileinfo curl xmlreader xmlwriter spl ftp mysqli
VOLUME /var/www/html

最后,所有内容都汇集在一个docker-compose.yml:

version: '2'
services:
  my-nginx:
    build: .
    volumes:
      - .:/var/www/html
    ports:
      - "8080:80"
    links:
      - my-php
  my-php:
    build:
      context: .
      dockerfile: Dockerfile.php-fpm
    volumes:
      - .:/var/www/html
    ports:
      - "9000:9000"

使用

启动docker容器
$ docker-compose build
$ docker-compose up

一切正常 - 这是一种魔力!

以下是(部分)我的问题,以了解正在发生的事情:

  • nginx-container如何了解php-container?
  • 从nginx调用PHP时,哪个容器执行 PHP进程运行?
  • 如何将数据从nginx传递到PHP并返回?
  • 这个docker用法(简单的3个容器) web服务器应用程序)使用docker或的正确方法 这是一个过度的容器吗?
  • 如何扩展此docker架构以进行增加 加载?我可以用它来制作吗?
  • 容器在主机上使用相同的卷(./)。 当使用PHP框架作为Yii2时,不会更好 将卷移动到PHP或Nginx容器?

1 个答案:

答案 0 :(得分:3)

  • nginx-container如何了解php-container?
  

links下,您列出了my-php容器,除此之外,还会在/etc/hosts文件中创建容器名称与其IP之间的映射。

  • 从nginx调用PHP时,PHP进程在哪个容器中运行?
  

正如您所料,任何php代码都将在my-php容器中运行,这在nginx配置文件中定义,该文件将请求处理传递给{{1}引擎在php上运行。

  • 如何将数据从nginx传递到PHP并返回?
  

通过常规套接字通信。两个码头工人都有自己的地址,并且可以像连接到网络的任何其他计算机一样相互通信。

  • 这个docker用法(3个容器用于简单的Web服务器应用程序)是否是使用docker的正确方法,或者这是一个过度的容器吗?
  

我这里只看到2个容器。有些人会说容器应该只运行一个进程(就像这里,所以你已经建立了最小的系统),并且有些人说每个容器应该运行任何服务需要。 (但这是一个偏好问题,对此事有不同意见)

  • 如何扩展此docker架构以增加负载?我可以用它来制作吗?
  

是的,您可以将它用于生产。它可以轻松扩展,但为了达到规模,您缺少一些部分来平衡负载。 (例如,负载均衡器可以向不已经忙碌的实例发送新请求。一个非常常见的工具是HAProxy

  • 容器在主机上使用相同的卷(./)。当使用PHP框架作为Yii2时,将卷移动到PHP或Nginx容器会不会更好?
  

由于PHP容器在这种情况下执行所有处理,因此仅在my-php:9000上安装卷应该是安全的。