diff --git a/nginx-php-mysql/README.md b/nginx-php-mysql/README.md new file mode 100644 index 0000000..5c849ad --- /dev/null +++ b/nginx-php-mysql/README.md @@ -0,0 +1,68 @@ +## Compose sample application +### PHP server with an Nginx proxy and a MySQL database + +Project structure: +``` +. +├── backend +│   ├── Dockerfile +├── db +│   └── password.txt +├── docker-compose.yaml +├── proxy +│   ├── conf +│   └── Dockerfile +├── src +│   ├── index.php +└── README.md +``` + +[_docker-compose.yaml_](docker-compose.yaml) +``` +services: + backend: + build: backend + ... + db: + image: mysql:8.0.19 + ... + proxy: + build: proxy + ports: + - 80:80 + ... +``` +The compose file defines an application with three services `proxy`, `backend` and `db`. +When deploying the application, docker-compose maps port 80 of the proxy service container to port 80 of the host as specified in the file. +Make sure port 80 on the host is not already in use. + +## Deploy with docker-compose + +``` +$ docker-compose up -d +Creating nginx-php-mysql_db_1 ... done +Creating nginx-php-mysql_backend_1 ... done +Creating nginx-php-mysql_proxy_1 ... done +``` + +## Expected result + +Listing containers must show three containers running and the port mapping as below: +``` +$ docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +2244050972fc nginx-php-mysql_proxy "/docker-entrypoint.…" 51 seconds ago Up 49 seconds 0.0.0.0:80->80/tcp nginx-php-mysql_proxy_1 +75353040cb38 nginx-php-mysql_backend "docker-php-entrypoi…" 51 seconds ago Up 50 seconds 9000/tcp nginx-php-mysql_backend_1 +e54bd7e0c790 mysql:8.0.19 "docker-entrypoint.s…" 52 seconds ago Up 50 seconds 3306/tcp, 33060/tcp nginx-php-mysql_db_1 +``` + +After the application starts, navigate to `http://localhost:80` in your web browser or run: +``` +$ curl localhost:80 +

hello world in php!

+``` + +Stop and remove the containers +``` +$ docker-compose down +``` diff --git a/nginx-php-mysql/backend/Dockerfile b/nginx-php-mysql/backend/Dockerfile new file mode 100755 index 0000000..b8b661e --- /dev/null +++ b/nginx-php-mysql/backend/Dockerfile @@ -0,0 +1 @@ +FROM php:8.0.3-fpm-buster \ No newline at end of file diff --git a/nginx-php-mysql/db/password.txt b/nginx-php-mysql/db/password.txt new file mode 100644 index 0000000..cea6d05 --- /dev/null +++ b/nginx-php-mysql/db/password.txt @@ -0,0 +1 @@ +db-q5n2g \ No newline at end of file diff --git a/nginx-php-mysql/docker-compose.yaml b/nginx-php-mysql/docker-compose.yaml new file mode 100644 index 0000000..d94581e --- /dev/null +++ b/nginx-php-mysql/docker-compose.yaml @@ -0,0 +1,34 @@ +version: "3.8" +services: + backend: + build: backend + secrets: + - db-password + depends_on: + - db + volumes: + - ./src:/var/www/html # this part seems repetitive (jb) + db: + image: mysql:8.0.19 + command: '--default-authentication-plugin=mysql_native_password' + restart: always + secrets: + - db-password + volumes: + - db-data:/var/lib/mysql + environment: + - MYSQL_DATABASE=example + - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db-password + proxy: + build: proxy + ports: + - 80:80 + depends_on: + - backend + volumes: + - ./src:/var/www/html # this part seems repetitive (jb) +volumes: + db-data: +secrets: + db-password: + file: db/password.txt diff --git a/nginx-php-mysql/proxy/Dockerfile b/nginx-php-mysql/proxy/Dockerfile new file mode 100755 index 0000000..058d4d8 --- /dev/null +++ b/nginx-php-mysql/proxy/Dockerfile @@ -0,0 +1,2 @@ +FROM nginx:1.19.8-alpine +COPY conf /etc/nginx/conf.d/default.conf \ No newline at end of file diff --git a/nginx-php-mysql/proxy/conf b/nginx-php-mysql/proxy/conf new file mode 100755 index 0000000..e0f5acf --- /dev/null +++ b/nginx-php-mysql/proxy/conf @@ -0,0 +1,32 @@ +server { + location ~ /.well-known { + allow all; + } + + location ~ /\.ht { + deny all; + } + + root /var/www/html; + + index index.php index.html; + + location / { + try_files $uri $uri/ /index.php?$args; + } + + location ~ [^/]\.php(/|$) { + fastcgi_split_path_info ^(.+?\.php)(/.*)$; + if (!-f $document_root$fastcgi_script_name) { + return 404; + } + + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_param PATH_INFO $fastcgi_path_info; + fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; + + fastcgi_pass backend:9000; + fastcgi_index index.php; + } +} \ No newline at end of file diff --git a/nginx-php-mysql/src/index.php b/nginx-php-mysql/src/index.php new file mode 100644 index 0000000..cc450d5 --- /dev/null +++ b/nginx-php-mysql/src/index.php @@ -0,0 +1,3 @@ +hello world in php!'; +?> \ No newline at end of file