1

설명도커 아파치와 Nginx의 포트 충돌

나는 다음과 같은 구성으로 프로젝트가 있습니다

1) 주요 웹 사이트가 PHP

2)에 기록 된 API는 NodeJS에 기록됩니다

다른 운영 체제를 실행하는 여러 컴퓨터에서 개발되었으므로 사용중인 컴퓨터에서 프로젝트를 실행할 수 있도록 도커를 사용하기로 결정했습니다.

나는 리버스 프록시로 nginx를가하려고하는 서버 API를 다음과 같은 방식으로 웹 사이트 :

1) example.com -> 웹 사이트

2) api.example.com를 -> API

그러나 노출되지 않은 경우에도 Apache가 자동으로 포트 80을 할당하는 것으로 보입니다. 이것은 동일한 상자에서 실행되는 nginx와 충돌을 일으 킵니다. 아파치/PHP가 자동으로 호스트의 포트 80에 바인딩되는 것을 막을 수있는 방법이 있습니까?

다른 포트로 포트를 매핑하려고했지만 아파치/PHP가 볼 수있는 것처럼 추가 포트를 추가하게 만들었습니다. 여기 아래 :

docker ps 
CONTAINER ID  IMAGE    COMMAND     CREATED      STATUS    PORTS       NAMES 
fc830d3562e4  apache_website "docker-php-entrypoin" 3 seconds ago  Up 2 seconds  80/tcp, 0.0.0.0:80->8000/tcp  apache_website_run_7 

고정 표시기-파일 작성

version: '2' 
services: 
    nginx: 
    build: nginx 
    ports: 
    - "80:80" 
    expose: 
     - "80" 
    restart: always 
    depends_on: 
    - website 
    - api 
    api:  
    image: node 
    command: node /var/www/index.js 
    restart: always 
    website: 
    build: php:7.1-apache   
    ports: 
    - "80:800" 
    restart: unless-stopped 

의 nginx

0,123,516 dockerfile
FROM nginx 
    COPY nginx.conf /etc/nginx/nginx.conf 

    EXPOSE 80 

의 nginx 설정 파일

worker_processes 4; 

events { worker_connections 1024; } 

http { 
    include mime.types; 
    # fallback in case we can't determine a type 
    default_type application/octet-stream; 

    upstream example.com { 
    server website:80 fail_timeout=0; 
    } 

    server { 
    listen 80; 
    client_max_body_size 4G; 

    keepalive_timeout 5; 

    root /opt/app/public; 

    location/{ 
     try_files $uri @proxy_to_app; 
    } 

    server_name example.com; 

    location @proxy_to_app { 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

     proxy_set_header Host $http_host; 

     proxy_redirect off; 
     proxy_pass http://example.com; 
    } 

    error_page 500 502 503 504 /500.html; 
    location = /500.html { 
     root /opt/app/public; 
    } 
    } 

    # API 
    #======================================================================== 
    upstream api.example.com { 
    server api:80 fail_timeout=0; 
    } 
    server { 
    listen 80; 
    client_max_body_size 4G; 

    keepalive_timeout 5; 

    root /opt/app/public; 

    location/{ 
     try_files $uri @proxy_to_app; 
    } 

    server_name api.example.com; 

    location @proxy_to_app { 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $http_host; 
     proxy_redirect off; 


     proxy_pass http://api.example.com; 
    } 

    error_page 500 502 503 504 /500.html; 
    location = /500.html { 
     root /opt/app/public; 
    } 
    } 
} 

어떻게 호스트의 포트 80에 바인딩에서 아파치/PHP를 방지합니까? 컨테이너 간 연결을 위해 포트를 유지하고 싶지만 포트가 호스트에 노출되는 것을 원하지는 않습니다.

nginx에만 80 번 포트를 공개하고 싶습니다.

이 해킹을 고려하여 ports.config 파일을 변경하여 다른 포트를 수신 대기하도록 Apache의 구성을 변경할 수 있음을 알고 있습니다. 그러나 나는 이런 식으로하고 싶지 않다. 가능한 경우 고정 표시기를 사용하여 수정 작업을 수행하려고합니다.

docker-compose 파일에 포트를 지정하지 않은 이유는 무엇입니까?

+1

도커가 파일을 작성합니다. _explicitly_는 포트 80을 노출합니다. –

+0

@Dan Farrell 네, nginx에 해당합니다.그러나 포트가 이미 아파치/PHP (웹 사이트)에 의해 점유되어 있기 때문에 nginx가 실행되지 않습니다. – thedethfox

+0

은 실수로 yaml이 잘못 포맷 되었습니까? –

답변

1

https://docs.docker.com/compose/compose-file/#/ports은 호스트 포트가 처음이라고 설명합니다. 당신은 아파치 nginx 에 대한 포트 80을 노출 explicity이야. nginx의 경우 컨테이너 80을 호스트 80으로 표시하고 Apache 컨테이너 800의 경우 포트 80으로 표시합니다.

가능성이 반대로 번호가 있습니다.

+0

예, 그게 해결되었습니다. 숫자가 바뀌었던 것 같습니다. 그러나 이것은 아파치가 호스트의 포트 80에 바인딩하는 대신 포트 800에 바인딩하는 것을 방지합니다. 그러나 이것은 호스트의 포트 80에 자동으로 연결되는 이유를 설명하지 않습니다. 아무도 다른 사람이 내일 설명을하지 않으면 당신에게 질문을합니다 심지어 컨테이너가 호스트의 포트 80에 연결하는 이유는 무엇입니까? 대답하지 않습니다. – thedethfox

+2

포트 80에 자동으로 연결되지 않습니다. 둘 다 도커 작성의 호스트 포트 80에 명시 적으로 바인딩되어 있습니다. 기본적으로 열린 포트는 전혀 매핑되지 않습니다. –