1

説明ドッカーApacheとnginxのポートの競合

異なるオペレーティングシステムを実行しているいくつかのマシンで開発しているので、使用しているマシンでプロジェクトを実行できるように、ドッカーを使用することに決めました。

私はそのサーバ次のようにAPIとWebサイトをリバースプロキシとしてnginxのを持ってしようとしています:

1)example.com - )>ウェブサイト

2 api.example.com - > API

しかし、私が公開していなくてもApacheは自動的にポート80を割り当てているようです。これはnginxとの衝突を引き起こし、同じボックスでも実行されます。 apache/phpがホストのポート80に自動的にバインドされないようにする方法はありますか?

私はポートを別のポートにマップしようとしましたが、これはapache/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の

dockerfile私は、ホストのポート80への結合からのApache/PHPを防ぐにはどうすればよい
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; 
    } 
    } 
} 

私はコンテナ間の接続のためのポートを維持したいですが、私はポートがホストに公開されないようにしたいと思います。

nginxのポート80のみを公開したいと思います。

私はこれをハックとみなしてports.configファイルを変更することで、別のポートを聞くようにApacheの設定を変更できることに注意してください。しかし、私はこのようにしたくありません。可能であればドッカーを使って修正をしたい。

ドッカーの作成ファイルで指定しないと、ポートが公開されていない理由はわかりません。

+1

あなたのドッカーの作成ファイル_explicitly_はポート80を公開します –

+0

@Dan Farrellはいnginxの場合はそうです。しかし、ポートがすでにApache/PHP(ウェブサイト)によって占有されているため、nginxは実行されません。 – thedethfox

+0

は、誤って書式設定されたyamlですか? –

答えて

1

https://docs.docker.com/compose/compose-file/#/portsは、ホストポートが最初に来ると説明しています。あなたはapginのnginx のポート80を明示的に公開しています。 nginxの場合は、ホスト80としてコンテナ80を公開し、ポート80としてApacheコンテナ800に公開しています。

おそらく番号が逆になっている可能性があります。

+0

確かにそれは回避策でした。数字が逆転したようです。ただしこれは、ホストのポート80に代わってポート800にバインドするのを防ぐだけですが、これはホストのポート80に自動的にフックする理由を説明していません。明示的に説明がない場合は、コンテナがホストのポート80に自分自身を接続している理由について答えることはできません。 – thedethfox

+2

ポート80に自動的には接続しません。両方とも、ドッカー作成でホストのポート80に明示的にバインドされています。デフォルトでは、開いているポートは全くマッピングされていません。 –

関連する問題