IT

php-fpm과 Nginx Docker 컨테이너를 올바르게 링크하려면 어떻게 해야 합니까?

itgroup 2022. 10. 18. 21:39
반응형

php-fpm과 Nginx Docker 컨테이너를 올바르게 링크하려면 어떻게 해야 합니까?

2개의 개별 컨테이너를 링크하려고 합니다.

문제는 php 스크립트가 작동하지 않는다는 것입니다.php-fpm 설정이 잘못되었을 수 있습니다.여기 제 저장소에 있는 소스 코드가 있습니다.여기 파일이 있습니다.docker-compose.yml:

nginx:
    build: .
    ports:
        - "80:80"
        - "443:443"
    volumes:
        - ./:/var/www/test/
    links:
        - fpm
fpm:
    image: php:fpm
    ports:
        - "9000:9000"

★★★★★★★★★★★★★★★★★」Dockerfilenginx를 기반으로 커스텀 이미지를 작성했습니다.

FROM nginx

# Change Nginx config here...
RUN rm /etc/nginx/conf.d/default.conf
ADD ./default.conf /etc/nginx/conf.d/

마지막으로 커스텀 Nginx 가상 호스트 구성을 다음에 나타냅니다.

server {
    listen  80;

    server_name localhost;
    root /var/www/test;

    error_log /var/log/nginx/localhost.error.log;
    access_log /var/log/nginx/localhost.access.log;

    location / {
        # try to serve file directly, fallback to app.php
        try_files $uri /index.php$is_args$args;
    }

    location ~ ^/.+\.php(/|$) {
        fastcgi_pass 192.168.59.103:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS off;
    }
}

php 스크립트를 실행할 수 있도록 컨테이너를 올바르게 구성하는 데 도움을 주실 수 있습니까?

추신: 도커 컴포저를 통해 컨테이너를 실행합니다.

docker-compose up

프로젝트 루트 디렉토리에서.

오래된 게시물인 건 알지만, 같은 문제가 있어서 당신의 코드가 왜 작동하지 않는지 이해할 수 없었습니다.많은 테스트를 거친 후에 나는 그 이유를 알아냈다.

풀 컨테이너 내의 fpm nginx는 fpm nginx와 완전히 .server.rootnginx에 존재하지 않더라도 nginx는 nginx로 설정됩니다.

데모 방법:

docker-param.yml

nginx:
    build: .
    ports:
        - "80:80"
    links:
        - fpm
fpm:
    image: php:fpm
    ports:
        - ":9000"

    # seems like fpm receives the full path from nginx
    # and tries to find the files in this dock, so it must
    # be the same as nginx.root
    volumes:
        - ./:/complex/path/to/files/

/etc/nginx/conf.d/default.conf

server {
    listen  80;

    # this path MUST be exactly as docker-compose.fpm.volumes,
    # even if it doesn't exist in this dock.
    root /complex/path/to/files;

    location / {
        try_files $uri /index.php$is_args$args;
    }

    location ~ ^/.+\.php(/|$) {
        fastcgi_pass fpm:9000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

도커 파일

FROM nginx:latest
COPY ./default.conf /etc/nginx/conf.d/

nginx 구성에서 컨테이너의 ip를 하드코드하지 마십시오. 도커 링크는 연결된 머신의 호스트 이름을 컨테이너의 호스트 파일에 추가합니다. 그러면 호스트 이름으로 ping할 수 있습니다.

편집: 도커 1.9 네트워킹에서는 컨테이너를 링크할 필요가 없어졌습니다.여러 컨테이너가 같은 네트워크에 접속되어 있는 경우 호스트 파일이 갱신되어 호스트명으로 서로 연결할 수 있게 됩니다.

도커 컨테이너가 이미지에서 회전할 때마다(기존 컨테이너의 정지/기동도 가능) 컨테이너는 도커 호스트에 의해 새로운 IP가 할당됩니다.이러한 IP는 실제 시스템과 동일한 서브넷에 있지 않습니다.

문서를 링크하는 도커 참조(이것이 백그라운드에서 사용하는 구성)

, 보다 는 「의」에 기재되어 있습니다.docker-composelinks & docs 。

링크

links:
 - db
 - db:database
 - redis

별칭' 이름을 가진 항목이 이 서비스의 컨테이너 내부 /etc/hosts에 생성됩니다. 예:

172.17.2.186  db
172.17.2.186  database
172.17.2.187  redis

노출

포트를 호스트 시스템에 게시하지 않고 노출합니다. 포트가 연결된 서비스에만 액세스할 수 있습니다.내부 포트만 지정할 수 있습니다.

환경변수를 통해 포트와 기타 자격정보를 취득하도록 프로젝트를 셋업하면 링크는 자동으로 다수의 시스템 변수를 설정합니다.

할 수 하려면 를 합니다.docker-compose run SERVICE env.

name_PORT

전체 URL(예: DB_PORT=http://172.17.0.5:5432)

name_PORT_num_protocol

한 URL "URL")DB_PORT_5432_TCP=tcp://172.17.0.5:5432

name_PORT_num_protocol_ADDR

주소 IP 주소:DB_PORT_5432_TCP_ADDR=172.17.0.5

name_PORT_num_protocol_PORT

번호 " " )DB_PORT_5432_TCP_PORT=5432

name_PORT_num_protocol_PROTO

udp). "tcp " udp" 등입니다.DB_PORT_5432_TCP_PROTO=tcp

name_NAME

정규화된 컨테이너 이름(예:DB_1_NAME=/myapp_web_1/myapp_db_1

이전에도 지적했듯이 fpm 컨테이너에 파일이 보이지 않는 것이 문제였습니다.그러나 컨테이너 간에 데이터를 공유하기 위해 권장되는 패턴은 데이터 전용 컨테이너를 사용하는 것입니다( 문서에서 설명).

요약하자면, 데이터를 저장하는 컨테이너를 만들고 볼륨과 공유한 후 앱에서 이 볼륨을 링크합니다.volumes_from.

compose (2를하여 compose (1.6.2)를 합니다.docker-compose.yml을 사용하다

version: "2"
services:
  nginx:
    build:
      context: .
      dockerfile: nginx/Dockerfile
    ports:
      - "80:80"
    links:
      - fpm
    volumes_from:
      - data
  fpm:
    image: php:fpm
    volumes_from:
      - data
  data:
    build:
      context: .
      dockerfile: data/Dockerfile
    volumes:
      - /var/www/html

:data publishes publishes publishes publishes 。nginx ★★★★★★★★★★★★★★★★★」fpm서비스를 제공합니다. '하다'는Dockerfile소스 코드를 포함하는 데이터 서비스의 경우:

FROM busybox

# content
ADD path/to/source /var/www/html

★★★★★★★★★★★★★★★★.Dockerfile설정인nginx의 "nginx"의 "nginx"의 "nginx"의 "nginx"의 "nginx"의 "nginx"가 .

FROM nginx

# config
ADD config/default.conf /etc/nginx/conf.d

완료하기 위해서, 이 예제가 기능하기 위해서 필요한 설정 파일을 다음에 나타냅니다.

server {
    listen 0.0.0.0:80;

    root /var/www/html;

    location / {
        index index.php index.html;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass fpm:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    }
}

을 문서 루트로 컨테이너와 할 수 을 합니다( "nginx"는 nginx의 fpm).HOST:PORT, 「」)fpm:9000compute에 정의된 및 compute에 의해 된 호스트 이름 SCRIPT_FILENAME를 참조해 주세요.

새로운 답변

도커 구성이 업데이트되었습니다.버전 2 파일 형식을 갖게 되었습니다.

버전 2 파일은 Compose 1.6.0+에서 지원되며 버전 1.10.0+의 도커 엔진이 필요합니다.

Docker의 네트워킹 기능을 지원하게 되었습니다.도커는 실행 시 myapp_default라는 기본 네트워크를 셋업합니다.

문서에는 다음과 같은 파일이 기재되어 있습니다.

version: '2'

services:
  web:
    build: .
    ports:
      - "8000:8000"
  fpm:
    image: phpfpm
  nginx
    image: nginx

이러한 컨테이너는 기본 myapp_default 네트워크에 자동으로 추가되므로 서로 통신할 수 있습니다.Nginx 설정에서는 다음과 같이 됩니다.

fastcgi_pass fpm:9000;

, 에서 @에 , PHP-FPM 가 하고 있는 을 잊지 말아 주세요.이은, 「」, 「@treeface」, 「PHP-FPM」를 편집하는 할 수 있습니다.이 작업은 편집으로 실행할 수 있습니다./etc/php5/fpm/pool.d/www.conf한 장소listen = 9000.

오래된 답변

이전 버전의 Docker/Docker compute를 사용하고 계신 분들을 위해 아래 내용을 보관하고 있습니다.

이 질문에 대한 답을 찾으려 할 때 구글에서 이 질문을 계속 발견했지만, 도커 컴포지트에 대한 Q/A 강조로 인해 제가 찾던 것은 아니었습니다(작성 시점에서는 도커 네트워킹 기능에 대한 실험적인 지원만 제공).그래서 내가 배운 것에 대한 나의 견해는 이렇다.

Docker는 최근 네트워크 기능을 위해 링크 기능을 폐지했습니다.

따라서 도커 네트워크 기능을 사용하여 다음 단계에 따라 컨테이너를 링크할 수 있습니다.옵션에 대한 자세한 설명은 이전에 링크된 문서에서 읽어보십시오.

먼저 네트워크 생성

docker network create --driver bridge mynetwork

합니다(PHP-FPM 9000).mynetwork를 참조해 주세요.

docker run -d -p 9000 --net mynetwork --name php-fpm php:fpm

는 ''입니다.--name php-fpm명령어 끝의 이름에는 나중에 이것이 필요합니다.

그런 다음 Nginx 컨테이너를 다시 실행하여 작성한 네트워크에 할당합니다.

docker run --net mynetwork --name nginx -d -p 80:80 nginx:latest

및 PHP Nginx 컨테이너에 .--volumes-from령어등등 등등등다다

여기서 Nginx 설정이 시작됩니다.다음과 같이 표시됩니다.

server {
    listen 80;
    server_name localhost;

    root /path/to/my/webroot;

    index index.html index.htm index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php-fpm:9000; 
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

점에 주의:fastcgi_pass php-fpm:9000;로케이션 블록에 있습니다. 컨테이너라고 입니다.php-fpm '''로9000도커 브리지 네트워크에 컨테이너를 추가하면 모든 컨테이너가 자동으로 호스트 파일 업데이트를 받아 IP 주소에 대해 컨테이너 이름을 입력합니다.때, Nginx는 이 이름 붙인 PHP-FPM 컨테이너에 접속하는 것을 알게 됩니다.php-fpm.mynetwork도커 네트워크

Nginx 설정은 Docker 컨테이너의 빌드 프로세스 중에 추가할 수도 있고 나중에 추가할 수도 있습니다.

이전 답변에서 해결되었지만 매우 명확하게 기술되어야 합니다: php 코드는 php-fpm 컨테이너에 존재해야 하며 정적 파일은 nginx 컨테이너에 존재해야 합니다.간단하게 하기 위해서, 대부분의 유저는, 이하와 같이, 이 양쪽 모두에 모든 코드를 첨부하고 있습니다.향후에는, 이러한 코드의 다른 부분을 자신의 프로젝트에서 분리해, 어느 컨테이너가 어느 부분에 액세스 할 수 있는지를 최소한으로 억제할 것입니다.

아래의 샘플 파일을 이 최신 정보로 업데이트했습니다(감사합니다 @alkaline )

이것이 도커 2.0의 최소 셋업이라고 생각됩니다(도커 2.0에서는 상황이 훨씬 쉬워졌습니다).

docker-timeout.yml:

version: '2'
services:
  php:
    container_name: test-php
    image: php:fpm
    volumes:
      - ./code:/var/www/html/site
  nginx:
    container_name: test-nginx
    image: nginx:latest
    volumes:
      - ./code:/var/www/html/site
      - ./site.conf:/etc/nginx/conf.d/site.conf:ro
    ports:
      - 80:80

(상기 docker-compose.yml 업데이트 완료:css, javascript, static 파일 등이 있는 사이트의 경우 nginx 컨테이너에 액세스할 수 있는 파일이 필요합니다.fpm 컨테이너에 접근할 수 있는 모든 php 코드를 가지고 있습니다.다시 말씀드리지만, 저의 기본 코드는 css, js 및 php가 뒤죽박죽으로 섞여 있기 때문에 이 예에서는 모든 코드를 양쪽 컨테이너에 첨부합니다.)

같은 폴더 내:

site.conf:

server
{
    listen   80;
    server_name site.local.[YOUR URL].com;

    root /var/www/html/site;
    index index.php;

    location /
    {
        try_files $uri =404;
    }

    location ~ \.php$ {
        fastcgi_pass   test-php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

폴더 코드:

./code/index.disc:

<?php
phpinfo();

호스트 파일 업데이트도 잊지 마십시오.

127.0.0.1 site.local.[YOUR URL].com

도킹 스테이션에 접속하여

$docker-compose up -d

마음에 드는 브라우저의 URL을 사용해 보세요.

site.local.[YOUR URL].com/index.php

우리는 fpm 컨테이너에도 볼륨을 줘야 한다고 생각합니다.그래서 =>

fpm:
    image: php:fpm
    volumes:
        - ./:/var/www/test/

이렇게 하지 않으면 fpm이 요청된 파일을 찾을 수 없기 때문에 요청을 실행할 때 다음 예외가 발생합니다.

[error] 6#6: *4 Fast CGI가 업스트림, 클라이언트: 172.17.42.1, 서버: localhost, 요청: "GET / HTTP/1.1", 업스트림: "fastcgi:/172.17.0.81:9000", 호스트: "local"에서 응답 헤더를 읽는 동안 stderr로 전송되었습니다.

다른 사람에겐

Nginx 403 오류: [폴더]의 디렉터리 색인이 금지됩니다.

「」를 하고 있는 index.php 동시에index.html하게 하며, ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★index.php되어 있습니다.sites-enabled

server {
    listen 80;

    # this path MUST be exactly as docker-compose php volumes
    root /usr/share/nginx/html;

    index index.php

    ...
}

.conf 에 nginx 파일이 있는지 합니다./etc/nginx/nginx.conf는 실제로 합니다.http★★★★★★★★★★★…

http {

    ...

    include /etc/nginx/conf.d/*.conf;

    # Load our websites config 
    include /etc/nginx/sites-enabled/*;
}

언급URL : https://stackoverflow.com/questions/29905953/how-to-correctly-link-php-fpm-and-nginx-docker-containers

반응형