PHP Angular Docker Setup
November 4, 2024 · AI Conversations
Here’s an example of how you can configure your `docker-compose.yml` file for this setup:
version: '3.8'
services:
# PHP Backend Service
php:
image: php:8.2-fpm
container_name: php_backend
working_dir: /var/www
volumes:
- .:/var/www
- ./php.ini:/usr/local/etc/php/php.ini # Custom PHP config (if needed)
networks:
- app-network
environment:
- APP_ENV=local
- APP_DEBUG=true
depends_on:
- db
# Nginx to serve PHP
nginx:
image: nginx:latest
container_name: nginx
volumes:
- .:/var/www
- ./nginx.conf:/etc/nginx/nginx.conf # Custom Nginx config
ports:
- "80:80"
networks:
- app-network
depends_on:
- php
# MySQL Database
db:
image: mysql:8.0
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: mydb
MYSQL_USER: user
MYSQL_PASSWORD: password
volumes:
- db-data:/var/lib/mysql
networks:
- app-network
# Angular Frontend Service
angular:
image: node:latest
container_name: angular_frontend
working_dir: /app
volumes:
- ./angular:/app
ports:
- "4200:4200" # Angular dev server
command: "npm install && npm start" # Install dependencies and start Angular dev server
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
db-data:
### Additional Files
1. **Nginx Configuration (`nginx.conf`)**:
Configure Nginx to serve the PHP backend. Here’s an example of a basic configuration file:
server {
listen 80;
server_name localhost;
root /var/www/public;
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;
}
}
2. **Angular Setup**:
– Place your Angular project in the `angular` directory.
– Adjust the `command` under the `angular` service if necessary, especially if you're using different npm scripts.
3. **PHP Application (Laravel) Setup**:
– Place your Laravel application files in the project root so they mount correctly into the `/var/www` directory in the `php` service.
– Customize your `.env` file for Laravel to connect to the `db` container.
### Running the Application
To build and run the containers, use:
docker-compose up -d --build
Your PHP backend will be available at `localhost:80`, and your Angular frontend at `localhost:4200`. Adjust the API calls in your Angular application to point to the backend's endpoint (`http://localhost/api` or similar).
networks:
wpbedrock:
driver: bridge
services:
# Nginx Service
nginx:
image: nginx:stable-alpine
container_name: ${APP_NAME}_nginx
ports:
– "2500:80"
restart: always
links:
– php
volumes:
– ./bedrock:/var/www/html
– ./docker/nginx/site.conf:/etc/nginx/conf.d/default.conf:rw
– ./docker/logs/nginx:/var/logs/nginx:rw
depends_on:
– php
– mysql
networks:
– wpbedrock
# PHP Service
php:
build:
context: .
dockerfile: Dockerfile
container_name: ${APP_NAME}_php
volumes:
– ./bedrock:/var/www/html # Fixed typo in path
ports:
– "2501:9000"
restart: always
networks:
– wpbedrock
# MySQL Service
mysql:
image: mysql:8.0
container_name: ${APP_NAME}_mysql_db
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: ${DB_NAME}
MYSQL_USER: ${DB_USER}
MYSQL_PASSWORD: ${DB_PASSWORD}
volumes:
– db_data:/var/lib/mysql
ports:
– "2502:3306"
networks:
– wpbedrock
# # Node Service
# node:
# image: node:latest # Use an appropriate Node.js version
# working_dir: /var/www/html
# volumes:
# – ./bedrock:/var/www/html
# networks:
# – wpbedrock
# Adminer Service
adminer:
image: adminer
container_name: ${APP_NAME}_adminer
ports:
– "2530:8080"
restart: always
networks:
– wpbedrock
volumes:
db_data:
add in above
version: '3.8'
networks:
wpbedrock:
driver: bridge
services:
# Nginx Service
nginx:
image: nginx:stable-alpine
container_name: ${APP_NAME}_nginx
ports:
- "2500:80"
restart: always
links:
- php
volumes:
- ./bedrock:/var/www/html
- ./docker/nginx/site.conf:/etc/nginx/conf.d/default.conf:rw
- ./docker/logs/nginx:/var/logs/nginx:rw
depends_on:
- php
- mysql
networks:
- wpbedrock
# PHP Service
php:
build:
context: .
dockerfile: Dockerfile
container_name: ${APP_NAME}_php
volumes:
- ./bedrock:/var/www/html
ports:
- "2501:9000"
restart: always
networks:
- wpbedrock
# MySQL Service
mysql:
image: mysql:8.0
container_name: ${APP_NAME}_mysql_db
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: ${DB_NAME}
MYSQL_USER: ${DB_USER}
MYSQL_PASSWORD: ${DB_PASSWORD}
volumes:
- db_data:/var/lib/mysql
ports:
- "2502:3306"
networks:
- wpbedrock
# Node (Angular) Service
angular:
image: node:latest # Use the latest Node.js image or specify a version
container_name: ${APP_NAME}_angular
working_dir: /app
volumes:
- ./angular:/app # Assuming your Angular project is in the "angular" folder
ports:
- "4200:4200" # Expose Angular's default dev server port
command: "npm install && npm start" # Adjust as needed
networks:
- wpbedrock
# Adminer Service
adminer:
image: adminer
container_name: ${APP_NAME}_adminer
ports:
- "2530:8080"
restart: always
networks:
- wpbedrock
volumes:
db_data:
### Explanation of the Angular Configuration
– **`angular` service**: This service uses the Node.js image and is set up to serve your Angular app.
– **`volumes`**: Mounts the `angular` directory (where your Angular project is located) to `/app` in the container.
– **`ports`**: Exposes port `4200` (the Angular default port) on `localhost` to allow access to your Angular application.
– **`command`**: Runs `npm install` to install dependencies, followed by `npm start` to start the Angular development server.
With this setup, your Angular frontend will be accessible at `http://localhost:4200`, and the PHP backend will be accessible at `http://localhost:2500`. Adjust API calls in Angular to match the PHP service's endpoint (e.g., `http://localhost:2500/api`).
For example:
services:
app:
image: node:latest
working_dir: /usr/src/app
command: "npm start"
In this setup:
– The container will set `/usr/src/app` as the current directory when it starts.
– Commands such as `npm start` will be executed within `/usr/src/app`.
The `working_dir` is useful for ensuring that your commands and other configurations run in the correct directory, especially when your application files are located in a specific folder in the container.
### Types of Volumes
1. **Bind Mounts**: Link a specific path on your host machine to a path in the container.
volumes:
- /host/path:/container/path
– Example: `- ./app:/usr/src/app` mounts the `app` folder from your host machine into `/usr/src/app` in the container.
– Changes in either the host or the container are reflected in the other.
2. **Named Volumes**: Store data in Docker’s managed storage space rather than a specific host path. Docker manages the location, making it portable and useful for consistent data storage.
volumes:
- my-volume:/container/path
– Example: `- db_data:/var/lib/mysql` stores data for MySQL in a Docker-managed volume named `db_data`.
– Named volumes are useful for persisting databases or other important data.
### Examples of `volumes` in `docker-compose.yml`
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: password
volumes:
- db_data:/var/lib/mysql # Named volume for database persistence
web:
image: nginx:latest
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf # Bind mount for custom config
- ./app:/usr/share/nginx/html # Bind mount for application files
volumes:
db_data: # Named volume definition
### Summary
– **Bind mounts** are useful for developing locally because you see live changes reflected inside the container.
– **Named volumes** are ideal for data you need Docker to manage persistently across container lifecycles.
angular:
image: node:latest # Use the latest Node.js image or specify a version
container_name: ${APP_NAME}_angular
working_dir: /app
volumes:
– ./angular:/app # Assuming your Angular project is in the "angular" folder
ports:
– "4200:4200" # Expose Angular's default dev server port
command: "npm install && npm start" # Adjust as needed
networks:
– wpbedrock
explain above
# Node (Angular) Service
angular:
image: node:latest # Use the latest Node.js image or specify a version
container_name: ${APP_NAME}_angular
working_dir: /app
volumes:
- ./angular:/app # Assuming your Angular project is in the "angular" folder
ports:
- "4200:4200" # Expose Angular's default dev server port
command: "npm install && npm start" # Adjust as needed
networks:
- wpbedrock
### Explanation of Each Part
– **Service Name (`angular`)**:
– This is the name of the service within Docker Compose. Each service runs in its own container, and `angular` is specifically set up to handle the Angular frontend.
– **`image: node:latest`**:
– Specifies the Docker image to use for this container. `node:latest` pulls the latest Node.js image from Docker Hub, which includes Node.js and npm, essential for running Angular.
– You can also specify a specific Node.js version, like `node:18`, if you want more control over compatibility.
– **`container_name: ${APP_NAME}_angular`**:
– Sets a custom name for the container based on the `APP_NAME` environment variable. This can make it easier to identify and manage the container.
– `${APP_NAME}` is an environment variable defined in your `.env` file. If `APP_NAME` is set to `myproject`, the container name would be `myproject_angular`.
– **`working_dir: /app`**:
– Sets the working directory inside the container to `/app`. Any commands, such as `npm install`, will run within this directory by default.
– **`volumes:`**
– `- ./angular:/app` mounts the `angular` directory on your host (local machine) to the `/app` directory inside the container.
– This setup allows the container to access and work with the code files from your Angular project directly, reflecting changes you make to the Angular project files on your local machine.
– **`ports:`**
– `- "4200:4200"` maps port 4200 on the container to port 4200 on your host machine.
– This is necessary because the Angular development server usually runs on port 4200, so exposing this port allows you to access the Angular app by going to `http://localhost:4200` in your web browser.
– **`command: "npm install && npm start"`**
– Specifies the command to run when starting the container. Here, `npm install` installs all dependencies from the `package.json` file, and `npm start` launches the Angular development server.
– This setup ensures that any dependencies are installed each time you start the container and that the Angular app is served.
– **`networks:`**
– `- wpbedrock` connects the container to the `wpbedrock` network. This network connection allows the Angular container to communicate with other services on the same network, such as the PHP and MySQL containers.