Docker-Compose with Laravel Application server, Nginx, MySQL server, Python Django, Golang Gin API
Docker-Compose is a powerful tool that enables developers to define and manage multi-container Docker applications. In this guide, we’ll explore how to use Docker-Compose to orchestrate a diverse set of services for a full-stack application. Our example application will include Laravel as the application server, Nginx as the web server, MySQL for database storage, Python with Django for the backend, and Golang with Gin for the API.
Setting Up the Project Structure
Start by creating a project directory and organizing it into subdirectories for each service:
mkdir multi-service-app cd multi-service-app
Inside the project directory, create the following structure:
multi-service-app/ |-- app/ | |-- (Django and Python files) |-- laravel/ | |-- (Laravel files) |-- nginx/ | |-- (Nginx configuration) |-- go/ | |-- (Gin and Golang files) |-- docker-compose.yml
Docker-Compose Configuration
Create a docker-compose.yml
file in the project root to define the services, networks, and volumes:
version: '3' services: laravel: build: context: ./laravel volumes: - ./laravel:/var/www/html ports: - "8000:8000" nginx: build: context: ./nginx ports: - "80:80" depends_on: - laravel mysql: image: mysql:latest environment: MYSQL_ROOT_PASSWORD: rootpass MYSQL_DATABASE: laravel_db MYSQL_USER: laravel_user MYSQL_PASSWORD: laravel_pass django: build: context: ./app volumes: - ./app:/app ports: - "8001:8001" golang: build: context: ./go ports: - "8080:8080"
This docker-compose.yml
file specifies services for Laravel, Nginx, MySQL, Django, and Golang. It also defines the necessary configurations and dependencies between services.
Dockerfile for Laravel
Create a Dockerfile
inside the laravel
directory:
FROM php:7.4-fpm WORKDIR /var/www/html RUN apt-get update && apt-get install -y \ git \ unzip \ libzip-dev \ && docker-php-ext-install pdo_mysql zip RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer COPY . . RUN composer install
This Dockerfile sets up a PHP environment, installs necessary dependencies, and copies the Laravel application files.
Dockerfile for Nginx
Create a Dockerfile
inside the nginx
directory:
FROM nginx:latest COPY ./nginx.conf /etc/nginx/nginx.conf COPY ./laravel/public /var/www/html EXPOSE 80
This Dockerfile configures Nginx by replacing its default configuration with a custom nginx.conf
file and copying the Laravel application files to the appropriate directory.
Dockerfile for Django (app directory)
Create a Dockerfile
inside the app
directory:
FROM python:3.8 WORKDIR /app COPY . . RUN pip install -r requirements.txt CMD ["python", "manage.py", "runserver", "0.0.0.0:8001"]
This Dockerfile sets up a Python environment, installs dependencies, and runs the Django development server.
Dockerfile for Golang
Create a Dockerfile
inside the go
directory:
FROM golang:latest WORKDIR /app COPY . . RUN go build -o main . CMD ["./main"]
This Dockerfile sets up a Golang environment, copies the Golang application files, and builds the executable.
Nginx Configuration (nginx directory)
Create an nginx.conf
file inside the nginx
directory:
server { listen 80; server_name localhost; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass laravel:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; }
This configuration file defines how Nginx should handle requests and proxy them to the Laravel PHP-FPM container.
Running the Application
Navigate to the project root directory and execute the following command:
docker-compose up --build
This command will build the necessary Docker images and start the containers for Laravel, Nginx, MySQL, Django, and Golang.
Access the Laravel application at http://localhost:8000, the Django application at http://localhost:8001, and the Golang API at http://localhost:8080.
Conclusion
Docker-Compose is a powerful tool for simplifying the deployment and orchestration of multi-container applications. In this guide, we’ve demonstrated how to use Docker-Compose to bring together a diverse set of services, including Laravel, Nginx, MySQL, Django, and Golang, into a cohesive and easily manageable development environment. This approach allows developers to work with multiple technologies seamlessly, fostering collaboration and efficient development workflows.