Afinal o que é Docker?
De maneira simplificada para não assustar ninguém, o Docker é uma forma de container onde utiliza o OS para compartimentar configurações padrões, a grande vantagem do mesmo é o deploy em produção e os ambientes de todos os devs estarem alinhados mesmo que os devs utilizem múltiplos OS diferentes.
Ao meu ver a grande vantagem do Docker em relação a VM pra desenvolvimento é que a VM você compartimenta recursos e instalado um OS do zero inclusive toda vez que precisa usa-lo você precisa dar boot no sistema operacional da VM, no Docker isso não é necessário mas como é feita essa diferenciação?
Aproveitando que preciso desenvolver um Docker para testar o Blog Open Source que desenvolvi, https://github.com/andmarruda/sbblog vou configurar um ensinando passo a passo aqui como fazer seu primeiro container Docker.
Mas Anderson, porque não usa o sail do laravel?
Se usasse o sail do laravel eu não poderia fazer uma boa introdução ao Docker para quem é muito recém chegado ao mesmo.
Pude perceber que pelo sistema ser nativo o Linux tem uma eficiência muito grande rodando Docker, já o Windows tem algumas dificuldades relacionada ao WSL2 e a conversão de formatação de arquivo, muitas vezes tendo que converter de NTFS pra EXT4 o que causa uma lentidão absurda, no Mac ainda não tive experiência mas estou ansioso para ter.
Como contornei a lentidão no Windows?
Procuro configurar o Docker sempre usando o Ubuntu dentro do Linux o que aumenta e muito a eficiência e desempenho do container. Mas caso queiram que eu comentei mais sobre isso por favor digam nos comentários, #comoMelhorarDockerWsl2
O SBBlog foi projetado para rodar com Laravel 9 e PostgreSQL por isso irei pegar uma imagem de php-fpm de dockerfile para iniciar o pensamento do container do Docker para esse projeto.
O PostgreSQL vai ter suas características e configurações, não somente o nginx e o php, por isso é necessário que se atente e não as esqueça para trás.
A primeira coisa que fiz foi procurar referências de imagens oficiais:
Vão perceber que grande parte das soluções que você pensa em customizar manualmente já foi prevista pelas imagens oficiais no Docker, então é sempre bom tentar ler antes de tentar fazer configurações na mão, configurações na mão requer muita experiência e muito experimento até que seja refinado e flua da forma adequada a seu problema, dito isso vamos prosseguir.
docker-compose.yml
Primeiro eu criei uma pasta na raiz do projeto chamada docker-compose onde ficará armazenado os arquivos de configuração dos serviços que irei utilizar, os arquivos de PostgreSQL eu já falei em outros posts então não vou entrar em detalhes deles para não ficar muito longo.
Aqui estão os arquivos que utilizei.
https://github.com/andmarruda/docker-pgsql-php-laravel
Afinal o que é o Docker-compose.yml?
É o arquivo que descreve a composição, os pacotes, instalações, portas e configurações gerais que o Docker terá que executar.
Dockerfile
Arquivo de configuração usado no Docker para construir imagens de contêiner personalizadas, descrevendo passos e as configurações necessárias para criar uma imagem de contêiner específica que pode ser usada para executar aplicativos ou serviços em seus respectivos contêineres.
version: "3.7"
services:
app:
build:
args:
user: root
uid: 1000
context: ./
dockerfile: Dockerfile
image: sbblog-laravel
container_name: sbblog-dockerized
restart: unless-stopped
working_dir: /var/www
volumes:
- ./:/var/www
networks:
- sbblog-network
command: ["sh", "-c", "php-fpm && composer update && php artisan migrate"]
nginx:
image: nginx
container_name: sbblog-nginx
restart: unless-stopped
ports:
- "100:80"
volumes:
- ./:/var/www
- ./docker-compose/nginx:/etc/nginx/conf.d/
networks:
- sbblog-network
pgsqldb:
image: postgres:16
container_name: sbblog-pgsqldb
restart: unless-stopped
ports:
- "5432:5432"
environment:
POSTGRES_USER: sbblog_user
POSTGRES_PASSWORD: Sbblog@123
POSTGRES_DB: sbblogdb
volumes:
- sbblog-dbdata:/var/lib/postgresql/16/main
- ./docker-compose/pg_hba.conf:/etc/postgresql/16/main/pg_hba.conf
- ./docker-compose/postgresql.conf:/etc/postgresql/16/main/postgresql.conf
networks:
- sbblog-network
networks:
sbblog-network:
driver: bridge
name: sbblog-network
volumes:
sbblog-dbdata:
driver: local
Dockerfile
FROM php:8.2-fpm
ARG user
ARG uid
RUN apt update && apt install -y \
git \
curl \
libcurl4-openssl-dev \
sudo \
nano \
apt \
wget \
libpng-dev \
libonig-dev \
libxml2-dev \
libpq-dev \
zip \
libzip-dev \
unzip \
software-properties-common && \
rm -rf /var/lib/apt/lists/*
RUN docker-php-ext-install pdo_pgsql mbstring exif pcntl bcmath gd zip curl opcache xml zip
RUN pecl install xdebug && docker-php-ext-enable xdebug
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
RUN mkdir -p /home/$user/.composer && \
chown -R $user:$user /home/$user && \
chmod -R 777 /home/$user/.composer && \
composer config --global process-timeout 2000
WORKDIR /var/www
USER $user
Criei esse Docker como base para ambiente de desenvolvimento, também é uma base para produção porém para isso deve-se considerar melhorar a segurança, evitar utilizar usuário como root e afins, adicionando alguns passos adicionais para que o ambiente fique seguro.
Esse é meu primeiro tutorial do Docker, se gostaram por favor compartilhem, espero ajudar vocês, se quiserem deixar comentários me ensinando coisas novas por favor fiquem a vontade.
Espero vocês no próximo artigo... Até mais!
Seja o primeiro a comentar o nosso artigo!