{"id":15148348,"url":"https://github.com/samuelbarbosadev/learning_docker","last_synced_at":"2026-01-20T20:03:22.156Z","repository":{"id":206970688,"uuid":"718101016","full_name":"SamuelBarbosaDev/Learning_Docker","owner":"SamuelBarbosaDev","description":"Bem-vindo ao meu repositório de estudos sobre Docker e Docker Compose.","archived":false,"fork":false,"pushed_at":"2023-11-15T15:40:51.000Z","size":3,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-07T02:47:19.143Z","etag":null,"topics":["docker","docker-compose","dockerfile","pi-hole"],"latest_commit_sha":null,"homepage":"https://docs.docker.com/get-started/overview/","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SamuelBarbosaDev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-11-13T11:35:42.000Z","updated_at":"2023-11-15T15:41:44.000Z","dependencies_parsed_at":"2024-11-02T07:04:58.444Z","dependency_job_id":"7b6ba70a-b112-4556-a636-d6f67bd9d228","html_url":"https://github.com/SamuelBarbosaDev/Learning_Docker","commit_stats":{"total_commits":8,"total_committers":2,"mean_commits":4.0,"dds":0.125,"last_synced_commit":"3b2674099cfd99249437e83be91636d0a7afa475"},"previous_names":["samuelbarbosadev/learning_docker"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SamuelBarbosaDev%2FLearning_Docker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SamuelBarbosaDev%2FLearning_Docker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SamuelBarbosaDev%2FLearning_Docker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SamuelBarbosaDev%2FLearning_Docker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SamuelBarbosaDev","download_url":"https://codeload.github.com/SamuelBarbosaDev/Learning_Docker/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247584061,"owners_count":20962071,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","docker-compose","dockerfile","pi-hole"],"created_at":"2024-09-26T13:03:15.584Z","updated_at":"2026-01-20T20:03:22.151Z","avatar_url":"https://github.com/SamuelBarbosaDev.png","language":null,"readme":"# Learning Docker\n\n## Guia Completo para Uso do Docker e Docker Compose\n\n## Índice\n\n- [Learning Docker](#learning-docker)\n  - [Guia Completo para Uso do Docker e Docker Compose](#guia-completo-para-uso-do-docker-e-docker-compose)\n  - [Índice](#índice)\n  - [Introdução](#introdução)\n  - [Conceitos Básicos](#conceitos-básicos)\n    - [Container](#container)\n    - [Imagem (Image)](#imagem-image)\n    - [Volume](#volume)\n    - [Docker Compose](#docker-compose)\n  - [Principais Comandos e Flags](#principais-comandos-e-flags)\n    - [Docker Run e Flags](#docker-run-e-flags)\n    - [Outros Comandos Interessantes](#outros-comandos-interessantes)\n  - [Trabalhando com Docker Compose](#trabalhando-com-docker-compose)\n    - [Comandos do Docker Compose](#comandos-do-docker-compose)\n  - [Visualizando Logs](#visualizando-logs)\n    - [Docker (Container Único)](#docker-container-único)\n    - [Docker Compose logs](#docker-compose-logs)\n  - [Exemplos Práticos](#exemplos-práticos)\n    - [1. Rodando um Container em Modo Detached com Port Mapping](#1-rodando-um-container-em-modo-detached-com-port-mapping)\n    - [2. Executando um Container em Modo Interativo](#2-executando-um-container-em-modo-interativo)\n    - [3. Definindo Variáveis de Ambiente no Container](#3-definindo-variáveis-de-ambiente-no-container)\n    - [4. Construindo e Rodando uma Aplicação Multi-Container com Docker Compose](#4-construindo-e-rodando-uma-aplicação-multi-container-com-docker-compose)\n  - [Como instalar](#como-instalar)\n    - [Postgres](#postgres)\n    - [PgAdmin](#pgadmin)\n  - [Entendendo o Dockerfile](#entendendo-o-dockerfile)\n    - [Exemplo Atualizado de Dockerfile](#exemplo-atualizado-de-dockerfile)\n    - [Explicação dos Elementos](#explicação-dos-elementos)\n  - [Explorando o docker-compose.yml](#explorando-o-docker-composeyml)\n    - [Exemplo Atualizado de docker-compose.yml](#exemplo-atualizado-de-docker-composeyml)\n    - [Explicação dos Elementos - Compose](#explicação-dos-elementos---compose)\n  - [Considerações Finais](#considerações-finais)\n\n---\n\n## Introdução\n\nO **Docker** é uma ferramenta que utiliza a tecnologia de container para empacotar, distribuir e executar aplicações de forma isolada. Com ele, conseguimos criar ambientes consistentes, replicáveis e portáveis através de imagens que contêm todo o software e dependências necessárias em um container.\n\nEste guia foi desenvolvido para ajudar o Samuel a entender e utilizar o Docker, seja para desenvolvimento, testes ou ambientes de produção.\n\n---\n\n## Conceitos Básicos\n\n### Container\n\n- **Container** é uma instância de uma imagem em execução.  \n- Ele isola a aplicação e suas dependências em um ambiente leve e portátil.  \n- Comandos comuns: `docker run`, `docker container ls`, `docker container ls -a`, `docker container stop`, `docker container rm`.\n\n### Imagem (Image)\n\n- **Imagem** é o \"template\" que contém o sistema de arquivos e as dependências necessárias para executar uma aplicação.  \n- Você pode construir suas próprias imagens com um **Dockerfile** ou baixá-las do Docker Hub.  \n- Comandos comuns: `docker build`, `docker pull`, `docker images`, `docker image ls`, `docker image rm`, `docker tag`, `docker push`.\n\n### Volume\n\n- **Volume** é um recurso usado para persistir dados gerados e utilizados pelos containers.  \n- Diferentemente do sistema de arquivos dos containers (efêmero), os volumes permitem que os dados sobrevivam a reinicializações de containers.  \n- Comandos comuns: `docker volume create`, `docker volume ls`, `docker volume inspect`, `docker volume rm`.\n\n### Docker Compose\n\n- **Docker Compose** é uma ferramenta que permite definir e orquestrar múltiplos containers com um único arquivo de configuração (geralmente chamado de `docker compose.yml`).  \n- Você pode definir serviços, volumes, networks e dependências em um único arquivo para facilitar o gerenciamento do ambiente.\n\n---\n\n## Principais Comandos e Flags\n\n### Docker Run e Flags\n\nO comando `docker run` é utilizado para iniciar um container. A seguir, explicamos as flags mais comuns:\n\n- **`-d`**:  \n  Executa o container em **modo detached** (em background).  \n  Exemplo:\n\n  ```bash\n  docker run -d my_image\n  ```\n\n- **`-p`**:  \n  Faz o mapeamento de portas entre o host e o container.  \n  Sintaxe: `-p [porta_host:porta_container]`.  \n  Exemplo:  \n\n  ```bash\n  docker run -p 8080:80 my_image\n  ```\n\n- **`-t`**:  \n  Aloca um terminal pseudo-TTY para o container, facilitando a interação, especialmente se usado junto com `-i`.  \n  Exemplo:\n\n  ```bash\n  docker run -t my_image\n  ```\n\n- **`-i`**:  \n  Mantém STDIN (entrada padrão) aberto mesmo se não estiver conectado a um terminal.  \n  Normalmente utilizado com `-t` para sessões interativas (`-it`).  \n  Exemplo:\n\n  ```bash\n  docker run -it my_image bash\n  ```\n\n- **`-e`**:  \n  Define variáveis de ambiente para o container.  \n  Sintaxe: `-e VARIAVEL=valor`.  \n  Exemplo:\n\n  ```bash\n  docker run -e ENV=production my_image\n  ```\n\nOutras flags úteis:\n\n- **`--name`**:  \n  Especifica um nome personalizado para o container.  \n  Exemplo:\n\n  ```bash\n  docker run --name meu_container my_image\n  ```\n\n- **`--rm`**:  \n  Remove automaticamente o container quando ele parar.  \n  Exemplo:\n\n  ```bash\n  docker run --rm my_image\n  ```\n\n### Outros Comandos Interessantes\n\n- **Listar containers em execução:**\n\n  ```bash\n  docker ps\n  ```\n\n- **Listar todos os containers (incluindo os parados):**\n\n  ```bash\n  docker ps -a\n  ```\n\n- **Inspecionar um container:**\n\n  ```bash\n  docker inspect nome_ou_id_do_container\n  ```\n\n- **Remover uma imagem:**\n\n  ```bash\n  docker rmi nome_da_imagem\n  ```\n\n- **Construir uma imagem a partir de um Dockerfile:**\n\n  ```bash\n  docker build -t meu_app:latest .\n  ```\n\n---\n\n## Trabalhando com Docker Compose\n\nO **Docker Compose** permite orquestrar múltiplos containers que compõem sua aplicação. Um exemplo básico de um arquivo `docker compose.yml`:\n\n```yaml\nservices:\n  db:\n    container_name: db\n    image: postgres:16.8\n    environment:\n      POSTGRES_DB: docker_db\n      POSTGRES_USER: docker_user\n      POSTGRES_PASSWORD: docker_password\n    volumes:\n      - db_data:/var/lib/postgresql/data\n    networks:\n      - network_private\n\n  web: \u0026web\n    container_name: web\n    build: .\n    command: \u003e\n      sh -c \"\n        python manage.py migrate\n        gunicorn --bind 0.0.0.0:8000 mysite.wsgi\n      \"\n    environment:\n      - DJANGO_SETTINGS_MODULE=mysite.settings\n      - DB_NAME=docker_db\n      - DB_USER=docker_user\n      - DB_PASSWORD=docker_password\n      - DB_HOST=db\n      - DB_PORT=5432\n    volumes:\n      - ./web:/web\n    depends_on:\n      - db\n    networks:\n      - network_private\n      - network_public\n\n  web-2:\n    container_name: web-2\n    \u003c\u003c: *web\n  nginx:\n    container_name: nginx\n    image: nginx:1.27\n    volumes:\n      - ./nginx:/etc/nginx/conf.d\n    ports:\n      - \"8080:80\"\n    depends_on:\n      - web\n      - web-2\n    restart: always\n    networks:\n      - network_public\n\nvolumes:\n  db_data:\n\nnetworks:\n  network_private:\n    driver: bridge\n  network_public:\n    driver: bridge\n```\n\n### Comandos do Docker Compose\n\n- **Subir os serviços e construir as imagens:**\n\n  ```bash\n  docker compose up --build\n  ```\n\n  Use a flag `-d` para execução em segundo plano:\n\n  ```bash\n  docker compose up --build -d\n  ```\n\n- **Parar os serviços:**\n\n  ```bash\n  docker compose down\n  ```\n\n- **Listar os serviços em execução:**\n\n  ```bash\n  docker compose ps\n  ```\n\n- **Verificar os logs dos serviços:**\n\n  ```bash\n  docker compose logs\n  ```\n\n  Para seguir os logs em tempo real:\n\n  ```bash\n  docker compose logs -f\n  ```\n\n---\n\n## Visualizando Logs\n\n### Docker (Container Único)\n\nPara visualizar os logs de um container específico, utilize:\n\n- **Ver logs:**\n\n  ```bash\n  docker logs nome_ou_id_do_container\n  ```\n\n- **Seguir (tail) os logs em tempo real:**\n\n  ```bash\n  docker logs -f nome_ou_id_do_container\n  ```\n\n### Docker Compose logs\n\nPara ver os logs dos serviços que compõem sua aplicação orquestrada com Docker Compose:\n\n- **Exibir logs de todos os serviços:**\n\n  ```bash\n  docker compose logs\n  ```\n\n- **Seguir os logs em tempo real:**\n\n  ```bash\n  docker compose logs -f\n  ```\n\n- **Exibir logs de um serviço específico, por exemplo, o serviço *web*:**\n\n  ```bash\n  docker compose logs -f web\n  ```\n\n---\n\n## Exemplos Práticos\n\n### 1. Rodando um Container em Modo Detached com Port Mapping\n\n```bash\ndocker run -d -p 8080:80 --name meu_nginx nginx:latest\n```\n\n- **`-d`**: Executa em segundo plano.\n- **`-p 8080:80`**: Mapeia a porta 80 do container para a porta 8080 do host.\n\n### 2. Executando um Container em Modo Interativo\n\n```bash\ndocker run -it --rm ubuntu bash\n```\n\n- **`-it`**: Modo interativo com pseudo-TTY.\n- **`--rm`**: Remove o container após o término da sessão.\n\n### 3. Definindo Variáveis de Ambiente no Container\n\n```bash\ndocker run -e ENV=production -e DEBUG=false my_app_image\n```\n\n- **`-e`**: Define uma ou mais variáveis de ambiente.\n\n### 4. Construindo e Rodando uma Aplicação Multi-Container com Docker Compose\n\n```bash\ndocker compose up --build -d\n```\n\n- Constrói e inicia todos os containers definidos no arquivo `docker compose.yml` em background.\n\n## Como instalar\n\n### Postgres\n\n```shell\n    docker run \\\n    --name postgres-container \\\n    -e POSTGRES_USER=user \\\n    -e POSTGRES_PASSWORD=postgres \\\n    -e POSTGRES_DB=database \\\n    -d \\\n    -p 5434:5432 \\\n    -v postgres-data:/var/lib/postgresql/data \\\n    postgres:latest\n```\n\n### PgAdmin\n\n```shell\n    docker run -d \\\n    --name pg-admin-4 \\\n    -e \"PGADMIN_DEFAULT_EMAIL=email@email.com\" \\\n    -e \"PGADMIN_DEFAULT_PASSWORD=123456\" \\\n    -p 7878:80 \\\n    dpage/pgadmin4\n```\n\n---\n\n## Entendendo o Dockerfile\n\nO **Dockerfile** é um arquivo de texto que contém uma lista de instruções para construir uma imagem Docker. A seguir, veja o exemplo atualizado e a explicação de cada elemento utilizado:\n\n### Exemplo Atualizado de Dockerfile\n\n```dockerfile\nFROM python:3.14-rc\nCOPY ./web /web/\nWORKDIR /web\nEXPOSE 8000\nRUN pip install -r requirements.txt\n```\n\n### Explicação dos Elementos\n\n- **`FROM python:3.14-rc`**  \n  Especifica a imagem base a ser utilizada. Aqui, usamos o Python na versão 3.14-rc (release candidate), representando uma versão recente e em teste.\n\n- **`COPY ./web /web/`**  \n  Copia o conteúdo da pasta local `./web` para dentro do container no diretório `/web/`.\n\n- **`WORKDIR /web`**  \n  Define o diretório de trabalho dentro do container. Todos os comandos subsequentes serão executados a partir desse diretório.\n\n- **`EXPOSE 8000`**  \n  Indica que o container utilizará a porta 8000 para comunicação. Essa instrução serve como documentação e ajuda ferramentas de integração, mas não realiza o mapeamento da porta automaticamente.\n\n- **`RUN pip install -r requirements.txt`**  \n  Executa o comando para instalar as dependências Python listadas no arquivo `requirements.txt`. Essa etapa criará uma nova camada na imagem Docker.\n\n---\n\n## Explorando o docker-compose.yml\n\nO arquivo **docker-compose.yml** permite que você defina e orquestre múltiplos containers que compõem sua aplicação. A seguir, confira o exemplo atualizado e a explicação detalhada de cada parte:\n\n### Exemplo Atualizado de docker-compose.yml\n\n```yaml\nversion: \"3.8\"\n\nservices:\n  db:\n    container_name: db\n    image: postgres:16.8\n    environment:\n      POSTGRES_DB: docker_db\n      POSTGRES_USER: docker_user\n      POSTGRES_PASSWORD: docker_password\n    volumes:\n      - db_data:/var/lib/postgresql/data\n    networks:\n      - network_private\n\n  web: \u0026web\n    container_name: web\n    build: .\n    command: \u003e\n      sh -c \"\n        python manage.py migrate\n        gunicorn --bind 0.0.0.0:8000 mysite.wsgi\n      \"\n    environment:\n      - DJANGO_SETTINGS_MODULE=mysite.settings\n      - DB_NAME=docker_db\n      - DB_USER=docker_user\n      - DB_PASSWORD=docker_password\n      - DB_HOST=db\n      - DB_PORT=5432\n    volumes:\n      - ./web:/web\n    depends_on:\n      - db\n    networks:\n      - network_private\n      - network_public\n\n  web-2:\n    container_name: web-2\n    \u003c\u003c: *web\n\n  nginx:\n    container_name: nginx\n    image: nginx:1.27\n    volumes:\n      - ./nginx:/etc/nginx/conf.d\n    ports:\n      - \"8080:80\"\n    depends_on:\n      - web\n      - web-2\n    restart: always\n    networks:\n      - network_public\n\nvolumes:\n  db_data:\n\nnetworks:\n  network_private:\n    driver: bridge\n  network_public:\n    driver: bridge\n```\n\n### Explicação dos Elementos - Compose\n\n- **`version: \"3.8\"`**  \n  Define a versão do esquema do Docker Compose. A versão 3.8 é compatível com os recursos mais recentes.\n\n- **`services`**  \n  Agrupa os containers que compõem a aplicação:\n\n  - **Serviço `db`:**  \n    - **`container_name: db`** – Nome personalizado para o container.  \n    - **`image: postgres:16.8`** – Imagem do Postgres na versão 16.8.  \n    - **`environment`** – Define variáveis de ambiente para configuração inicial do banco.  \n    - **`volumes`** – Mapeia um volume para a persistência dos dados do PostgreSQL.  \n    - **`networks`** – Conecta este serviço à rede privada para comunicação interna.\n\n  - **Serviço `web`:**  \n    - **`container_name: web`** – Define um nome identificador para o container.  \n    - **`build: .`** – Informa que a imagem deve ser construída usando o _Dockerfile_ presente no diretório atual.  \n    - **`command`** – Sobrescreve o comando padrão para executar as migrações e iniciar o Gunicorn.  \n    - **`environment`** – Configura variáveis de ambiente para o Django se conectar ao banco de dados e outras configurações.  \n    - **`volumes`** – Monta o diretório local `./web` dentro do container, permitindo autorefresh de código.  \n    - **`depends_on`** – Garante que o serviço `db` esteja rodando antes de iniciar o `web`.  \n    - **`networks`** – Conecta o container às redes privada e pública para comunicação interna e externa.\n\n  - **Serviço `web-2`:**  \n    - Usa a âncora `\u0026web` para duplicar as configurações do serviço `web`, facilitando a escalabilidade (balanceamento de carga).\n\n  - **Serviço `nginx`:**  \n    - **`container_name: nginx`** – Nome personalizado para o container Nginx.  \n    - **`image: nginx:1.27`** – Imagem oficial do Nginx na versão 1.27.  \n    - **`volumes`** – Monta a configuração do Nginx a partir do diretório local.  \n    - **`ports`** – Mapeia a porta 80 interna para a porta 8080 externa do host.  \n    - **`depends_on`** – Garante que os serviços `web` e `web-2` estejam ativos antes de iniciar o Nginx.  \n    - **`restart: always`** – Configura o container para reiniciar automaticamente em caso de falhas.  \n    - **`networks`** – Conecta o Nginx à rede pública para exposição externa.\n\n- **`volumes`**  \n  Define o volume `db_data` usado para persistir os dados do PostgreSQL.\n\n- **`networks`**  \n  Cria duas redes:\n  - **`network_private`** para a comunicação interna entre os containers.\n  - **`network_public`** para a exposição externa (por exemplo, para o Nginx).\n\n---\n\n## Considerações Finais\n\nFoi apresentado um guia abrangente para:\n\n- **Utilização do Docker e Docker Compose** para gerenciar containers, imagens e volumes.\n- Compreender as **principais flags** (como `-d`, `-p`, `-t`, `-e`) que influenciam no comportamento dos containers.\n- **Acessar e monitorar logs** dos containers, tanto individualmente quanto via Docker Compose.\n\nDominar esses conceitos e comandos irá facilitar o gerenciamento das suas aplicações em ambientes Docker, proporcionando um fluxo de trabalho mais robusto e escalável.\n\nSe surgirem dúvidas ou se você precisar de mais exemplos, consulte a [documentação oficial do Docker](https://docs.docker.com/) ou este guia novamente. Zé da moeda ou Hurk agiota! 🤔🤔🤔\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsamuelbarbosadev%2Flearning_docker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsamuelbarbosadev%2Flearning_docker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsamuelbarbosadev%2Flearning_docker/lists"}