Comment proxy (comment communiquer entre conteneurs) ?
Utilisez simplement la fonction proxy de nginx directement (voir les fonctionnalités associées séparément). Le problème ici est la communication entre les conteneurs Docker.
docker Il existe les 4 principaux moyens de communication entre les conteneurs suivants :
- Accès via l'adresse IP du conteneur : après le redémarrage du conteneur, l'adresse IP changera.
- Accès via l'ip:port de l'hôte : Si l'IP de l'hôte change, chaque application doit être modifiée et le port doit être lié, ce qui est gênant.
- Construire des liens par le lien : Trop de dépendance les uns envers les autres n'est pas propice au maintien.
- Réseau personnalisé : les conteneurs du même réseau de pont peuvent accéder les uns aux autres.
Évidemment, nous choisirons de personnaliser la méthode réseau pour relier les applications associées au même réseau. De cette manière, il n'y a en fait aucune dépendance entre les applications et les agents, les agents et les proxys. migrer. La configuration n'est pas compliquée, remplacez simplement l'adresse IP ou le nom de domaine habituel par le nom du conteneur correspondant.
1. Réseau unifié
Ensuite, vous devez d'abord créer un réseau de pont partagé :
docker network create proxy-network # 查看 docker network ls
2. Conteneur de service proxy
Créez un conteneur de service nginx spécifiquement pour le proxy, nommé : proxy -nginx , construit ici à l'aide de docker-compose, la structure de répertoires finale est la suivante :
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
Certains fichiers sont générés lors du processus d'exécution ultérieur. Lors de la configuration, il vous suffit de créer les fichiers et répertoires nécessaires.
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"
Liez les ports externes 80 et 443 au serveur proxy, et toutes les applications peuvent entrer à partir d'ici.
dockerfile
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
Le groupe d'utilisateurs en cours d'exécution et l'utilisateur www-data seront créés ici pour faciliter la configuration et le contrôle. Ce nom sera utilisé dans la configuration de nginx.
nginx.conf
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; }
Copiez simplement le contenu par défaut de nginx. Ce qui doit être modifié, c'est le nom d'utilisateur en cours d'exécution. Notez que le nom d'utilisateur doit être cohérent avec les paramètres précédents.
startup.sh
#!/bin/bash # start crond in background crond -l 2 -b # start nginx in foreground nginx
Ceci est utilisé pour démarrer le programme nginx. Le contenu est actuellement relativement petit, principalement pour faciliter l'expansion future du contenu.
Démarrez le conteneur du service proxy
docker-compose up -d nginx
Vérifiez si le démarrage est normal docker-compose ps, sinon, vérifiez s'il y a des erreurs dans la configuration.
Ça y est, laissez tomber pour l'instant et allez créer l'application.
3. Ajouter une application
Ajouter un site https://baipiaoquan.com/.
Configuration des conteneurs d'applications
Utilisez également docker-compose pour créer des applications.
Il s'agit d'un projet php, cette application nécessite donc au moins deux conteneurs de services, nginx et php-fpm. La structure du répertoire du projet est la suivante :
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
docker-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
Afin de faciliter l'ajustement, l'environnement. les variables sont utilisées ici.
Notez le nom du conteneur nginx containers_name : ${compose_project_name}_nginx. Cette valeur est critique et sera utilisée dans les proxys suivants. Le nom du réseau proxy utilisé par
.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
est : proxy-network, qui a été créé précédemment ; le nom du conteneur de
nginx sera : baipiaoquan_nginx.
dockerfile de nginx
Ce fichier peut être directement extrait du précédent, puis ajouté des informations liées à 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 443
dockerfile de php-fpm
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"]
N'oubliez pas le fichier php.ini, vous pouvez également utiliser sa valeur par défaut, puis supprimer cette configuration associée.
La configuration du service 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; } }
Je l'ai complète ici En fait, elle peut être rationalisée et n'a besoin que d'être configurée.
Démarrez l'application
À ce stade, vous pouvez démarrer le service de baipiaoquan.com Exécutez-le dans le répertoire de baipiaoquan :
docker-compose up -d nginx
S'il n'y a pas d'accident, l'application devrait démarrer et pouvoir recevoir. services. Vous pouvez également le tester en entrant dans le conteneur et en accédant à localhost pour voir si le résultat est celui que vous souhaitez. Je l'ai testé comme ceci :
docker-compose exec nginx wget localhost
Ensuite, j'ai regardé la taille des données renvoyées et j'ai jugé si cela avait réussi en fonction de la situation.
Vous pouvez vérifier si l'application est correctement connectée au réseau proxy via la commande suivante :
docker network inspect proxy-network
La prochaine étape consiste à rendre cette application accessible aux personnes du monde entier.
Ajouter la configuration du proxy à nginx-proxy
Remarque : vous devez d'abord démarrer l'application, puis démarrer le proxy, sinon nginx ne peut pas trouver l'erreur en amont.
Emplacement de stockage : proxy-nginx/sites/baipiaoquan.com.conf. Copiez simplement la configuration ci-dessus et modifiez quelques endroits. La configuration finale est la suivante :
# 我这配的仅支持 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 的容器名称 } }
Rechargez la configuration du serveur proxy dans nginx-proxy Exécutez sous le. annuaire :
# 先测试下配置文件,这步一定要执行成功 docker-compose exec nginx nginx -t # 如果提示成功,则重新加载,否则就按提示检查修改配置文件 docker-compose exec nginx nginx -s reload
Attendez un instant, si tout se passe bien, les gens du monde entier devraient désormais pouvoir accéder à ce site https://baipiaoquan.com/.
Si vous devez ajouter d'autres applications, la logique et le processus seront les mêmes. Par exemple, j'ai ajouté une autre application : https://chaohhuahui.com/, et vous pouvez pinger leurs adresses IP pour voir qu'elles sont les mêmes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!