Skip to content
Snippets Groups Projects
Commit 8c3ea57f authored by mvrp21's avatar mvrp21
Browse files

feat(docker-fundamentals): even more progress


Signed-off-by: default avatarMarcus V. <mvrp21@inf.ufpr.br>
parent a28ec9ee
No related branches found
No related tags found
No related merge requests found
...@@ -7,6 +7,7 @@ Antes de começar a executar comandos é preciso ter Docker instalado no sistema ...@@ -7,6 +7,7 @@ Antes de começar a executar comandos é preciso ter Docker instalado no sistema
Há documentação oficial[^cite_docker_install] sobre instalação. Há documentação oficial[^cite_docker_install] sobre instalação.
## Trabalhando com **contêineres** ## Trabalhando com **contêineres**
TODO: rootless-docker e sobre como ele é executado
### Utilizando imagens pré-construídas ### Utilizando imagens pré-construídas
Vamos iniciar com prática: pegar uma imagem que já foi construída por alguém e Vamos iniciar com prática: pegar uma imagem que já foi construída por alguém e
executar um contêiner baseado nela. Para este guia foi escolhida a imagem do executar um contêiner baseado nela. Para este guia foi escolhida a imagem do
...@@ -158,6 +159,27 @@ root@devops:~# ...@@ -158,6 +159,27 @@ root@devops:~#
Note que tanto o identificador do nome quando do id do contêiner servem. Note que tanto o identificador do nome quando do id do contêiner servem.
:::{tip}
Além de que tanto faz se o comando recebe o ID ou o NOME do contêiner, se o
comando receber apenas o prefixo do identificador, supondo que esse prefixo não
se repete o efeito é o mesmo.
Veja um exemplo em que se faz isso utilizando o ID:
```
root@devops:~/node-test# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
80d9d7b2dab1 node "docker-entrypoint.s…" 2 seconds ago Exited (0) 2 seconds ago awesome_roentgen
ec38d6715864 node "docker-entrypoint.s…" 32 seconds ago Exited (0) 32 seconds ago jolly_gates
root@devops:~/node-test# docker rm 8
8
root@devops:~/node-test# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ec38d6715864 node "docker-entrypoint.s…" 41 seconds ago Exited (0) 40 seconds ago jolly_gates
root@devops:~/node-test#
```
:::
#### Removendo contêineres automaticamente #### Removendo contêineres automaticamente
Para remover automaticamente um contêiner que você executou é só passar a Para remover automaticamente um contêiner que você executou é só passar a
flag `--rm` para o comando `docker run`. flag `--rm` para o comando `docker run`.
...@@ -281,12 +303,70 @@ Além do código, o seguinte texto deve estar em outro arquivo chamado ...@@ -281,12 +303,70 @@ Além do código, o seguinte texto deve estar em outro arquivo chamado
Pronto! Já podemos iniciar essa seção. Pronto! Já podemos iniciar essa seção.
##### Executando o programa localmente
Caso exista algum interesse em executar a aplicação localmente para comparar
com a execução 'dockarizada' basta primeiro instalar o Node na máquina em que
se quer fazer o teste. Após isso, no diretório com ambos os arquivos criados
basta executar:
```
npm install
npm start
```
Após isso, em outro terminal se você executar a seguinte sequência de comandos
o output deve ser o mesmo:
```
root@devops:~/node-test# curl -w "\n" localhost:3000/ler
{"texto":"O arquivo nao foi modificado!","contador":0}
root@devops:~/node-test# curl -w "\n" localhost:3000/escrever
{"texto":"O contador eh 1","contador":1}
root@devops:~/node-test# curl -w "\n" localhost:3000/ler
{"texto":"O contador eh 1","contador":1}
root@devops:~/node-test# curl -w "\n" localhost:3000/escrever
{"texto":"O contador eh 2","contador":2}
root@devops:~/node-test# curl -w "\n" localhost:3000/escrever
{"texto":"O contador eh 3","contador":3}
root@devops:~/node-test# curl -w "\n" localhost:3000/escrever
{"texto":"O contador eh 4","contador":4}
root@devops:~/node-test# curl -w "\n" localhost:3000/ler
{"texto":"O contador eh 4","contador":4}
root@devops:~/node-test#
```
O terminal acima é o que chamamos de 'cliente'.
Voltando ao primeiro terminal, o output deve ser similar a esse:
```
root@devops:~/node-test# npm start
> docker-tutorial@1.0.0 start
> node app.js
Escutando na porta 3000
[LEITURA] contador eh 0
[ESCRITA] contador foi de 0 para 1
[LEITURA] contador eh 1
[ESCRITA] contador foi de 1 para 2
[ESCRITA] contador foi de 2 para 3
[ESCRITA] contador foi de 3 para 4
[LEITURA] contador eh 4
```
Esse é o terminal que chamamos de 'servidor'.
Agora vamos ver como fazer isso executar com Docker.
#### Criando um Dockerfile #### Criando um Dockerfile
Quem já conhece Node sabe que para executar o código será preciso primeiro Quem já conhece Node sabe que para executar o código será preciso primeiro
instalar as dependências do projeto com `npm install` e depois basta instalar as dependências do projeto com `npm install` e depois basta
executar o servidor com `npm start`. executar o servidor com `npm start`.
Para isso é necessário que o `npm` esteja instalado no sistema. Para isso é necessário que o `npm` esteja instalado no sistema. Mas com
Docker isso não é necessário. Vamos ver como isso é configurado em um
chamado `Dockerfile`:
```Dockerfile ```Dockerfile
FROM node:lts FROM node:lts
...@@ -304,7 +384,7 @@ COPY . /app/ ...@@ -304,7 +384,7 @@ COPY . /app/
CMD [ "npm", "start" ] CMD [ "npm", "start" ]
``` ```
TODO: explicar tudo em detalhes................................................. Sumarizando (veremos cada comando em detalhes à frente),
:::{caution} :::{caution}
A imagem escolhida é `node:lts`. Para usos além de testes locais é sempre bom A imagem escolhida é `node:lts`. Para usos além de testes locais é sempre bom
...@@ -325,12 +405,104 @@ suas dependências mudar ele **deveria** acompanhar essa mudança. Infelizmente ...@@ -325,12 +405,104 @@ suas dependências mudar ele **deveria** acompanhar essa mudança. Infelizmente
o mundo da teoria é muito mais bonito e previsível que o da prática.) o mundo da teoria é muito mais bonito e previsível que o da prática.)
::: :::
#### Sequência de passos #### Criando e usando essa imagem
TODO: eventualmente comentar do .dockerignore, talvez não aqui
##### Ordenando as camadas Lembre-se: um Dockerfile define uma **imagem**, então usamos ele para criar uma
imagem e **depois** criamos um contêiner com base nessa imagem.
TODO: mostrar trocas de camadas Como criar uma imagem? Simples! Só executar o comando `docker build . --tag
<nome-da-imagem>`.
Vejamos um exemplo:
```
root@devops:/node-test# docker build . -t teste-node
DEPRECATED: The legacy builder is deprecated and will be removed in a future release.
Install the buildx component to build images with BuildKit:
https://docs.docker.com/go/buildx/
Sending build context to Docker daemon 2.65MB
Step 1/7 : FROM node:lts
---> 2e805f601f2b
Step 2/7 : WORKDIR /app/
---> Running in cd1fea97d9bd
---> Removed intermediate container cd1fea97d9bd
---> 433bbc33acff
Step 3/7 : EXPOSE 3000
---> Running in 7f753b00ccec
---> Removed intermediate container 7f753b00ccec
---> b85feba0a0d5
Step 4/7 : COPY package.json /app/package.json
---> 5b3d5e55a62e
Step 5/7 : RUN npm install
---> Running in 4323f8d14bbd
added 64 packages, and audited 65 packages in 2s
12 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
npm notice
npm notice New minor version of npm available! 10.2.4 -> 10.5.0
npm notice Changelog: <https://github.com/npm/cli/releases/tag/v10.5.0>
npm notice Run `npm install -g npm@10.5.0` to update!
npm notice
---> Removed intermediate container 4323f8d14bbd
---> d8c047dda876
Step 6/7 : COPY . /app/
---> 0d9bdde073a1
Step 7/7 : CMD [ "npm", "start" ]
---> Running in 0c796bc223a3
---> Removed intermediate container 0c796bc223a3
---> 094c7152f58d
Successfully built 094c7152f58d
Successfully tagged teste-node:latest
```
:::{note}
Perceba que há um aviso 'DEPRECATED'. No momento da escrita desse guia docker
ainda suporta usar build ao invés do buildx. Eventualmente esse guia será atualizado
para incluir ambas as opções (caso ambas ainda sejam válidas).
Um pouco sobre o buildx será comentado na seção [Docker Compose](docker-compose).
:::
Vamos analisar esse output:
TODO: analisar o output asjkdajksdjkasjkd.
Com isso devemos ter uma imagem local chamada `teste-node`. Podemos verificar isso
com `docker image ls`:
```
root@devops:~/node-test# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
teste-node latest 094c7152f58d 15 minutes ago 1.11GB
root@devops:~/node-test#
```
##### Criando o contêiner
Do mesmo jeito que criamos e executamos contêineres antes faremos agora, mas
passaremos mais argumentos para o comando pois eles ainda não foram demonstrados:
TODO: falar de `docker container create` e etc.
```
root@devops:~/node-test# docker run --rm --name meu-container teste-node
> docker-tutorial@1.0.0 start
> node app.js
Escutando na porta 3000
```
:::{note}
Os argumentos que passamos a mais foram `--rm` para remover automaticamente o
contêiner e `--name` para que o nome do contêiner seja um criado por nós, não
um escolhido pelo Docker.
:::
...
#### Mapeando portas #### Mapeando portas
...@@ -340,19 +512,25 @@ isso pois por mais que uma porta seja utilizada no contêiner o host pode querer ...@@ -340,19 +512,25 @@ isso pois por mais que uma porta seja utilizada no contêiner o host pode querer
mapeá-la para outra. mapeá-la para outra.
A verdadeira razão para usar essa instrução é para **informar** quem estiver A verdadeira razão para usar essa instrução é para **informar** quem estiver
utilizando a imagem quais portas devem ser "publicadas". Ela serve como uma utilizando a imagem quais portas devem ser 'publicadas'. Ela serve como uma
espécie de **documentação**. espécie de **documentação**.
::: :::
##### Ordenando as camadas
TODO: mostrar trocas de camadas
#### ARG e ENV #### ARG e ENV
#### COPY e RUN
TODO: eventualmente comentar do .dockerignore
#### CMD vs ENTRYPOINT #### CMD vs ENTRYPOINT
:::{note} :::{note}
Uma instrução particularmente interessante é a `HEALTHCHECK`. Uma instrução particularmente interessante é a `HEALTHCHECK`.
::: :::
### *Attached* e *detached* ### Interagindo com contêineres
#### *Attached* vs *detached*
#### Vendo Logs #### Vendo Logs
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment