4

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

但我不知道这是如何组合在一起的。

有两个 Dockerfile,一个用于 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 使用(一个简单的 Web 服务器应用程序的 3 个容器)是使用 docker 的正确方法还是容器的过度杀伤?
  • 如何扩展这个 docker 架构以增加负载?我可以将它用于生产吗?
  • 容器./在主机上使用相同的卷 ( )。当使用 PHP 框架作为 Yii2 时,将卷移动到 PHP 或 Nginx 容器不是更好吗?
4

1 回答 1

4
  • nginx-container 是如何知道 php-container 的?

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

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

如您所料,任何php代码都将在my-php容器中运行,这是在nginx配置文件中定义的,它将请求的处理传递给php运行在my-php:9000.

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

通过常规套接字通信。两个 docker 都有自己的地址,它们可以相互通信,就像连接到网络的任何其他计算机一样。

  • 这种 docker 使用(一个简单的 Web 服务器应用程序的 3 个容器)是使用 docker 的正确方法还是容器的过度杀伤?

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

  • 如何扩展这个 docker 架构以增加负载?我可以将它用于生产吗?

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

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

由于 PHP 容器在这种情况下完成了所有处理,因此仅将卷挂载在my-php.

于 2016-07-13T18:26:01.940 回答