プロキシの方法 (コンテナ間で通信する方法)?
nginx のプロキシ機能を直接使用するだけです (関連機能は別途参照) ここで厄介なのは、Docker コンテナ間の通信です。
docker コンテナ間で通信するには主に 4 つの方法があります:
-コンテナ IP を介したアクセス: コンテナが再起動されると、IP が変更されます。
##- ホストの ip:port 経由でアクセスする: ホストの IP が変わると、各アプリケーションを変更したり、ポートをバインドしたりする必要があり、面倒です。#-リンクを介してリンクを確立します。相互に依存しすぎているため、メンテナンスに役立ちません。
#- カスタム ネットワーク: 同じブリッジ ネットワーク内のコンテナは相互にアクセスできます。 明らかに、関連するアプリケーションを同じネットワークにリンクするカスタム ネットワーク方法を選択します。この方法では、アプリケーションとアプリケーション、エージェントとプロキシの間に実際には依存関係がありません。保守が簡単なだけでなく、移行も簡単です。設定は面倒ではなく、通常のIPまたはドメイン名を対応するコンテナ名に置き換えるだけです。1. 統合ネットワーク
次に、最初に共有ブリッジ ネットワークを作成する必要があります:
docker network create proxy-network # 查看 docker network ls
2. プロキシサービス コンテナ
プロキシ専用の nginx サービス コンテナを作成します。proxy-nginx という名前で、ここでは docker-compose を使用して構築されます。その最終的なディレクトリ構造は次のとおりです:
proxy-nginx ├── docker-compose.yml ├── logs # 日志 │ └── error.log ├── nginx │ ├── dockerfile │ ├── nginx.conf │ └── startup.sh ├── sites # 被代理站点配置 │ ├── baipiaoquan.com.conf │ └── chaohuahui.com.conf └── ssl # 证书文件 └── baipiaoquan.com.pem一部のファイルは後続の実行プロセス中に生成されますが、構成中に必要なのは、必要なファイルとディレクトリを作成することだけです。 docker-compose.yml
version: "3" networks: default: external: name: proxy-network services: nginx: build: context: ./nginx volumes: - ./logs:/var/log/nginx - ./sites:/etc/nginx/sites-available - ./ssl:/etc/nginx/ssl ports: - "80:80" - "443:443"
外部ポート 80 と 443 をプロキシ サーバーにバインドすると、すべてのアプリケーションがここからアクセスできるようになります。
from nginx:alpine label maintainer="chuoke" copy nginx.conf /etc/nginx/ run apk update && apk upgrade && apk add --no-cache openssl && apk add --no-cache bash run set -x ; addgroup -g 82 -s www-data ; adduser -u 82 -d -s -g www-data www-data && exit 0 ; exit 1 add ./startup.sh /opt/startup.sh run sed -i 's/.//g' /opt/startup.sh cmd ["/bin/bash", "/opt/startup.sh"] expose 80 443
設定と制御を容易にするために、実行中のユーザー グループとユーザー www-data がここで作成され、この名前は nginx の設定で使用されます。
user www-data; worker_processes 4; pid /run/nginx.pid; daemon off; events { worker_connections 2048; multi_accept on; use epoll; } http { server_tokens off; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 15; types_hash_max_size 2048; client_max_body_size 20m; include /etc/nginx/mime.types; default_type application/octet-stream; access_log /dev/stdout; error_log /dev/stderr; gzip on; gzip_disable "msie6"; ssl_protocols tlsv1 tlsv1.1 tlsv1.2; ssl_ciphers 'ecdhe-ecdsa-chacha20-poly1305:ecdhe-rsa-chacha20-poly1305:ecdhe-ecdsa-aes128-gcm-sha256:ecdhe-rsa-aes128-gcm-sha256:ecdhe-ecdsa-aes256-gcm-sha384:ecdhe-rsa-aes256-gcm-sha384:dhe-rsa-aes128-gcm-sha256:dhe-rsa-aes256-gcm-sha384:ecdhe-ecdsa-aes128-sha256:ecdhe-rsa-aes128-sha256:ecdhe-ecdsa-aes128-sha:ecdhe-rsa-aes256-sha384:ecdhe-rsa-aes128-sha:ecdhe-ecdsa-aes256-sha384:ecdhe-ecdsa-aes256-sha:ecdhe-rsa-aes256-sha:dhe-rsa-aes128-sha256:dhe-rsa-aes128-sha:dhe-rsa-aes256-sha256:dhe-rsa-aes256-sha:ecdhe-ecdsa-des-cbc3-sha:ecdhe-rsa-des-cbc3-sha:edh-rsa-des-cbc3-sha:aes128-gcm-sha256:aes256-gcm-sha384:aes128-sha256:aes256-sha256:aes128-sha:aes256-sha:des-cbc3-sha:!dss'; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-available/*.conf; open_file_cache off; # disabled for issue 619 charset utf-8; }
nginx のデフォルトの内容をコピーするだけです。変更する必要があるのは、実行中のユーザー名です。ユーザー名は前の設定と一致している必要があることに注意してください。
#!/bin/bash # start crond in background crond -l 2 -b # start nginx in foreground nginx
これは、nginx プログラムを開始するために使用されます。コンテンツは、主に将来のコンテンツ拡張の便宜のために、現在比較的小規模です。
docker-compose up -d nginx
正常に docker-compose ps が起動するか確認します。正常に起動しない場合は、設定に誤りがないか確認します。
3. アプリケーションの追加
サイト https://baipiaoquan.com/ を追加します。
アプリケーション コンテナの構成
アプリケーションの作成には docker-compose も使用します。
baipiaoquan/ ├── docker-compose.yml ├── log │ └── nginx │ └── error.log ├── nginx │ ├── dockerfile │ ├── log │ ├── nginx.conf │ ├── sites │ │ └── baipiaoquan.com.conf │ ├── ssl │ │ ├── baipiaoquan.com.key │ │ ├── baipiaoquan.com.pem │ └── startup.sh └── php-fpm ├── dockerfile └── php.inidocker-compose.yml
version: '3' networks: proxy: external: name: ${proxy_network_name} backend: driver: ${networks_driver} services: php-fpm: build: context: ./php-fpm volumes: - ./php-fpm/php.ini:/usr/local/etc/php/php.ini - ${app_code_path_host}:${app_code_path_container}${app_code_container_flag} networks: - backend nginx: build: context: ./nginx args: - php_upstream_container=${nginx_php_upstream_container} - php_upstream_port=${nginx_php_upstream_port} volumes: - ${app_code_path_host}:${app_code_path_container}${app_code_container_flag} - ./log:/var/log/nginx - ./sites:/etc/nginx/sites-available - ./ssl:/etc/nginx/ssl container_name: ${compose_project_name}_nginx depends_on: - php-fpm networks: - proxy - backend調整を容易にするために、ここでは環境変数を使用します。 nginx のコンテナ名に注目してください。container_name: ${compose_project_name}_nginx。この値は重要であり、後続のプロキシで使用されます。 .env
# 宿主机中代码的位置 app_code_path_host=../ # 容器中代码的位置 app_code_path_container=/var/www # 这个是抄的 laradock app_code_container_flag=:cached # 选择机器上的存储路径。适用于所有储存系统 data_path_host=~/.baipiaoquan/data ### drivers ################################################ # all volumes driver volumes_driver=local # 网络驱动 networks_driver=bridge # 代理网络名称,这是前面创建的 proxy_network_name=proxy-network ### docker compose files ################################## # compose_file=docker-compose.yml # change the separator from : to ; on windows compose_path_separator=: # 项目名称 compose_project_name=baipiaoquan使用されるプロキシ ネットワーク名は、以前に作成した proxy-network です。
nginx のコンテナ名は、baipiaoquan_nginx になります。
nginx の dockerfile
このファイルは、前のファイルから直接取得して、PHP 関連の情報を追加できます。
from nginx:alpine copy nginx.conf /etc/nginx/ run apk update && apk upgrade && apk --update add logrotate && apk add --no-cache openssl && apk add --no-cache bash run set -x ; addgroup -g 82 -s www-data ; adduser -u 82 -d -s -g www-data www-data && exit 0 ; exit 1 arg php_upstream_container=php-fpm arg php_upstream_port=9000 # set upstream conf and remove the default conf run echo "upstream php-upstream { server ${php_upstream_container}:${php_upstream_port}; }" > /etc/nginx/conf.d/upstream.conf && rm /etc/nginx/conf.d/default.conf add ./startup.sh /opt/startup.sh run sed -i 's/.//g' /opt/startup.sh cmd ["/bin/bash", "/opt/startup.sh"] expose 80 443php-fpm の dockerfile
from php:7.3-fpm arg puid=1000 env puid ${puid} arg pgid=1000 env pgid ${pgid} run groupmod -o -g ${pgid} www-data && usermod -o -u ${puid} -g www-data www-data expose 9000 workdir /var/www cmd ["php-fpm"]
php.ini ファイルを忘れないでください。デフォルトを使用して、この関連構成を削除することもできます。
server { listen 80 default_server; # for https listen 443 ssl default_server; ssl_certificate /etc/nginx/ssl/3243258_baipiaoquan.com.pem; ssl_certificate_key /etc/nginx/ssl/3243258_baipiaoquan.com.key; ssl_session_timeout 5m; ssl_protocols tlsv1 tlsv1.1 tlsv1.2; ssl_ciphers ecdhe-rsa-aes128-gcm-sha256:high:!anull:!md5:!rc4:!dhe; ssl_prefer_server_ciphers on; add_header x-frame-options "sameorigin"; add_header x-xss-protection "1; mode=block"; add_header x-content-type-options "nosniff"; # localhost 一定要 server_name localhost baipiaoquan.com www.baipiaoquan.com; root /var/www/; # 这个和前面的配置保持一致 index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ .php$ { try_files $uri /index.php =404; fastcgi_pass php-upstream; # 这个是 nginx dockerfile 里配置的 fastcgi_index index.php; fastcgi_buffers 16 16k; fastcgi_buffer_size 32k; fastcgi_param script_filename $document_root$fastcgi_script_name; #fixes timeouts fastcgi_read_timeout 600; include fastcgi_params; } location ~ /.ht { deny all; } location /.well-known/acme-challenge/ { root /var/www/letsencrypt/; log_not_found off; } }
ここですべてを構成しましたが、実際には合理化でき、構成するだけで済みます。
アプリケーションの開始
この時点で、baipiaoquan.com のサービスを開始できます。baipiaoquan のディレクトリで実行します:
docker-compose up -d nginx予期せぬことが何も起こらなければ、アプリケーションは起動してサービスを受けられるはずです。コンテナーに入って localhost にアクセスしてテストし、結果が期待どおりかどうかを確認することもできます。次のようにテストしました。
docker-compose exec nginx wget localhost次に、返されたデータのサイズを確認し、状況に基づいて成功したかどうかを判断します。
次のコマンドを使用して、アプリケーションがプロキシ ネットワークに正常に接続されているかどうかを確認できます:
docker network inspect proxy-network
次のステップは、世界中の人々がこのアプリケーションにアクセスできるようにすることです。
プロキシ設定を nginx-proxy に追加します
注: 最初にアプリケーションを起動してからプロキシを起動する必要があります。そうしないと、nginx はアップストリーム エラーを見つけることができません。
# 我这配的仅支持 https,如果没要求,这个就不需要 server { listen 80; server_name baipiaoquan.com www.baipiaoquan.com; return 301 https://$host$request_uri; } server { # 如果是 http 就配置这个 # listen 80 default_server; # 如果是 https 就配置这个 listen 443 ssl; ssl_certificate /etc/nginx/ssl/3243258_baipiaoquan.com.pem; ssl_certificate_key /etc/nginx/ssl/3243258_baipiaoquan.com.key; ssl_session_timeout 5m; ssl_protocols tlsv1 tlsv1.1 tlsv1.2; ssl_ciphers ecdhe-rsa-aes128-gcm-sha256:ecdhe:ecdh:aes:high:!null:!anull:!md5:!adh:!rc4; ssl_prefer_server_ciphers on; server_name baipiaoquan.com www.baipiaoquan.com; add_header x-frame-options "sameorigin"; add_header x-xss-protection "1; mode=block"; add_header x-content-type-options "nosniff"; location / { proxy_set_header host $host; proxy_set_header x-real-ip $remote_addr; proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for; proxy_set_header x-forwarded-proto $scheme; proxy_set_header x-forwarded-host $host; proxy_set_header x-forwarded-port $server_port; proxy_pass http://baipiaoquan_nginx/; # 这个值就是应用 nginx 的容器名称 } }プロキシ サーバーをリロードします設定は、nginx-proxy ディレクトリで実行します:
# 先测试下配置文件,这步一定要执行成功 docker-compose exec nginx nginx -t # 如果提示成功,则重新加载,否则就按提示检查修改配置文件 docker-compose exec nginx nginx -s reloadちょっと待ってください。すべてがうまくいけば、世界中の人々がこの https://baipiaoquan.com/ Web サイトにアクセスできるようになります。 他のアプリケーションを追加する必要がある場合も、ロジックとプロセスは同じになります。たとえば、別のアプリケーション https://chaohhuahui.com/ を追加し、それらの IP アドレスに ping を送信して、それらが同じであることを確認できます。
以上がNginx を使用して Docker で複数のアプリケーション サイトをプロキシする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。