├── 01-o-que-e-docker.md ├── 02-building-blocks.md ├── 03-criando-um-servidor-web.md ├── 04-controlando-um-container.md ├── 05-imagens-e-repositorio.md ├── 06-criando-uma-imagem.md ├── README.md ├── Topics.todo ├── compose ├── docker-compose.yml ├── index-1.html ├── index-2.html ├── index-3.html └── load-balancer.conf ├── dockerfile ├── Dockerfile └── index.html └── index.html /01-o-que-e-docker.md: -------------------------------------------------------------------------------- 1 | # O que é Docker? 2 | 3 | [Voltar](/README.md) [Próximo](/02-building-blocks.md) 4 | 5 | Docker é: 6 | 7 | 1. Uma empresa? 8 | 2. Uma tecnologia? 9 | 3. Um produto? 10 | 4. Um padrão? 11 | 12 | A respota certa são todas as respostas acima. Docker é uma tecnologia de conteinerização _(2)_ criada pela empresa Docker Inc. _(1)_ que acabou gerando uma série de produtos como Docker Hub _(3)_, mas posteriormente foi aberto para CNCF como um padrão chamado [containerd.io](https://containerd.io/) _(4)_. 13 | 14 | Ao contrário da virtualização, a conteinerização consiste em se criar processos isolados dentro de um sistema operacional usando uma série de tecnologias do proprio Kernel do SO. Como falamos de Kernel, já estamos afirmando que ele surgiu no ambiente Linux, mas sistemas operacionais como o Windows já se mostraram capazes de criar containeres, mesmo não sendo popular. 15 | 16 | Um container é um padrão de componente que permite o empacotamento de aplicações e suas dependências em uma forma de fácil distribuição. Ao executar uma aplicação baseada em containers, não dependemos de nenhuma dependência além da plataforma de conteinerização. 17 | 18 | ## Quais são essas tecnologias? 19 | 20 | Docker se baseia em algumas tecnologias já existentes no Linux. 21 | * [COW - Copy On Write](https://pt.wikipedia.org/wiki/C%C3%B3pia_em_grava%C3%A7%C3%A3o) 22 | * [cgroups](https://en.wikipedia.org/wiki/Cgroups) 23 | * [iptables](https://pt.wikipedia.org/wiki/Iptables) 24 | * [Linux Namespaces](https://en.wikipedia.org/wiki/Linux_namespaces) 25 | 26 | ### COW 27 | 28 | _Copy On Write_ é uma técnica que permite a criação de uma estrutura de arquivos por camada. Cada camada altera a anterior e camadas podem ser compartilhadas com processos diferentes. 29 | 30 | ### cgroups 31 | 32 | _cgroups_ é uma feature do Linux que permite controlar o tanto de recurso (CPU, Memória, I/O) que um processo pode utilizar. 33 | 34 | ### iptables 35 | 36 | _iptables_ é um programa Linux que permite criar regras de redirecionamento de portas dentro do Linux. 37 | 38 | ### Linux Namespaces 39 | 40 | _Linux Namespaces_ permite o compartilhamento, e o isolamento, de recursos do SO dentro do Linux. Similar ao _cgroups_, mas se refere a outros tipos de recursos. Por exemploe: PIDs, nomes de arquivos, hostnames, etc... 41 | -------------------------------------------------------------------------------- /02-building-blocks.md: -------------------------------------------------------------------------------- 1 | # Docker Building Blocks 2 | 3 | [Voltar](/01-o-que-e-docker.md) [Próximo](03-criando-um-servidor-web.md) 4 | 5 | Gosto do conceito de Building Blocks, quando me refiro a ele estou definindo elementos básicos para algo. Assim em Docker podemos definir alguns building blocks. 6 | 7 | Para o desenvolvimento de qualquer aplicação Docker, é necessário entender o que são cada um desses elementos. 8 | 9 | * Imagem 10 | * TAGs 11 | * Container 12 | * Volume 13 | * Network 14 | * Registry 15 | * Dockerfile 16 | 17 | ## Imagem 18 | 19 | Uma Imagem é uma foto do Container em seu momento inicial. Se formos comparar com os conceitos de máquinas virtuais, a Imagem seria um SNAPSHOT. 20 | 21 | Uma Imagem é usada para gerar um Container. Uma Imagem pode ser gerada a partir de um Container. Uma Imagem tem algumas propriedades que extendem o conceito de Snapshot, podemos definir qual comando a Imagem irá executar assim que ela iniciar. 22 | 23 | Uma Imagem é preferencialmente construida a partir de um Dockerfile. 24 | 25 | ### TAGs 26 | 27 | Uma Imagem pode ter uma ou mais TAG associada. Cada imagem possui um nome, este nome pode estar associado a várias TAGs. 28 | 29 | Por exemplo, se formos criar um container do MariaDB, sabemos que o nome dele é `mariadb`. Mas se referenciarmos apenas esse nome, será baixada a image `mariadb:latest`, o que não é tão bom, visto que não sabemos exatamente qual versão será executada. No caso do MariaDB, temos as seguintes TAGs: 30 | * 10.4.10-bionic, 10.4-bionic, 10-bionic, bionic, 10.4.10, 10.4, 10, latest 31 | * 10.3.20-bionic, 10.3-bionic, 10.3.20, 10.3 32 | * 10.2.29-bionic, 10.2-bionic, 10.2.29, 10.2 33 | * 10.1.43-bionic, 10.1-bionic, 10.1.43, 10.1 34 | 35 | Uma boa opção, seria utilizar `mariadb:10.4` para escolher a versão **10.4.10** ou qualquer versão futura com bug fixes. 36 | 37 | ## Container 38 | 39 | Um Container é uma instância de uma aplicação. Pode haver vários Containers rodando com a partir da mesma Imagem. Ao se executar um Container é preciso uma Imagem e um conjunto de informações: 40 | * Volumes 41 | * Variáveis de Ambiente 42 | * Portas 43 | * etc... 44 | 45 | ### Volume 46 | 47 | O Sistema de Arquivo de um Container é descartável. Assim, ao se remover o container, todos os arquivos dele são removidos. Um Volume é um mapeamento entre um diretório da máquina hospedeira para o container. Usando COW, o diretório, ou arquivo, dentro container é sobrescrito. 48 | 49 | ### Network 50 | 51 | Quando um container é executado, pode pertencer a uma ou várias Networks. Por padrão, ele pertence a Network Default. Para cada Network associada, ele terá um IP NAT associado. 52 | 53 | Uma Network serve para criar uma VPC. Dois containers só podem se comunicar se pertencerem a mesma Network. Uma Network contém DNS que resolve o IP através do nome do container. Assim, se um container tentar acessar `container-1:8080` estará tentando acessar a porta **8080** do container com nome **container-1**. 54 | 55 | ## Registry 56 | 57 | Um Registry é um servidor web para armazenar uma Imagem. No ciclo de vida de uma Imagem, ela pode ser gerada ou baixada de um Registry. 58 | 59 | O padrão é o [Docker Hub](https://hub.docker.com/), sempre que possível procure imagens lá. No Docker Hub há imagens verificadas e não verificadas. Procure usar as imagens verificadas, caso contrário você pode estar correndo o risco de expor seus dados. 60 | 61 | 62 | ## Dockerfile 63 | 64 | Dockerfile é o script de criação de uma Imagem. Uma Imagem deve ser construida através de um script, e pode ser reconstruida em qualquer máquina. -------------------------------------------------------------------------------- /03-criando-um-servidor-web.md: -------------------------------------------------------------------------------- 1 | # Criando um Servidor Web 2 | 3 | [Voltar](/02-building-blocks.md) [Próximo](/04-controlando-um-container.md) 4 | 5 | Nessa passo vamos criar um servidor Web usando Nginx: 6 | 7 | ```bash 8 | $ docker search nginx 9 | NAME DESCRIPTION STARS OFFICIAL AUTOMATED 10 | nginx Official build of Nginx. 15820 [OK] 11 | jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 2094 [OK] 12 | richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 818 [OK] 13 | jc21/nginx-proxy-manager Docker container for managing Nginx proxy ho… 275 14 | linuxserver/nginx An Nginx container, brought to you by LinuxS… 159 15 | tiangolo/nginx-rtmp Docker image with Nginx using the nginx-rtmp… 145 [OK] 16 | jlesage/nginx-proxy-manager Docker container for Nginx Proxy Manager 143 [OK] 17 | alfg/nginx-rtmp NGINX, nginx-rtmp-module and FFmpeg from sou… 110 [OK] 18 | nginxdemos/hello NGINX webserver that serves a simple page co… 77 [OK] 19 | privatebin/nginx-fpm-alpine PrivateBin running on an Nginx, php-fpm & Al… 60 [OK] 20 | nginx/nginx-ingress NGINX and NGINX Plus Ingress Controllers fo… 57 21 | nginxinc/nginx-unprivileged Unprivileged NGINX Dockerfiles 54 22 | staticfloat/nginx-certbot Opinionated setup for automatic TLS certs lo… 25 [OK] 23 | nginxproxy/nginx-proxy Automated Nginx reverse proxy for docker con… 24 24 | nginx/nginx-prometheus-exporter NGINX Prometheus Exporter for NGINX and NGIN… 22 25 | schmunk42/nginx-redirect A very simple container to redirect HTTP tra… 19 [OK] 26 | centos/nginx-112-centos7 Platform for running nginx 1.12 or building … 16 27 | centos/nginx-18-centos7 Platform for running nginx 1.8 or building n… 13 28 | bitwarden/nginx The Bitwarden nginx web server acting as a r… 11 29 | flashspys/nginx-static Super Lightweight Nginx Image 11 [OK] 30 | mailu/nginx Mailu nginx frontend 9 [OK] 31 | sophos/nginx-vts-exporter Simple server that scrapes Nginx vts stats a… 7 [OK] 32 | ansibleplaybookbundle/nginx-apb An APB to deploy NGINX 3 [OK] 33 | wodby/nginx Generic nginx 1 [OK] 34 | arnau/nginx-gate Docker image with Nginx with Lua enabled on … 1 [OK] 35 | ``` 36 | 37 | ```bash 38 | $ docker run --name hello-world -p 8080:80 -d nginx 39 | Unable to find image 'nginx:latest' locally 40 | 7d63c13d9b9b: Pull complete 41 | 5cb019b641b5: Pull complete 42 | d477de77abf8: Pull complete 43 | c60e7d4c1c30: Pull complete 44 | 365a49996569: Pull complete 45 | 039c6e901970: Pull complete 46 | Digest: sha256:d1ce0f99f6a8acc9162c29497014716c44d126f1d41deee40a2c13e3d9d9b02a 47 | Status: Downloaded newer image for nginx:latest 48 | afc52ea50894abea646ccbeff935b77206e68b53bb05b32b4c5679e5b014743b 49 | ``` 50 | 51 | Agora o NGIX está rodando e pode ser usado através da porta 8080, mesmo internamente expondo a porta 80. 52 | 53 | ```bash 54 | $ curl localhost:8080 -s 55 | 56 | 57 | 58 | Welcome to nginx! 59 | 64 | 65 | 66 |

Welcome to nginx!

67 |

If you see this page, the nginx web server is successfully installed and 68 | working. Further configuration is required.

69 | 70 |

For online documentation and support please refer to 71 | nginx.org.
72 | Commercial support is available at 73 | nginx.com.

74 | 75 |

Thank you for using nginx.

76 | 77 | 78 | ``` 79 | 80 | Esse container está rodando com a imagem base do NGIX, para verificar quais containeres estão em execução, execute `docker ps`: 81 | 82 | ```bash 83 | $ docker ps 84 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 85 | afc52ea50894 nginx "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 0.0.0.0:8080->80/tcp, :::8080->80/tcp hello-world 86 | ``` 87 | 88 | Através do CLI do docker é possível verificar as estatísticas do container em execução. 89 | 90 | 91 | ```bash 92 | $ docker stats --no-stream 93 | CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 94 | afc52ea50894 hello-world 0.00% 6.719MiB / 12.26GiB 0.05% 2.56kB / 2.47kB 0B / 0B 9 95 | ``` 96 | 97 | Os recursos podem ser limitados ao iniciar o container, se quisermos limitar a memória em 12MB e CPU em 1, basta executar: 98 | 99 | ```bash 100 | $ docker run --name hello-world --memory 12MB --cpus 1 -p 8080:80 -d nginx 101 | 43848a573db629515d2a73a26eb7293eb2421de937240197f3dfcde97aa26cb6 102 | 103 | $ docker stats --no-stream 104 | CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 105 | 43848a573db6 hello-world 0.00% 6.652MiB / 12MiB 55.44% 696B / 0B 0B / 0B 9 106 | ``` 107 | 108 | O próximo passo é alterar o container em execução, para isso: 109 | 110 | ```bash 111 | $ docker cp index.html hello-world:/usr/share/nginx/html/index.html 112 | 113 | $ curl localhost:8080 -s 114 | 115 | 116 |

My First Container!!!

117 | 118 | 119 | ``` -------------------------------------------------------------------------------- /04-controlando-um-container.md: -------------------------------------------------------------------------------- 1 | # Controlando um container 2 | 3 | [Voltar](/03-criando-um-servidor-web.md) [Próximo](/05-imagens-e-repositorio.md) 4 | 5 | Containers tem um ciclo de vida. Eles nascem e morrem. Mas o pronto principal é que containers tem um processo principal, quando esse processo termina, o container para. Você pode controlar o ciclo de vida de um container pelos comandos `docker start`, `docker stop` e `docker rm`. 6 | 7 | Abaixo podemos ver que ao verificar que programa o programa sendo executado pelo processo 1 é o nginx, se esse processo morrer, o container para. 8 | 9 | ```bash 10 | $ docker run --name hello-world -p 8080:80 -d nginx 11 | f32f770597d5d97f0600c9382dee67e9728f3c5fba9ae82ab2df632ae2977246 12 | 13 | $ docker exec -it hello-world bash 14 | root@f32f770597d5:/# ls -lah /proc/1/exe 15 | lrwxrwxrwx 1 root root 0 Nov 22 13:08 /proc/1/exe -> /usr/sbin/nginx 16 | ``` 17 | 18 | Para ter maior familiaridade com a linha de comando docker, execute alguns containers e leia um pouco da documentação do proprio docker. 19 | 20 | ```bash 21 | $ docker help 22 | 23 | Usage: docker [OPTIONS] COMMAND 24 | 25 | A self-sufficient runtime for containers 26 | 27 | Options: 28 | --config string Location of client config files (default 29 | "/home/vepo/.docker") 30 | -c, --context string Name of the context to use to connect to the 31 | daemon (overrides DOCKER_HOST env var and 32 | default context set with "docker context use") 33 | -D, --debug Enable debug mode 34 | -H, --host list Daemon socket(s) to connect to 35 | -l, --log-level string Set the logging level 36 | ("debug"|"info"|"warn"|"error"|"fatal") 37 | (default "info") 38 | --tls Use TLS; implied by --tlsverify 39 | --tlscacert string Trust certs signed only by this CA (default 40 | "/home/vepo/.docker/ca.pem") 41 | --tlscert string Path to TLS certificate file (default 42 | "/home/vepo/.docker/cert.pem") 43 | --tlskey string Path to TLS key file (default 44 | "/home/vepo/.docker/key.pem") 45 | --tlsverify Use TLS and verify the remote 46 | -v, --version Print version information and quit 47 | 48 | Management Commands: 49 | builder Manage builds 50 | buildx* Build with BuildKit (Docker Inc., v0.6.3) 51 | compose* Docker Compose (Docker Inc., v2.1.1) 52 | config Manage Docker configs 53 | container Manage containers 54 | context Manage contexts 55 | image Manage images 56 | manifest Manage Docker image manifests and manifest lists 57 | network Manage networks 58 | node Manage Swarm nodes 59 | plugin Manage plugins 60 | scan* Docker Scan (Docker Inc., 0.9.0) 61 | secret Manage Docker secrets 62 | service Manage services 63 | stack Manage Docker stacks 64 | swarm Manage Swarm 65 | system Manage Docker 66 | trust Manage trust on Docker images 67 | volume Manage volumes 68 | 69 | Commands: 70 | attach Attach local standard input, output, and error streams to a running container 71 | build Build an image from a Dockerfile 72 | commit Create a new image from a container's changes 73 | cp Copy files/folders between a container and the local filesystem 74 | create Create a new container 75 | diff Inspect changes to files or directories on a container's filesystem 76 | events Get real time events from the server 77 | exec Run a command in a running container 78 | export Export a container's filesystem as a tar archive 79 | history Show the history of an image 80 | images List images 81 | import Import the contents from a tarball to create a filesystem image 82 | info Display system-wide information 83 | inspect Return low-level information on Docker objects 84 | kill Kill one or more running containers 85 | load Load an image from a tar archive or STDIN 86 | login Log in to a Docker registry 87 | logout Log out from a Docker registry 88 | logs Fetch the logs of a container 89 | pause Pause all processes within one or more containers 90 | port List port mappings or a specific mapping for the container 91 | ps List containers 92 | pull Pull an image or a repository from a registry 93 | push Push an image or a repository to a registry 94 | rename Rename a container 95 | restart Restart one or more containers 96 | rm Remove one or more containers 97 | rmi Remove one or more images 98 | run Run a command in a new container 99 | save Save one or more images to a tar archive (streamed to STDOUT by default) 100 | search Search the Docker Hub for images 101 | start Start one or more stopped containers 102 | stats Display a live stream of container(s) resource usage statistics 103 | stop Stop one or more running containers 104 | tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE 105 | top Display the running processes of a container 106 | unpause Unpause all processes within one or more containers 107 | update Update configuration of one or more containers 108 | version Show the Docker version information 109 | wait Block until one or more containers stop, then print their exit codes 110 | 111 | Run 'docker COMMAND --help' for more information on a command. 112 | 113 | To get more help with docker, check out our guides at https://docs.docker.com/go/guides/ 114 | ``` -------------------------------------------------------------------------------- /05-imagens-e-repositorio.md: -------------------------------------------------------------------------------- 1 | # Imagens e Repositório 2 | 3 | [Voltar](/04-controlando-um-container.md) [Próximo](/06-criando-uma-imagem.md) 4 | 5 | O docker é baseado em uma imagem. Uma imagem é o ponto de inicio de um container. Ao se criar um container a partir de uma imagem, ela permanece imutável. Se você alterar um container, a imagem não é alterada. 6 | 7 | Containers em execução podem ser salvos como uma nova imagem, para isso use o comando `docker commit`, veja a documentação abaixo: 8 | 9 | ```bash 10 | $ docker commit --help 11 | 12 | Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] 13 | 14 | Create a new image from a container's changes 15 | 16 | Options: 17 | -a, --author string Author (e.g., "John Hannibal Smith 18 | ") 19 | -c, --change list Apply Dockerfile instruction to the created image 20 | -m, --message string Commit message 21 | -p, --pause Pause container during commit (default true) 22 | 23 | ``` 24 | 25 | Apesar de existir o comando `docker commit`, não use ele para gerar imagens, prefira o Dockerfile que vamos falar mais a frente. 26 | 27 | Imagens são construida em camadas, que podem ser compartilhada entre vários containers. Para verificar o histórico e as informações de uma imagem, use `docker history `. 28 | 29 | ```bash 30 | $ docker history nginx 31 | IMAGE CREATED CREATED BY SIZE COMMENT 32 | e9ce56a96f8e 5 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B 33 | 5 days ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B 34 | 5 days ago /bin/sh -c #(nop) EXPOSE 80 0B 35 | 5 days ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr… 0B 36 | 5 days ago /bin/sh -c #(nop) COPY file:09a214a3e07c919a… 4.61kB 37 | 5 days ago /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7… 1.04kB 38 | 5 days ago /bin/sh -c #(nop) COPY file:0b866ff3fc1ef5b0… 1.96kB 39 | 5 days ago /bin/sh -c #(nop) COPY file:65504f71f5855ca0… 1.2kB 40 | 5 days ago /bin/sh -c set -x && addgroup --system -… 61.1MB 41 | 12 days ago /bin/sh -c #(nop) ENV PKG_RELEASE=1~bullseye 0B 42 | 12 days ago /bin/sh -c #(nop) ENV NJS_VERSION=0.7.0 0B 43 | 12 days ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.21.4 0B 44 | 12 days ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B 45 | 5 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B 46 | 5 weeks ago /bin/sh -c #(nop) ADD file:16dc2c6d1932194ed… 80.4MB 47 | ``` 48 | 49 | Imagens podem ser amarzenadas localmente, mas podem ser amarzenadas em um repositório. Ao executar o comando `docker run`, o docker vai procurar a imagem socilitada localmente, se não encontrar vai procurar remotamente. Nos nossos exemplos usamos imagens do repositório padrão do docker, o (hub.docker.com)[https://hub.docker.com/], mas quando há um prefixo na image terminado em `/` significa que esse prefix é a URL do repositório. Isso que dizer que se usassemos a image `quay.io/bitnami/nginx` estariamos usando a imagem armazenada no [quay.io](https://quay.io/) e não no hub.docker.com. 50 | 51 | Caso você queira baixar uma imagem, pode fazer isso pelo comando `docker pull quay.io/bitnami/nginx`. Caso você queira fazer o upload de uma imagem, pode usar o comando `docker push `. O upload vai seguir a mesma lógica do download, usando o nome da imagem para escolher o repositório. 52 | 53 | Imagens podem ser renomeadas e versionadas. Para isso use o comando `docker tag`, veja a documentação abaixo: 54 | 55 | ```bash 56 | $ docker tag --help 57 | 58 | Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] 59 | 60 | Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE 61 | ``` -------------------------------------------------------------------------------- /06-criando-uma-imagem.md: -------------------------------------------------------------------------------- 1 | # Criando uma imagem 2 | 3 | [Voltar](/05-imagens-e-repositorio.md) 4 | 5 | Agora para finalizar precisamos vamos descrever o melhor método de se criar uma imagem. Vamos supor que queremos criar uma imagem de um servidor Java. Como eu devo começar? 6 | 7 | Para se criar imagem, devemos partir de uma outra imagem. Um erro comum de alguns desenvolvedores é usarem imagens das distribuições mais famosas do Linux, mas isso irá gerar uma imagem grande. Prefira imagens menores, se você precisa partir de um Linux básico, prefira o [Alpine Linux](https://www.alpinelinux.org/). Você pode verificar abaixo que um Centos tem 231MB enquanto um Alpine apenas 5,61MB. 8 | 9 | ```bash 10 | $ docker image ls 11 | REPOSITORY TAG IMAGE ID CREATED SIZE 12 | alpine latest 0a97eee8041e 9 days ago 5.61MB 13 | centos latest 5d0da3dc9764 2 months ago 231MB 14 | ``` 15 | 16 | Como vamos criar um servidor Java, vamos usar a imagem oficial do [openjdk](https://hub.docker.com/_/openjdk). Essa imagem tem várias tags que são usadas para se escolher tanto a versão do Java que vamos usar quanto o sistema operacional que ela contém. Vamos escolher a **openjdk:17-alpine** por dois motivos, o primeiro é que a versão 17 do Java é a Long Term Support (LST), isso signifca mais estabildiade, e por ser menor o que implica que o download dela é mais rápido. 17 | 18 | ```bash 19 | $ docker image ls 20 | REPOSITORY TAG IMAGE ID CREATED SIZE 21 | openjdk 17-oracle 1b3756d6df61 3 days ago 471MB 22 | openjdk 17-alpine 264c9bdce361 5 months ago 326MB 23 | ``` 24 | 25 | Agora com essa imagem podemos contruir o nosso Dockerfile. Um Dockerfile é um arquivo descritivo que contém todos os comandos necessários para se contruir uma imagem. É um arquivo texto e o processo de build é feito passo por passo. Para cada passo, o docker inicia um container, aplica o novo comando e salva uma imagem. Isso significa que o Dockerfile não é um script, um processo iniciado em um passo anterior não está ativo no próximo passo. Vamos ao exemplo mais simples? 26 | 27 | ```Dockerfile 28 | FROM openjdk:17-alpine 29 | 30 | ADD target/my-server.jar my-server.jar 31 | 32 | EXPOSE 8080/tcp 33 | ENV HTTP_PORT="8080" 34 | 35 | ENTRYPOINT ["java", "-jar", "my-server.jar"] 36 | ``` 37 | 38 | A partir desse arquivo podemos gerar uma imagem usando o comando `docker build -t my-server:1.0.0 .`. Observe que o último paramêtro é diretório onde o Dockerfile está localizado. Para conhecer melhor um Dockerfile, recomendo ler a [documentação](https://docs.docker.com/engine/reference/builder) e o guia de [boas práticas](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/) dele. 39 | 40 | Caso você não queira ter o Java instalado na sua máquina e fazer toda a build usando o docker, é possível fazer uma _multi stage build_ sem comprometer sua imagem com camadas desncessárias. 41 | 42 | ```Dockerfile 43 | # Passo 1: Build e Package 44 | FROM maven:3.8.3-openjdk-17 as builder 45 | 46 | WORKDIR /build 47 | 48 | ADD pom.xml /build/pom.xml 49 | RUN mvn dependency:go-offline 50 | 51 | ADD src /build/src 52 | RUN mvn package 53 | 54 | # Passo 2: create image 55 | FROM openjdk:17-alpine 56 | 57 | ADD --from=target /build/target/my-server.jar my-server.jar 58 | 59 | EXPOSE 8080/tcp 60 | ENV HTTP_PORT="8080" 61 | 62 | ENTRYPOINT ["java", "-jar", "my-server.jar"] 63 | ``` 64 | 65 | Finalizada a imagem, é só subir para algum repositório: `docker push my-server:1.0.0`. É muito provavel que você tenha que fazer login no repoisótio, isso pode ser feito usando `docker login` (para o hub.docker.com) e `docker login ` para demais. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Tutorial Docker 2 | 3 | Esse é um tutorial em format README.md. Siga os passos: 4 | 5 | 1. [O que é docker?](/01-o-que-e-docker.md) 6 | 2. [Docker Building Blocks](/02-building-blocks.md) 7 | 3. [Criando um Servidor Web](/03-criando-um-servidor-web.md) 8 | 4. [Controlando um container](/04-controlando-um-container.md) 9 | 5. [Imagens e Repositório](05-imagens-e-repositorio.md) 10 | 6. [Criando uma imagem](06-criando-uma-imagem.md) -------------------------------------------------------------------------------- /Topics.todo: -------------------------------------------------------------------------------- 1 | Docker Tutorial: 2 | ☐ What is docker? 3 | ☐ cgroup 4 | ☐ What is a Docker container? 5 | ☐ What is a Docker Image 6 | ☐ Is there a Docker container lifecycle? 7 | ☐ How to install docker? 8 | sudo curl -sSL https://get.docker.com/ | sh 9 | Definitions: 10 | ☐ Image 11 | ☐ Layers 12 | ☐ Container 13 | ☐ TAG 14 | ☐ Repository 15 | ☐ Volume 16 | ☐ Network 17 | 18 | Creating a running container: 19 | ☐ Create a Container 20 | docker run --name hello-world -d -p 8080:80 nginx 21 | ☐ Check running containers 22 | docker ps -a 23 | docker stats 24 | ☐ Interacting with the container 25 | docker exec -it hello-world /bin/bash 26 | ☐ Copying files from containers 27 | docker cp index.html hello-world:/usr/share/nginx/html/index.html 28 | ☐ Creating image from Running Container 29 | docker commit hello-world my-docker-image 30 | docker image ls 31 | ☐ Stopping/Starting/Removing Docker containers 32 | docker stop hello-world 33 | docker start hello-world 34 | docker rm hello-world 35 | ☐ Sharing an image 36 | docker login 37 | docker tag my-docker-image vepo/my-docker-image 38 | docker push vepo/my-docker-image 39 | ☐ Docker Layers 40 | docker history vepo/my-docker-image 41 | ☐ Dockerfiles - Adding files 42 | cd dockerfile/ 43 | docker build . -t my-container-add 44 | docker run -d --name hello-add -p 8081:80 my-container-add 45 | ☐ Docs: 46 | https://docs.docker.com/engine/reference/builder/ 47 | ☐ Docker volumes 48 | docker run -d --name my-container-volumes -v $(pwd)/index.html:/usr/share/nginx/html/index.html -p 8082:80 nginx 49 | docker run -d --name my-container-volumes -v "c:\Users\victoro\source\docker-tutorial\index.html":/usr/share/nginx/html/index.html -p 8082:80 nginx 50 | docker restart my-container-volumes 51 | Docker Compose: 52 | ☐ Docs: 53 | https://docs.docker.com/compose/compose-file/ 54 | ☐ How to Configure containers? 55 | Commands: 56 | ☐ Build 57 | ☐ Up 58 | ☐ Stop 59 | ☐ Pull 60 | ☐ Restart 61 | docker exec -it compose_load-balancer_1 /bin/bash 62 | cat /proc/1/cmdline 63 | kill 1 64 | 65 | 66 | -------------------------------------------------------------------------------- /compose/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | load-balancer: 5 | image: nginx:1.16 6 | restart: always 7 | volumes: 8 | - ./load-balancer.conf:/etc/nginx/nginx.conf:ro 9 | ports: 10 | - 8080:80 11 | 12 | backend1: 13 | image: nginx:1.16 14 | restart: always 15 | volumes: 16 | - ./index-1.html:/usr/share/nginx/html/index.html:ro 17 | 18 | backend2: 19 | image: nginx:1.16 20 | restart: always 21 | volumes: 22 | - ./index-2.html:/usr/share/nginx/html/index.html:ro 23 | 24 | backend3: 25 | image: nginx:1.16 26 | restart: always 27 | volumes: 28 | - ./index-3.html:/usr/share/nginx/html/index.html:ro 29 | -------------------------------------------------------------------------------- /compose/index-1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

My First Container!!!

4 |

Container 1

5 | 6 | -------------------------------------------------------------------------------- /compose/index-2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

My First Container!!!

4 |

Container 2

5 | 6 | -------------------------------------------------------------------------------- /compose/index-3.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

My First Container!!!

4 |

Container 3

5 | 6 | -------------------------------------------------------------------------------- /compose/load-balancer.conf: -------------------------------------------------------------------------------- 1 | events { } 2 | 3 | http { 4 | upstream backend { 5 | least_conn; 6 | server backend1; 7 | server backend2; 8 | server backend3; 9 | } 10 | 11 | # This server accepts all traffic to port 80 and passes it to the upstream. 12 | # Notice that the upstream name and the proxy_pass need to match. 13 | 14 | server { 15 | listen 80; 16 | 17 | location / { 18 | proxy_pass http://backend; 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /dockerfile/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM nginx:1.16-alpine 2 | 3 | ADD index.html /usr/share/nginx/html/index.html -------------------------------------------------------------------------------- /dockerfile/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

My First Container using Dockerfile!!!

4 | 5 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

My First Container!!!

4 | 5 | --------------------------------------------------------------------------------