├── 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 |
--------------------------------------------------------------------------------