How to link nginx and php-fpm with docker compose?

I’m learning docker compose and trying to run the project provided from some Docker course.
There is the project to link nginx:latest and php:8.2-fpm containers to display message from index.php. But I cannot reproduce the results. It’s supposed to display “Hello from PHP!” message, when I go to localhost, but I’ve got this message instead:


    Welcome to nginx!
    If you see this page, the nginx web server is successfully installed and working.
    Further configuration is required.
    
    For online documentation and support please refer to nginx.org.
    Commercial support is available at nginx.com.
    
    Thank you for using nginx.

As I understand nginx container is ok, and the problem is with linking nginx and php.

Explain how to solve this issue, please.

Project structure:

    project/
    ├── docker-compose.yml
    ├── nginx/
    │   ├── default.conf
    │   ├── html/
    │   └── Dockerfile
    ├── php/
    │   ├── index.php
    │   └── Dockerfile

Here is docker-compose.yml:


    version: '3.8'
    services:
      nginx:
        build: ./nginx
        image: nginx:latest
        container_name: nginx
        ports:
          - "80:80"
        volumes:
          - ./nginx/html:/var/www/html
        depends_on:
          - php
        networks:
          - app_network
    
      php:
        build: ./php
        image: php:8.2-fpm
        container_name: php
        volumes:
          - ./php:/var/www/html
        networks:
          - app_network
    
    networks:
      app_network:
        driver: bridge

nginx/default.conf:


    server {
        listen 80;
        server_name localhost;
    
        root /var/www/html;
        index index.php index.html;
    
        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }
    
        location ~ .php$ {
            fastcgi_pass php:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
    }

nginx/Dockerfile:


    FROM nginx:latest
    COPY default.conf /etc/nginx/conf.d/
    COPY ./html /usr/share/nginx/html

Docker Desktop logs:

  • php:

    NOTICE: fpm is running, pid 1
    NOTICE: ready to handle connections

  • nginx:

    /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
    /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
    /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
    10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
    10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
    /docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
    /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
    /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
    /docker-entrypoint.sh: Configuration complete; ready for start up
    2025/05/25 08:03:14 [notice] 1#1: using the "epoll" event method
    2025/05/25 08:03:14 [notice] 1#1: nginx/1.27.5
    2025/05/25 08:03:14 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14) 
    2025/05/25 08:03:14 [notice] 1#1: OS: Linux 5.15.167.4-microsoft-standard-WSL2
    2025/05/25 08:03:14 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
    2025/05/25 08:03:14 [notice] 1#1: start worker processes
    2025/05/25 08:03:14 [notice] 1#1: start worker process 29
    2025/05/25 08:03:14 [notice] 1#1: start worker process 30
    2025/05/25 08:03:14 [notice] 1#1: start worker process 31
    2025/05/25 08:03:14 [notice] 1#1: start worker process 32
    2025/05/25 08:03:14 [notice] 1#1: start worker process 33
    2025/05/25 08:03:14 [notice] 1#1: start worker process 34
    2025/05/25 08:03:14 [notice] 1#1: start worker process 35
    2025/05/25 08:03:14 [notice] 1#1: start worker process 36
    2025/05/25 08:03:14 [notice] 1#1: start worker process 37

Sorry about such amount of text.