Nginx를 사용하여 Docker에서 여러 애플리케이션 사이트를 프록시하는 방법
프록시 방법(컨테이너 간 통신 방법)?
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











국내 거울 소스로 전환 할 수 있습니다. 단계는 다음과 같습니다. 1. 구성 파일 /etc/docker/daemon.json 편집 및 미러 소스 주소를 추가하십시오. 2. 저장 및 종료 후 Docker Service Sudo SystemCTL Docker를 다시 시작하여 이미지 다운로드 속도 및 안정성을 향상시킵니다.

Docker Desktop을 사용하는 방법? Docker Desktop은 로컬 머신에서 Docker 컨테이너를 실행하는 도구입니다. 사용 단계는 다음과 같습니다. 1. Docker Desktop 설치; 2. Docker Desktop을 시작하십시오. 3. Docker 이미지를 만듭니다 (Dockerfile 사용); 4. Docker Image 빌드 (Docker 빌드 사용); 5. 도커 컨테이너를 실행하십시오 (Docker Run 사용).

Docker 이미지 생성 단계 : 빌드 지침이 포함 된 Dockerfile을 작성하십시오. Docker 빌드 명령을 사용하여 터미널에 이미지를 빌드하십시오. Docker 태그 명령을 사용하여 이미지를 태그하고 이름과 태그를 지정하십시오.

Docker 버전을 얻으려면 다음 단계를 수행 할 수 있습니다. Docker 명령 "Docker -version"을 실행하여 클라이언트 및 서버 버전을 볼 수 있습니다. Mac 또는 Windows의 경우 Docker Desktop GUI의 버전 탭 또는 Aff Docker Desktop 메뉴를 통해 버전 정보를 볼 수도 있습니다.

Docker LNMP 컨테이너 호출 단계 : 컨테이너 실행 : Docker Run -D-- 이름 LNMP -Container -P 80:80 -P 443 : 443 LNMP -Stack 컨테이너 IP를 얻으려면 Docker LNMP -Container | grep iPaddress 액세스 웹 사이트 : http : // & lt; 컨테이너 ip & gt;/index.phpssh 액세스 : docker exec -it lnmp -container bash access mysql : mysql -u roo

Docker Private Repositories를 구축하여 컨테이너 이미지를 안전하게 저장하고 관리하여 엄격한 제어 및 보안을 제공 할 수 있습니다. 단계에는 리포지토리 생성, 액세스 부여, 저장소 배포, 이미지 밀기 및 이미지를 당기는 단계가 포함됩니다. 보안, 버전 제어, 네트워크 트래픽 감소 및 사용자 정의가 장점이 있습니다.

Docker에 이미지를 저장하려면 Docker Commit 명령을 사용하여 지정된 컨테이너의 현재 상태가 포함 된 새 이미지를 만들 수 있습니다. 구문 : Docker Commit [옵션] 컨테이너 ID 이미지 이름. 이미지를 저장소에 저장하려면 Docker Push 명령 인 Syntax : Docker 푸시 이미지 이름 [: tag]을 사용할 수 있습니다. 저장된 이미지를 가져 오려면 Docker Pull 명령 인 Syntax : Docker Pull Image Name [: Tag]을 사용할 수 있습니다.

Docker 이미지를 업데이트하는 단계는 다음과 같습니다. 최신 이미지 태그 가져 오기 새 이미지 특정 태그의 이전 이미지 삭제 (선택 사항) 컨테이너를 다시 시작하십시오 (필요한 경우)
