Docker + Nginx + PHP-FPM이라면 40 초 정도로 환경을 준비 할 수있는 docker-compose가 즐거워졌습니다.

9564 단어 php-fpmnginx도커
게시물의 아이템을 사용한 환경 만들기이므로 DB도 없고 완전히 docker 공부입니다. 하지만 이런 조합의 샘플을 여러가지 웹으로 잡았는데, 왠지 움직이지 않고... 어떻게든 움직이는 것이 생겼기 때문에, 투고가 됩니다.

GitHub



이쪽에 정리했으므로, 결론만 알고 싶은 분은, 이쪽으로부터 부디.

mochizukikotaro/docker-nginx-phpfpm - branch:simple

할 수있는 것


  • docker
  • nginx
  • php-fpm

  • 환경을 docker-compose를 사용하여 쉽게 만들 수 있습니다.

    필자는 Mac 사용자이고, 그 전제이지만, Doceker for Mac이 들어 있으면 다음 명령으로 phpinfo() 에 따릅니다.

    시작 명령


    $ git clone [email protected]:mochizukikotaro/docker-nginx-phpfpm.git
    $ cd docker-nginx-phpfpm.git
    $ docker-compose up
    

    위의 세 가지 명령으로 localhost:8080 에 액세스하면 아래 화면을 따라갑니다.



    나중에 명령


    docker-compose up 에서 컨테이너가 일어나고 있습니다만, 공부이므로 삭제도 확실히 해 두고 싶은 곳입니다.
    (아래 코드 piyo 는 내 디렉토리 이름이 그렇게 되었을 뿐이므로 별로 신경 쓰지 마십시오.)
    # プロセス確認
    $ docker-compose ps
       Name                 Command               State     Ports
    -------------------------------------------------------------
    piyo_php_1   docker-php-entrypoint php-fpm   Exit 137
    piyo_web_1   nginx -g daemon off;            Exit 137
    
    # コンテナ削除
    $ docker-compose down
    Removing piyo_web_1 ... done
    Removing piyo_php_1 ... done
    

    소스 코드 소개



    코드도 가능한 한 간단한 구성으로하고 있습니다.
    $ tree
    .
    ├── Dockerfile
    ├── README.md
    ├── code
    │   └── index.php
    ├── docker-compose.yml
    └── site.conf
    

    이것뿐이므로 별로 어려운 일은 없다고 생각합니다.

    docker-compose.yml
    version: '3'
    services:
      web:
          build: ./
          ports:
              - "8080:80"
          depends_on:
              - php
      php:
          image: php:7-fpm
          volumes:
              - ./code:/code
    

    site.conf
    server {
        index index.php index.html;
        server_name localhost;
        error_log  /var/log/nginx/error.log;
        access_log /var/log/nginx/access.log;
        root /code;
    
        location / {
            try_files $uri $uri/ /index.php$is_args$args;
        }
    
        location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass php:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
    }
    

    code/index.php
    <?php
    echo phpinfo();
    

    모든 소스는 여기 .

    이상입니다.
    여기까지의 이야기는, 간단하고 알기 쉽다고 생각합니다.

    고찰, 해설 등



    그 1. links



    처음에 docker-compose.yml 를 만들었을 때는 아래와 같이 links: 를 사용하고 있었습니다.

    docker-compose.yml
    web:
        # 略
        links:
            - php
        # 略
    
    links: 를 설정하면, nginx 의 컨테이너의 /etc/hosts 에 서비스 정보가 추가됩니다. 이것에 의해, site.conf 에 이하와 같이 기재할 수가 있습니다.
    fastcgi_pass php:9000;
    

    실제로 hosts 의 정보를 확인해 보면 다음과 같이 되어 있었습니다.
    # まずは、nginx コンテナに入る
    # ぼくは git clone *** piyo でディレクトリ名指定しているので、以下のようなカンジです。
    
    # コンテナ名を確認
    $ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES
    6ee2fb5c8aaa        nginx:latest        "nginx -g 'daemon ..."   6 minutes ago       Up 6 minutes        443/tcp, 0.0.0.0:8080->80/tcp   piyo_web_1
    9b8ed908d621        php:7-fpm           "docker-php-entryp..."   6 minutes ago       Up 6 minutes        9000/tcp                        piyo_php_1
    
    # 中に入る
    $ docker exec -it piyo_web_1 bash
    root@6ee2fb5c8aaa:/#
    
    
    # 入ったあとに cat 
    root@6ee2fb5c8aaa:/# cat /etc/hosts
    127.0.0.1   localhost
    ::1 localhost ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    172.17.0.2  php 9b8ed908d621 piyo_php_1 # ちゃんと追加されてました。
    172.17.0.2  php_1 9b8ed908d621 piyo_php_1
    172.17.0.2  piyo_php_1 9b8ed908d621
    172.17.0.3  6ee2fb5c8aaa
    
    

    2. links: 대신 depends_on: 을 사용하면



    ngix 컨테이너의 hosts 에 php 라고는 쓰여지지 않았습니다.
    $ docker ps
    CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                           NAMES
    14487c92de8b        dockernginxphpfpm_web   "nginx -g 'daemon ..."   10 hours ago        Up 10 hours         443/tcp, 0.0.0.0:8080->80/tcp   dockernginxphpfpm_web_1
    ba2d44f70e13        php:7-fpm               "docker-php-entryp..."   10 hours ago        Up 10 hours         9000/tcp                        dockernginxphpfpm_php_1
    
    $ docker exec -ti dockernginxphpfpm_web_1 bash
    root@14487c92de8b:/# cat /etc/hosts
    127.0.0.1   localhost
    ::1 localhost ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    172.21.0.3  14487c92de8b # これが使われています。
    

    TODO:
    저기, nginx 의 설정 파일 site.conf 의 fastcgi_pass php:9000; 는 굉장한 것인가.... links 덕분에 hosts 에 걸려 움직인다고 생각했습니다만. 어떤 구조일까. .. 공부합니다.

    약간의 결과 :
    nginx 컨테이너의 /etc/resolv.conf 에 nameserver 가 지정되어 있으므로, DNS 가 우울합니다. 실제로, ping php 에 대해서 이름 해결은 되고 있었습니다.
    $ docker exec -it dockernginxphpfpm_web_1 ping php
    PING php (172.21.0.2): 56 data bytes
    64 bytes from 172.21.0.2: icmp_seq=0 ttl=64 time=0.102 ms
    64 bytes from 172.21.0.2: icmp_seq=1 ttl=64 time=0.216 ms
    

    3. nginx/conf.d/default.conf를 덮어 씁니다.



    여기에 nginx 구성 파일 에 대해 물었지만 기본적으로 default.conf가 있습니다. 그래서 처음에는 다음과 같이 했습니다.

    docker-compose.yml
    # before
    - ./site.conf:/etc/nginx/conf.d/site.conf
    
    # after ( default.conf を上書きます)
    - ./site.conf:/etc/nginx/conf.d/default.conf
    

    before의 상태라면, default 의 location 가 효과가 버려, 잘 작동하지 않았습니다.

    (nginx에 대해서도 공부 부족이므로, 현재 공부 중입니다.)

    이상입니다. 고마워요.

    좋은 웹페이지 즐겨찾기