프록시 방법(컨테이너 간 통신 방법)?
nginx의 프록시 기능을 직접 사용하세요(관련 기능은 별도로 참조). 여기서 문제는 도커 컨테이너 간의 통신입니다.
docker 컨테이너 간 통신에는 다음과 같은 4가지 주요 방법이 있습니다.
- 컨테이너 IP를 통한 액세스: 컨테이너가 다시 시작된 후 IP가 변경됩니다.
- 호스트의 IP:포트를 통해 접속: 호스트의 IP가 변경되면 각 애플리케이션을 변경하고 포트를 바인딩해야 하는 번거로움이 있습니다.
- 링크를 통한 링크 구축: 서로에 대한 지나친 의존은 유지 관리에 도움이 되지 않습니다.
- 맞춤형 네트워크: 동일한 브리지 네트워크에 있는 컨테이너는 서로 액세스할 수 있습니다.
분명히 우리는 관련 애플리케이션을 동일한 네트워크에 연결하기 위해 네트워크를 사용자 정의하는 방법을 선택할 것입니다. 이러한 방식으로 실제로 애플리케이션, 에이전트 및 프록시 간에 의존성이 없습니다. 이주하다. 구성은 번거롭지 않습니다. 일반 IP 또는 도메인 이름을 해당 컨테이너 이름으로 바꾸면 됩니다.
1. 통합 네트워크
그런 다음 먼저 공유 브리지 네트워크를 만들어야 합니다:
docker network create proxy-network # 查看 docker network ls
2. 프록시 서비스 컨테이너
프록시용으로 특별히 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을 프록시 서버에 바인딩하면 모든 애플리케이션이 여기에서 들어올 수 있습니다.
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
구성 및 제어를 용이하게 하기 위해 실행 중인 사용자 그룹과 사용자 www-data가 여기에 생성됩니다. 이 이름은 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; }
nginx의 기본 내용을 복사하세요. 변경해야 할 것은 실행 중인 사용자 이름입니다. 사용자 이름은 이전 설정과 일치해야 합니다.
startup.sh
#!/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를 사용하여 애플리케이션을 생성하세요.
이것은 PHP 프로젝트이므로 이 애플리케이션에는 nginx 및 php-fpm이라는 두 개 이상의 서비스 컨테이너가 필요합니다. 프로젝트 디렉토리 구조는 다음과 같습니다:
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
조정을 용이하게 하기 위해 환경 여기에는 변수가 사용됩니다.
nginx 컨테이너 이름: ${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 443
php-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 파일을 잊지 마세요. 기본값을 사용한 다음 관련 구성을 삭제할 수도 있습니다.
서비스 구성 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; } }
여기서 완료했습니다. 실제로는 간소화할 수 있으므로 구성만 하면 됩니다.
애플리케이션 시작
이 시점에서 baipiaoquan.com의 서비스를 시작할 수 있습니다. baipiaoquan 디렉토리에서 실행하세요:
docker-compose up -d nginx
사고가 없으면 애플리케이션이 시작되고 수신될 수 있습니다. 서비스. 또한 컨테이너에 들어가서 localhost에 액세스하여 원하는 결과가 나오는지 테스트해 볼 수도 있습니다. 저는 이렇게 테스트했습니다:
docker-compose exec nginx wget localhost
그런 다음 반환된 데이터의 크기를 보고 상황에 따라 성공했는지 판단합니다.
다음 명령을 통해 애플리케이션이 프록시 네트워크에 성공적으로 연결되었는지 확인할 수 있습니다.
docker network inspect proxy-network
다음 단계는 전 세계 사람들이 이 애플리케이션에 액세스할 수 있도록 만드는 것입니다.
nginx-proxy에 프록시 구성 추가
참고: 먼저 애플리케이션을 시작한 다음 프록시를 시작해야 합니다. 그렇지 않으면 nginx가 업스트림 오류를 찾을 수 없습니다.
저장 위치: proxy-nginx/sites/baipiaoquan.com.conf 위 구성을 복사하고 몇 군데만 변경하면 됩니다. 최종 구성은 다음과 같습니다.
# 我这配的仅支持 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/ 웹사이트에 액세스할 수 있을 것입니다.
다른 애플리케이션을 추가해야 하는 경우 논리와 프로세스는 동일합니다. 예를 들어, https://chaohhuahui.com/이라는 다른 애플리케이션을 추가하면 해당 IP 주소를 핑하여 동일한지 확인할 수 있습니다.
위 내용은 Nginx를 사용하여 Docker에서 여러 애플리케이션 사이트를 프록시하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!