首页 > 解决方案 > Symfony docker 配置中的两个服务

问题描述

我的目标是 docker 中的两个服务,它们有一个主机(或单独的端口,应该是更好的方法)和机会相互调用。目前,我在 symfony 上使用 twi 服务进行了简单配置,但在 nginx 上只有一个使用虚拟主机。第二项服务不可用。应该怎么样?

这就是我所拥有的

码头工人-compose.yml

version: '2'
services:
  php:
    build: ./docker/php/
    environment:
      TIMEZONE: Europe/Kiev
    volumes:
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini:ro
      - ./app:/var/www/app
    working_dir: /var/www/app
    ports:
      - 9002:9000

  sub_app:
    build: ./docker/php/
    environment:
      TIMEZONE: Europe/Kiev
    volumes:
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini:ro
      - ./sub_app:/var/www/sub_app
    working_dir: /var/www/sub_app
    ports:
      - 9001:9000

  webserver:
    image: nginx:1.11
    depends_on:
      - php
    volumes_from:
      - php
    volumes:
      - ./docker/nginx/app.conf:/etc/nginx/conf.d/default.conf:ro
    ports:
      - 8080:80

  composer:
    image: composer:1.4
    volumes_from:
      - php
    working_dir: /var/www/app

码头工人/nginx/app.conf

upstream php-upstream {
    server php:9000;
}

server {
    root /var/www/app/public;
    listen 80;
    server_tokens off;

    location / {
        try_files $uri @rewriteapp;
    }

    location @rewriteapp {
        rewrite ^(.*)$ /index.php/$1 last;
    }

    location ~ ^/index\.php(/|$) {
        fastcgi_pass php-upstream;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS off;
    }
}

和 docker/php/Dockerfile

FROM php:7.3-fpm

# Install recommended extensions for Symfony
RUN apt-get update && apt-get install -y \
        libicu-dev \
    && docker-php-ext-install \
        intl \
        opcache \
    && docker-php-ext-enable \
        intl \
        opcache

# Permission fix
RUN usermod -u 1000 www-data

以及我所拥有的 http://127.0.0.1:8080/-> 来自服务的 Symfony 欢迎页面php,来自目录app

http://127.0.0.1:9001/-> ERR_EMPTY_RESPONSE

http://127.0.0.1:9002/-> ERR_EMPTY_RESPONSE

码头工人撰写ps

码头工人撰写ps

                Name                              Command               State                Ports            
--------------------------------------------------------------------------------------------------------------
docker-test_composer_1_de8307ec4af2    /docker-entrypoint.sh composer   Exit 0                                
docker-test_php_1_2118a4e10353         docker-php-entrypoint php-fpm    Up       0.0.0.0:9002->9000/tcp       
docker-test_sub_app_1_3c473ac40c77     docker-php-entrypoint php-fpm    Up       0.0.0.0:9001->9000/tcp       
docker-test_webserver_1_b53daccf2f3a   nginx -g daemon off;             Up       443/tcp, 0.0.0.0:8080->80/tcp

当我检查谁许可端口时在本地电脑中

lsof -i :8080 -> empty
lsof -i :9001 -> empty
lsof -i :9002 -> empty

标签: phpdockersymfony

解决方案


您没有指定您尝试从哪里访问 service1 。所以,我会回答这两种情况:

  1. 来自主机,
  2. 从码头内部

假设您在 Windows 主机上安装了 docker。在 docker-compose 中为每个服务提供一个端口映射。例如。对于一个名为 service1 你做的服务

service1: 
     ports:
        -9001:9000

这里 9000 是您要映射的 service1 中的端口。此端口映射到主机窗口的端口 9001。现在您使用 -> 从 Windows 访问 service1localhost:9001

您可以使用 -> 从 docker 内的另一个服务访问 service1service1:9000

现在,要回答您的问题,您可以执行以下操作

service1:
    ports:
       -9001:9000

service2:
    ports:
       -9002:9000

从主机窗口访问 service1 ->localhost:9001

从主机窗口访问 service2 ->localhost:9002

从 docker 内部访问 service1 ->service1:9000

从 docker 内部访问 service2 ->service2:9000

编辑:

试试这个 docker-compose 文件:

version: '2'
services:
  service1:
    build: ./docker/php/
    environment:
      TIMEZONE: Europe/Kiev
    volumes:
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini:ro
      - ./service1:/var/www/service1
    working_dir: /var/www/service1
    ports: 
       -8080:80

  service2:
    build: ./docker/php/
    environment:
      TIMEZONE: Europe/Kiev
    volumes:
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini:ro
      - ./service2:/var/www/service2
    working_dir: /var/www/service2
    ports:
       -8081:80

  webserver:
    image: nginx:1.11
    depends_on:
      - service1
      - service2
    volumes_from:
      - service1
      - service2
volumes:
  - ./docker/nginx/service1.conf:/etc/nginx/sites-enabled/service1.conf:ro
  - ./docker/nginx/service2.conf:/etc/nginx/sites-enabled/service2.conf:ro


  composer_service1:
    image: composer:1.4
    volumes_from:
      - service1
    working_dir: /var/www/service1

  composer_service2:
    image: composer:1.4
    volumes_from:
      - service2
    working_dir: /var/www/service2

networks:
  service1:
  service2:

推荐阅读