Wie erfolgt ein Proxy (wie kommuniziert man zwischen Containern)?
Sie können die Proxy-Funktion von Nginx direkt verwenden (siehe entsprechende Funktionen separat).
Docker Es gibt die folgenden 4 Hauptwege der Kommunikation zwischen Containern:
- Zugriff über Container-IP: Nachdem der Container neu gestartet wurde, wird der IP wird sich ändern.
- Zugriff über die IP:Port des Hosts: Wenn sich die IP des Hosts ändert, muss jede Anwendung geändert und der Port gebunden werden, was problematisch ist.
- Verknüpfungen durch Links aufbauen: Eine zu große Abhängigkeit voneinander ist der Aufrechterhaltung nicht förderlich.
- Benutzerdefiniertes Netzwerk: Container im selben Bridge-Netzwerk können aufeinander zugreifen.
Natürlich werden wir eine benutzerdefinierte Netzwerkmethode wählen, um verwandte Anwendungen mit demselben Netzwerk zu verknüpfen. Auf diese Weise besteht tatsächlich keine Abhängigkeit zwischen Anwendungen, Agenten und Proxys pflegen, aber auch einfach zu migrieren. Auch praktisch. Die Konfiguration ist kein Problem. Ersetzen Sie einfach den regulären IP- oder Domänennamen durch den entsprechenden Containernamen.
1. Unified Network
Also müssen Sie zuerst ein gemeinsames Brückennetzwerk erstellen:
docker network create proxy-network # 查看 docker network ls
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
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"
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
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; }
#!/bin/bash # start crond in background crond -l 2 -b # start nginx in foreground nginx
docker-compose up -d nginx
Anwendungscontainer konfigurieren
Dies ist ein PHP-Projekt, daher erfordert diese Anwendung mindestens zwei Service-Container, Nginx und PHP-FPM. Die Projektverzeichnisstruktur ist wie folgt:
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.ini
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
# 宿主机中代码的位置 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
Der Containername von nginx lautet: baipiaoquan_nginx.
nginx’s dockerfileDiese Datei kann direkt aus der vorherigen übernommen und dann über PHP-bezogene Informationen hinzugefügt werden.
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 443
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"]
Konfiguration des Dienstes baipiaoquan.com.conf
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; } }
An diesem Punkt können Sie den Dienst von baipiaoquan.com starten und im Verzeichnis von ausführen baipiaoquan:
docker-compose up -d nginx
Wenn nichts Unerwartetes passiert, sollte die Anwendung starten und Dienste empfangen können. Sie können es auch testen, indem Sie den Container aufrufen und auf localhost zugreifen, um zu sehen, ob das Ergebnis Ihren Wünschen entspricht. Ich habe es so getestet: docker-compose exec nginx wget localhost
Mit dem folgenden Befehl können Sie überprüfen, ob die Anwendung erfolgreich mit dem Proxy-Netzwerk verbunden wurde:
docker network inspect proxy-network
Der nächste Schritt besteht darin, diese Anwendung für alle auf der Welt zugänglich zu machen.
Proxy-Konfiguration zum Nginx-Proxy hinzufügenHinweis: Sie müssen zuerst die Anwendung und dann den Proxy starten. Andernfalls wird es so aussehen, als ob Nginx den Upstream nicht finden kann und einen Fehler meldet.
Speicherort: Proxy-nginx/sites/baipiaoquan.com.conf Kopieren Sie einfach die obige Konfiguration und ändern Sie einige Stellen. Die endgültige Konfiguration ist wie folgt: # 我这配的仅支持 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 的容器名称
}
}
# 先测试下配置文件,这步一定要执行成功 docker-compose exec nginx nginx -t # 如果提示成功,则重新加载,否则就按提示检查修改配置文件 docker-compose exec nginx nginx -s reload
Wenn Sie weitere Anwendungen hinzufügen müssen, sind die Logik und der Prozess gleich. Ich habe beispielsweise eine weitere Anwendung hinzugefügt: https://chaohhuahui.com/, und ich kann ihre IP-Adressen anpingen, um festzustellen, ob sie identisch sind.
Das obige ist der detaillierte Inhalt vonSo verwenden Sie Nginx als Proxy für mehrere Anwendungsseiten in Docker. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!