Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
D
Devops
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Harbor Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
C3SL
c3docs
Devops
Commits
8c3ea57f
Commit
8c3ea57f
authored
1 year ago
by
mvrp21
Browse files
Options
Downloads
Patches
Plain Diff
feat(docker-fundamentals): even more progress
Signed-off-by:
Marcus V.
<
mvrp21@inf.ufpr.br
>
parent
a28ec9ee
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
source/pages/guides/docker-fundamentals.md
+186
-8
186 additions, 8 deletions
source/pages/guides/docker-fundamentals.md
with
186 additions
and
8 deletions
source/pages/guides/docker-fundamentals.md
+
186
−
8
View file @
8c3ea57f
...
...
@@ -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.
## Trabalhando com **contêineres**
TODO: rootless-docker e sobre como ele é executado
### Utilizando imagens pré-construídas
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
...
...
@@ -158,6 +159,27 @@ root@devops:~#
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
Para remover automaticamente um contêiner que você executou é só passar a
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
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
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
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
FROM
node:lts
...
...
@@ -304,7 +384,7 @@ COPY . /app/
CMD
[ "npm", "start" ]
```
TODO: explicar tudo em detalhes.................................................
Sumarizando (veremos cada comando em detalhes à frente),
:::{caution}
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
o mundo da teoria é muito mais bonito e previsível que o da prática.)
:::
#### Sequência de passos
TODO: eventualmente comentar do .dockerignore, talvez não aqui
#### Criando e usando essa imagem
##### 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
...
...
@@ -340,19 +512,25 @@ isso pois por mais que uma porta seja utilizada no contêiner o host pode querer
mapeá-la para outra.
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**
.
:::
##### Ordenando as camadas
TODO: mostrar trocas de camadas
#### ARG e ENV
#### COPY e RUN
TODO: eventualmente comentar do .dockerignore
#### CMD vs ENTRYPOINT
:::{note}
Uma instrução particularmente interessante é a
`HEALTHCHECK`
.
:::
### *Attached* e *detached*
### Interagindo com contêineres
#### *Attached* vs *detached*
#### Vendo Logs
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment