Descripción del Ambiente
./docker-compose.yml
El archivo ./docker-compose.yml
es un archivo YAML que define servicios, redes y volúmenes para una aplicación Docker.
YAML es un lenguaje de serialización de datos fácil de usar para todos los lenguajes de programación.
Avancemos y construyamos dicho archivo en la raíz de nuestro proyecto Laravel. Tenga en cuenta que estamos estableciendo dos (2) bloques: services
y networks
respectivamente.
version: "3.9"
services:
php_appname:
# omitted for brevity ...
nginx_appname:
# omitted for brevity ...
pgsql_appname:
# omitted for brevity ...
networks:
# omitted for brevity ...
En el primer bloque establecemos los servicios básicos que necesitamos para levantar una aplicación Laravel. En este caso, PHP, Nginx y PostgreSQL.
Ya sabemos que Nginx pudiera ser sustituido por Apache2; y PostgreSQL, por MySQL por ejemplo.
Para seguir un standar, usaremos la palabra appname
como nombre de la aplicación. Así que sientase libre de cambiarlo si así lo desea.
El servicio PHP
Empecemos con el servicio php_appname
.
version: "3.9"
services:
php_appname:
build:
context: .
dockerfile: Dockerfile
container_name: appname_php
# restart: always
tty: true
working_dir: /var/www/html/
volumes:
- ./:/var/www/html/
- ./php/laravel.ini:/usr/local/etc/php/conf.d/laravel.ini
networks:
- appname-network
nginx_appname:
# omitted for brevity ...
pgsql_appname:
# omitted for brevity ...
networks:
# omitted for brevity ...
Tenga en cuenta lo siguiente:
- El contexto del servicio
php_appname
se establece en la raiz del proyecto. Por lo que será descrito en el archivoDockerfile
que está ubicado directamente en la misma carpeta. - Este contenedor se llamará
appname_php
. - Una vez que agregue un
tty: true
al contenedor,bash
podrá crear una sesión interactiva. - El directorio de trabajo será
/var/www/html/
- En
volumes
establecemos las carpetas que serán espejo:./
espejo de/var/www/html/
./php/laravel.ini
espejo de/usr/local/etc/php/conf.d/laravel.ini
.
- El servicio será expuesto por la red
appname-network
.
El servicio Nginx
Avancemos con el servicio nginx_appname
.
version: "3.9"
services:
php_appname:
# omitted for brevity ...
nginx_appname:
depends_on:
- php_appname
build:
context: ./nginx
dockerfile: Dockerfile
container_name: appname_nginx
# restart: always
tty: true
ports:
- "80:80"
networks:
- appname-network
pgsql_appname:
# omitted for brevity ...
networks:
# omitted for brevity ...
Tenga en cuenta lo siguiente:
- El servicio
nginx_appname
depende del serviciophp_appname
. - Para el
build
declaramos lo siguiente:- El
context
de este servicio está ubicado en la carpeta./nginx
. - En la carpeta
./nginx
hay unDockerfile
particular.
- El
- Este contenedor se llamará
appname_nginx
. - Al establecer
tty: true
al contenedor,bash
podrá crear una sesión interactiva. - Saldrá por el puerto
80
. - El servicio también será expuesto por la red
appname-network
.
El servicio PgSql
Avancemos con el servicio pgsql_appname
.
version: "3.9"
services:
php_appname:
# omitted for brevity ...
nginx_appname:
# omitted for brevity ...
pgsql_appname:
container_name: appname_pgsql
image: postgres:13
ports:
- "${DB_PORT}:5432"
environment:
POSTGRES_DB: ${DB_DATABASE}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- "./postgresql:/var/lib/postgresql/data"
networks:
- appname-network
healthcheck:
test: ["CMD", "pg_isready", "-q", "-d", "${DB_DATABASE}", "-U", "${DB_USERNAME}"]
networks:
# omitted for brevity ...
////////////////////////////////////////////
version: "3.9"
services:
php_appname:
# omitted for brevity ...
networks:
- appname-network
nginx_appname:
# omitted for brevity ...
networks:
- appname-network
pgsql_appname:
# omitted for brevity ...
networks:
- appname-network
# omitted for brevity ...
networks:
appname-network:
driver: bridge
////////////////////////////////////////////
version: "3.9"
services:
php_appname:
build:
context: .
dockerfile: Dockerfile
container_name: appname_php
restart: unless-stopped
tty: true
working_dir: /var/www/html/
volumes:
- ./:/var/www/html/
- ./php/laravel.ini:/usr/local/etc/php/conf.d/laravel.ini
networks:
- appname-network
nginx_appname:
depends_on:
- php_appname
build:
context: ./nginx
dockerfile: Dockerfile
container_name: appname_nginx
restart: unless-stopped
tty: true
ports:
- "80:80"
networks:
- appname-network
pgsql_appname:
container_name: appname_pgsql
image: postgres:13
ports:
- "${DB_PORT}:5432"
environment:
POSTGRES_DB: ${DB_DATABASE}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- "./postgresql:/var/lib/postgresql/data"
networks:
- appname-network
healthcheck:
test: ["CMD", "pg_isready", "-q", "-d", "${DB_DATABASE}", "-U", "${DB_USERNAME}"]
networks:
appname-network:
driver: bridge
./Dockerfile
FROM php:8.1.0-fpm
# Copy composer.lock and composer.json into the working directory
COPY composer.lock composer.json /var/www/html/
# Set working directory
WORKDIR /var/www/html/
# Install dependencies for the operating system software
RUN apt-get update && apt-get install -y \
build-essential \
libpq-dev \
libpng-dev \
libonig-dev \
libzip-dev \
libjpeg62-turbo-dev \
libfreetype6-dev \
locales \
zip \
jpegoptim optipng pngquant gifsicle \
vim \
unzip \
git \
curl
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install extensions for php
RUN docker-php-ext-install mbstring zip exif pcntl
RUN docker-php-ext-install pdo pgsql pdo_pgsql
RUN docker-php-ext-install gd
# Install composer (php package manager)
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Copy existing application directory contents to the working directory
COPY . /var/www/html
# Assign permissions of the working directory to the www-data user
RUN chown -R www-data:www-data \
/var/www/html/storage \
/var/www/html/bootstrap/cache
# Expose port 9000 and start php-fpm server (for FastCGI Process Manager)
EXPOSE 9000
CMD ["php-fpm"]
./nginx/Dockerfile
FROM nginx:1.23.1
COPY ./default.conf /etc/nginx/conf.d/default.conf
default.conf
server {
listen 80;
server_name localhost;
index index.php index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/html/public;
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass appname_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;
}
}