From ee55903e3a14d3a2f9c5c9c1e65dc76b6def6abc Mon Sep 17 00:00:00 2001 From: Miner320 Date: Tue, 28 Oct 2025 16:24:27 -0300 Subject: [PATCH 1/4] primeira documentacao docker --- node_modules/.package-lock.json | 6 ++ package-lock.json | 38 +------ package.json | 1 + .../assets/logos-tecnologias/docker-logo.png | Bin 0 -> 43661 bytes stack/auxiliares/docker/build.md | 55 ++++++++++ .../docker/conceitos_importantes.md | 29 ++++++ stack/auxiliares/docker/containers.md | 69 +++++++++++++ stack/auxiliares/docker/images.md | 95 ++++++++++++++++++ stack/auxiliares/docker/index.yml | 5 + stack/auxiliares/docker/introducao.md | 32 ++++++ stack/auxiliares/docker/memoria.md | 48 +++++++++ 11 files changed, 343 insertions(+), 35 deletions(-) create mode 100644 node_modules/.package-lock.json create mode 100644 package.json create mode 100644 stack/assets/logos-tecnologias/docker-logo.png create mode 100644 stack/auxiliares/docker/build.md create mode 100644 stack/auxiliares/docker/conceitos_importantes.md create mode 100644 stack/auxiliares/docker/containers.md create mode 100644 stack/auxiliares/docker/images.md create mode 100644 stack/auxiliares/docker/index.yml create mode 100644 stack/auxiliares/docker/introducao.md create mode 100644 stack/auxiliares/docker/memoria.md diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json new file mode 100644 index 0000000..813d53f --- /dev/null +++ b/node_modules/.package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "DocStruct", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/package-lock.json b/package-lock.json index 55c9bf2..813d53f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,38 +1,6 @@ { + "name": "DocStruct", + "lockfileVersion": 3, "requires": true, - "lockfileVersion": 1, - "dependencies": { - "dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" - }, - "global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", - "requires": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", - "requires": { - "dom-walk": "^0.1.0" - } - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" - }, - "retypeapp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/retypeapp/-/retypeapp-3.5.0.tgz", - "integrity": "sha512-YhHilXfKLXU2BCZ0lfj4tUVMrk8nUjkSCAoV52xIPfRfSKQQah9D5vn2Eiu+FUmeGGEB9gykr8UVi7CvjmiqbQ==" - } - } + "packages": {} } diff --git a/package.json b/package.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/package.json @@ -0,0 +1 @@ +{} diff --git a/stack/assets/logos-tecnologias/docker-logo.png b/stack/assets/logos-tecnologias/docker-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..428dd0d9377dea3a84b991af15065c36ab648f7a GIT binary patch literal 43661 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 literal 0 HcmV?d00001 diff --git a/stack/auxiliares/docker/build.md b/stack/auxiliares/docker/build.md new file mode 100644 index 0000000..9a47d99 --- /dev/null +++ b/stack/auxiliares/docker/build.md @@ -0,0 +1,55 @@ +--- +order: 3 +icon: tools +label: "Fazendo o build" +author: + name: Pedro Santos +date: 2025-10-28 +category: Explicação +tags: + - explicacao + - images +--- + +# Fazendo a build de uma image + +Com uma dockerfile em mãos, prosseguimos para construir, ou fazer o build de uma image. O comando usado para isso é o comando `docker build`, que segue o formato: + +`docker build [OPTIONS] PATH | URL` + +Onde `[OPTIONS]` indica as flags e `PATH|URL` indica o contexto de execução, que pode ser um diretório local ou um repositório remoto. + +O comando build busca um arquivo com o nome Dockerfile dentro do contexto de execução e o usa para construir a image, por isso é mais conveniente sempre usar esse nome. Abaixo estão algumas flags interessantes que podem ser usadas para modificar o comportamento do comando build. + +## Flags frequentemente usadas + +`--no-cache`: assegura que a build seja totalmente refeita, ignorando o cache de execuções prévias. + +`-f `: faz com que o docker busque e utilize o arquivo de nome `file` para a construção, ao invés de buscar o arquivo de nome padrão Dockerfile. + +`--label =“”`: permite adicionar metadados à build. + +-`t :`: adiciona tags à imagem, como nome e versão, caso não seja especificado o docker sempre utiliza a tag “:latest” como padrão. + +## Comandos relacionas à images + +Aqui estão alguns comandos mais frequentemente utilizados para gerenciar images docker. + +-`docker image ls`: lista as images presentes no sistema. + +-`docker image pull [OPTIONS] NAME[:TAG|@DIGEST]`: faz download de uma image em um registro remoto. + +-`docker image push [OPTIONS] NAME[:TAG]`: faz upload de uma image para um registro remoto. + +-`docker image rm [OPTIONS] IMAGE [IMAGE...]`: remove uma ou mais images. + +-`docker image tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]`: cria uma nova tag para uma image já existente. + +## Retomando o exemplo + +Para fazer a build do servidor python simples demonstrado na seção anterior, utilizamos o seguinte comando, notando que é necessário estar no mesmo diretório que a dockerfile. + +`docker build -t python-server:v1 .` + +Utilizamos a flag `t` para nomear a image python-server, com a tag v1. Use o comando `docker image ls` para verificar que a image está de fato no seu sistema. + diff --git a/stack/auxiliares/docker/conceitos_importantes.md b/stack/auxiliares/docker/conceitos_importantes.md new file mode 100644 index 0000000..3ff3e27 --- /dev/null +++ b/stack/auxiliares/docker/conceitos_importantes.md @@ -0,0 +1,29 @@ +--- +order: 5 +icon: book +label: "Conceitos" +author: + name: +date: 2025-10-28 +category: Conceitos importantes +tags: + - fundamentos + - explicacao +--- + +# Antes de iniciar... + +Antes de iniciar a explicação sobre como usar docker para desenvolver suas aplicações, é necessário falar sobre alguns conceitos essenciais para a compreensão dos próximos tópicos + +# Docker images + +Container é como chamamos os processo sendo executado por uma máquina, mas como o container sabe qual é sua tarefa e quais são as dependencias necessárias para executar tal tarefa? Utilizando uma image. + +Uma image é como chamamos o pacote que inclui os arquivos binários, dependências, bibliotecas e configurações para um container. Em termos da programação orientada à objetos, a docker image é uma classe, e os containeres são instâncias dessa classe. + +É importante notar que images são imutáveis, uma vez criadas, só podem ser alteradas adicionado mudanças ou criando uma nova image do zero. Além disso, images são construídas em camadas, cada camada representa uma mudança no sistema de arquivos, adicionando, removendo ou modificando arquivos. + +# Docker regsistry + +Para compartilhar docker images, há os docker registries, plataformas que permitem armazenamento e compartilhamento de images, de modo similar ao github, mas exclusivas para images. O registro oficial do docker é o DockerHub, que pode ser acessado em https://hub.docker.com/. Há outros registros, por exemplo, as grandes empresas fornecedoras de computação em nuvem, como Amazon (Amazon Elastic Container Registry) , Microsoft (Azure container registry), e Google (Google Container Registry) também oferecem registros para containeres. + diff --git a/stack/auxiliares/docker/containers.md b/stack/auxiliares/docker/containers.md new file mode 100644 index 0000000..b9b6c72 --- /dev/null +++ b/stack/auxiliares/docker/containers.md @@ -0,0 +1,69 @@ +--- +order: 2 +icon: rocket +label: "Executando um container" +author: + name: +date: 2025-10-28 +category: Explicação +tags: + - fundamentos + - explicacao +--- + + +# Rodando containers + +Se já temos uma image, podemos executar um container a partir dessa image, para isso, utilizamos o comando `docker run`, que tem o seguinte formato. + +`docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]` + +Caso o docker não encontre localmente a image que você deseja rodar, ele fará uma busca no registro remoto configurado, o registro padrão é o dockerhub. + +## Flags para o comando run + +Abaixo estão algumas flags frequentemente utilizadas para modificar o comando de execução. + +`--name `: designa o nome `custom-name` ao container, caso não seja especificado, docker vai gerar um nome aleatório. + +`-p :`: conecta a porta `host-port` à porta `container-port` do container. + +`-d`: roda o container no background, ou seja, não ocupa o terminal atual. + +`-e =`: define uma variavel de ambiente. + +`--rm`: encerra o container quando a execução deste for concluida. + +`-- memory `: especifica um limite de memoria para o container, caso o limite seja ultrapassado o container é encerrado. + +`-t`: conecta o terminal ao I/O stream do container. + +`-i`: permite enviar texto ao stdin(input padrão) do container. + +## Comandos úteis para o gerenciamento de containers + +Aqui estão alguns comandos frequentemente utilizados para o gerenciamento de containers. + +`docker ps`: lista os containers ativos. + +`docker kill `: finaliza um container de maneira abrupta. + +`docker stop `: finaliza um container, esperando um certo tempo por seu encerramento. + +`docker port `: lista as portas utilizadas por um container. + +`docker stats `: mostra os recursos atualmente utilizados pelo container. + +`docker rename `: renomeia um container. + +`docker restart `: reinicia um container. + +## Retomando o exemplo + +Vamos rodar o servidor python que fizemos anteriormente, para isso, usamos o seguinte comando: + +`docker run -p 8000:8000 -d server.py` + +Verifique que o container está rodando utilizando o comando `docker ps`. Como nã utilizamos a flag `name`, nosso container recebeu automaticamente um nome aleatório. + +Há algumas formas diferentes de interromper o container. A maneira mais "graciosa", de acordo com o docker, é utilizando o comando `docker stop`, pois este envia um sinal de parada ao container e espera seu encerramento. Ao contrário do `docker stop`, o comando `docker kill` finaliza abruptamente um container, o que pode comprometer processos que não são fechados corretamente. \ No newline at end of file diff --git a/stack/auxiliares/docker/images.md b/stack/auxiliares/docker/images.md new file mode 100644 index 0000000..8ccfe61 --- /dev/null +++ b/stack/auxiliares/docker/images.md @@ -0,0 +1,95 @@ +--- +order: 4 +icon: paste +label: "Escrevendo images" +author: + name: +date: 2025-10-28 +category: Explicação +tags: + - fundamentos + - explicacao + - images +--- + +# Criando uma image + +Para criar uma image, utilizamos uma dockerfile, que é um arquivo contendo instruções acerca de como construir a image requerida. Uma boa prática é sempre criar a dockerfile no mesmo diretório dos arquivos que serão necessários para o container.É comum escrever os comandos dentro de uma dockerfile utilizando letras maiúsculas, abaixo estão alguns comandos mais comunmente utilizados. + +## Comandos mais utilizados + +-`FROM `: especifica uma image já existente para ser usada como base. + +-`WORKDIR `: especifica o diretório de trabalho atual dentro da image, ou seja, onde os próximos comandos serão executados e para onde os arquivos devem ser copiados. Caso o diretório ainda não exista, ele será criado automaticamente. + +-`COPY `: copia o arquivo `src` para dentro da image no path `dest`. + +-`ADD `: faz a mesma coisa que copy, mas permite que src seja uma URL.É importante notar que, caso `src` seja um arquivo .tar, este comando irá automaticamente fazer a extração dos arquivos no interior do .tar. + +-`RUN `: faz com que o construtor execute o comando especificado. + +-`ENV `: define uma variável de ambiente. + +-`EXPOSE `: esse comando meramente indica ao usuário em qual porta o construtor da image gostaria que o container fosse exposto, porém não realiza de fato nenhuma ação. + +-`CMD [“”, “”]`: especifica o comando padrão a ser executado pela image. + +## Exemplo prático + +Como exemplo, vamos fazer uma Dockerfile para um server http simples usando python, o server retorna apenas uma página com "Hello world". + +```bash + +mkdir Dockerteste +cd Dockerteste +touch server.py +touch index.html +touch Dockerfile +``` + +```python Dockerteste/server.py +from http.server import SimpleHTTPRequestHandler, HTTPServer + +server = HTTPServer(("0.0.0.0", 8000), SimpleHTTPRequestHandler) +server.serve_forever() +``` + +```html Dockerteste/index.html +

Hello world

+``` + +```docker Dockerteste/Dockerfile +FROM ubuntu + +RUN apt-get update +RUN apt-get install -y python3 + +WORKDIR /server +COPY index.html . +COPY server.py . + +EXPOSE 8000 +CMD ["python3", "server.py"] +``` + +Cada comando na Dockerfile de exemplo realiza os seguintes passos: + +-`FROM ubuntu`: especifica que queremos usar uma image já existente do SO ubuntu. + +-`RUN apt-get update`: executa o comando de busca de atualizações. + +-`RUN apt-get install -y python3`: executa o comando para instalação do python. + +-`WORKDIR /server`: cria o diretório `/server` e o configura como diretório de trabalho atual. + +-`COPY index.html`: copia `index.html` para o diretório `/server`. + +-`COPY server.py`: copia `server.py` para o diretório `/server`. + +-`EXPOSE 8000`: mostra que queremos expor o container na porta 8000. + +-`CMD ["python3", "server.py"]`: executa o comando "python3 server.py" ao iniciar o container. + +## Podemos usar um .dockerignore + +Caso não queira que o docker ignore completamente um arquivo específico, basta criar um arquivo `.dockerignore` e incluir o nome do arquivo. Assim como o `.gitignore`, os arquivos nomeados serão totalmente ignorados. diff --git a/stack/auxiliares/docker/index.yml b/stack/auxiliares/docker/index.yml new file mode 100644 index 0000000..2bc710c --- /dev/null +++ b/stack/auxiliares/docker/index.yml @@ -0,0 +1,5 @@ +icon: /assets/logos-tecnologias/docker-logo.png +label: Docker +author: + name: Pedro Santos +date: 2025-09-28 diff --git a/stack/auxiliares/docker/introducao.md b/stack/auxiliares/docker/introducao.md new file mode 100644 index 0000000..9e0d06a --- /dev/null +++ b/stack/auxiliares/docker/introducao.md @@ -0,0 +1,32 @@ +--- +order: 6 +icon: question +label: "O que é docker?" +author: + name: +date: 2025-10-28 +category: Explicação +tags: + - fundamentos + - explicacao +--- + +# O que é docker? + +Docker é uma plataforma para desenvolvimento, distribuição e execução de aplicações. É uma plataforma baseada em containers, permitindo isolamento e segurança entre diferentes processos. Como containers são feitos para consumirem poucos recursos, isso permite o uso eficiente de recursos, ao distribuir a memória e poder computacional entre diversos containers. + +# O que é um container? + +Um container é uma unidade de software que contém todos os pacotes necessários para rodar uma determinada aplicação. Esses containeres funcionam como processos isolados, rodando em um ambiente próprio. Isso garante alguns benefícios, como: + +-Independência: como cada container existe em um ambiente isolado, é possível evitar conflitos de dependência entre processos ao incluir diferentes versões de bibliotecas em cada container. + +-Velocidade: containers podem ser iniciados e finalizados em um intervalo de tempo muito pequeno(segundos ou minutos), permitindo mais rapidez no desenvolvimento, manutenção e distribuição de aplicações. + +-Segurança: como cada container é um ambiente isolado, ataques ou falhas de segurança em um container não podem afetar outros containeres e nem a máquina que está executando o processo. + +-Portatibilidade: containers podem rodar em qualquer máquina que suporte o sistema docker, desde computadores pessoais até ambientes de nuvem. + +## Containers não são máquinas virtuais + +Enquanto VM’s são abstrações de uma máquina física, containeres são abstrações à nível de aplicação. Máquinas virtuais precisam ter um sistema operacional próprio, o que as faz consumir muitos recursos do sistema. Containeres não precisam de um sistema operacional instalad o internamente, podendo compartilhar o kernel com outros containeres, o que demanda muito menos recursos. \ No newline at end of file diff --git a/stack/auxiliares/docker/memoria.md b/stack/auxiliares/docker/memoria.md new file mode 100644 index 0000000..e5f8fb0 --- /dev/null +++ b/stack/auxiliares/docker/memoria.md @@ -0,0 +1,48 @@ +--- +order: 1 +icon: cache +label: "Durabilidade de memória" +author: + name: +date: 2025-10-28 +category: Explicação +tags: + - fundamentos + - explicacao +--- + +# Persistência de dados e containers + +Quando um container é iniciado, ele usa os arquivos configurados na image. Embora o container possa criar, deletar e alterar arquivos ao longo de sua execução, os dados alterados são apagados ao finalizar o container. Para lidar com persistencia de dados, há 2 mecanismos possíveis, volume e bind. + +## Volumes + +Volumes são um mecanismo de persistência de dados que permite armazenar dados fora de um container. Esses arquivos são criados e gerenciados pelo docker, e ficam armazenados no host do container. Para criar um volume, usamos o comando à seguir: + +`docker volume create ` + +Para conectar um volume à um container, operação chamado de "montar" um volume, é utilizada a flag -v ao iniciar o container: + +`docker run -v : ` + +Isso faz como que todos os arquivos escritos em source sejam salvos no volume, que não é apagado quando o container é encerrado. Abaixo estão alguns comandos interessantes para o gerenciamento de volumes. + +`docker volume ls`: lista os volumes + +`docker volume rm `: apaga um volume, é necessário que este volume não esteja sendo utilizado por nenhum container, caso contrário sua destruição é bloqueada. + +`docker volume prune`: remove todos os volumes não sendo usados por nenhum container. + +`docker volume inspect `: fornece informações acerca do volume. + +## Binds + +Outro modo de adquirir durabilidade de dados é dar ao container acesso à arquivos no host, ou seja, compartilhar arquivos entre o host e o container. Para isso, o docker disponibiliza um mecanismo chamado bind, que pode ser feito com o seguinte comando: + +`docker run --mount type=bind, source=, target= ` + +Por exemplo, para bindar o seu diretorio /Documents para o diretorio /Documents de um container ubuntu, basta usar o seguinte comando: + +`docker run --mount -ti type=bind, source = /home//Documents, target=/Documents ubuntu` + +Para fins de segurança, é possível fazer um bind read-only, basta adicionar a keyword `readonly`, separa por vírgula, após o argumento target. \ No newline at end of file From 817ea8ff91f2ddfe92427b5b11c3d8cad0f4f97c Mon Sep 17 00:00:00 2001 From: Miner320 Date: Thu, 30 Oct 2025 10:05:58 -0300 Subject: [PATCH 2/4] adicionei alguns links --- stack/auxiliares/docker/build.md | 2 +- stack/auxiliares/docker/conceitos_importantes.md | 2 +- stack/auxiliares/docker/containers.md | 2 +- stack/auxiliares/docker/images.md | 2 +- stack/auxiliares/docker/memoria.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/stack/auxiliares/docker/build.md b/stack/auxiliares/docker/build.md index 9a47d99..d19dc06 100644 --- a/stack/auxiliares/docker/build.md +++ b/stack/auxiliares/docker/build.md @@ -19,7 +19,7 @@ Com uma dockerfile em mãos, prosseguimos para construir, ou fazer o build de um Onde `[OPTIONS]` indica as flags e `PATH|URL` indica o contexto de execução, que pode ser um diretório local ou um repositório remoto. -O comando build busca um arquivo com o nome Dockerfile dentro do contexto de execução e o usa para construir a image, por isso é mais conveniente sempre usar esse nome. Abaixo estão algumas flags interessantes que podem ser usadas para modificar o comportamento do comando build. +O comando build busca um arquivo com o nome Dockerfile dentro do contexto de execução e o usa para construir a image, por isso é mais conveniente sempre usar esse nome. Abaixo estão algumas flags interessantes que podem ser usadas para modificar o comportamento do comando build. A documentação introdutória para este assunto pode ser acessada em https://docs.docker.com/get-started/docker-concepts/building-images/build-tag-and-publish-an-image/. ## Flags frequentemente usadas diff --git a/stack/auxiliares/docker/conceitos_importantes.md b/stack/auxiliares/docker/conceitos_importantes.md index 3ff3e27..1f8f790 100644 --- a/stack/auxiliares/docker/conceitos_importantes.md +++ b/stack/auxiliares/docker/conceitos_importantes.md @@ -13,7 +13,7 @@ tags: # Antes de iniciar... -Antes de iniciar a explicação sobre como usar docker para desenvolver suas aplicações, é necessário falar sobre alguns conceitos essenciais para a compreensão dos próximos tópicos +Antes de iniciar a explicação sobre como usar docker para desenvolver suas aplicações, é necessário falar sobre alguns conceitos essenciais para a compreensão dos próximos tópicos. A documentação introdutória oficial para este assunto está disponível em https://docs.docker.com/get-started/docker-concepts/the-basics/what-is-a-container/. # Docker images diff --git a/stack/auxiliares/docker/containers.md b/stack/auxiliares/docker/containers.md index b9b6c72..309c823 100644 --- a/stack/auxiliares/docker/containers.md +++ b/stack/auxiliares/docker/containers.md @@ -18,7 +18,7 @@ Se já temos uma image, podemos executar um container a partir dessa image, para `docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]` -Caso o docker não encontre localmente a image que você deseja rodar, ele fará uma busca no registro remoto configurado, o registro padrão é o dockerhub. +Caso o docker não encontre localmente a image que você deseja rodar, ele fará uma busca no registro remoto configurado, o registro padrão é o dockerhub. A documentação introdutória oficial para este assunto está disponível em https://docs.docker.com/get-started/docker-concepts/running-containers/publishing-ports/ ## Flags para o comando run diff --git a/stack/auxiliares/docker/images.md b/stack/auxiliares/docker/images.md index 8ccfe61..1eb4ecb 100644 --- a/stack/auxiliares/docker/images.md +++ b/stack/auxiliares/docker/images.md @@ -14,7 +14,7 @@ tags: # Criando uma image -Para criar uma image, utilizamos uma dockerfile, que é um arquivo contendo instruções acerca de como construir a image requerida. Uma boa prática é sempre criar a dockerfile no mesmo diretório dos arquivos que serão necessários para o container.É comum escrever os comandos dentro de uma dockerfile utilizando letras maiúsculas, abaixo estão alguns comandos mais comunmente utilizados. +Para criar uma image, utilizamos uma dockerfile, que é um arquivo contendo instruções acerca de como construir a image requerida. Uma boa prática é sempre criar a dockerfile no mesmo diretório dos arquivos que serão necessários para o container. É comum escrever os comandos dentro de uma dockerfile utilizando letras maiúsculas, abaixo estão alguns comandos mais comunmente utilizados. A documentação introdutória oficial para este assunto pode ser acessada em https://docs.docker.com/get-started/docker-concepts/building-images/. ## Comandos mais utilizados diff --git a/stack/auxiliares/docker/memoria.md b/stack/auxiliares/docker/memoria.md index e5f8fb0..c204db6 100644 --- a/stack/auxiliares/docker/memoria.md +++ b/stack/auxiliares/docker/memoria.md @@ -13,7 +13,7 @@ tags: # Persistência de dados e containers -Quando um container é iniciado, ele usa os arquivos configurados na image. Embora o container possa criar, deletar e alterar arquivos ao longo de sua execução, os dados alterados são apagados ao finalizar o container. Para lidar com persistencia de dados, há 2 mecanismos possíveis, volume e bind. +Quando um container é iniciado, ele usa os arquivos configurados na image. Embora o container possa criar, deletar e alterar arquivos ao longo de sua execução, os dados alterados são apagados ao finalizar o container. Para lidar com persistencia de dados, há 2 mecanismos possíveis, volume e bind. A documentação introdutória oficial para este assunto está disponível em https://docs.docker.com/get-started/docker-concepts/running-containers/persisting-container-data/. ## Volumes From 92cde154591ef770a7b65ec8d661ed40a288e94d Mon Sep 17 00:00:00 2001 From: Miner320 Date: Tue, 4 Nov 2025 10:31:48 -0300 Subject: [PATCH 3/4] adicionei um pouco sobre o compose --- stack/auxiliares/docker/build.md | 2 +- stack/auxiliares/docker/compose.md | 124 ++++++++++++++++++ .../docker/conceitos_importantes.md | 2 +- stack/auxiliares/docker/containers.md | 2 +- stack/auxiliares/docker/images.md | 4 +- stack/auxiliares/docker/introducao.md | 2 +- stack/auxiliares/docker/memoria.md | 2 +- 7 files changed, 132 insertions(+), 6 deletions(-) create mode 100644 stack/auxiliares/docker/compose.md diff --git a/stack/auxiliares/docker/build.md b/stack/auxiliares/docker/build.md index d19dc06..12b7228 100644 --- a/stack/auxiliares/docker/build.md +++ b/stack/auxiliares/docker/build.md @@ -1,5 +1,5 @@ --- -order: 3 +order: 4 icon: tools label: "Fazendo o build" author: diff --git a/stack/auxiliares/docker/compose.md b/stack/auxiliares/docker/compose.md new file mode 100644 index 0000000..7b1b094 --- /dev/null +++ b/stack/auxiliares/docker/compose.md @@ -0,0 +1,124 @@ +--- +order: 1 +icon: versions +label: "O compose" +author: + name: Pedro Santos +date: 2025-10-28 +category: Explicação +tags: + - explicacao + - images + - compose +--- + +# O que é Docker compose + +Docker compose é uma ferramenta para definir e manter aplicações multi-container. Esta ferramenta facilita a manutenção +da aplicação, suas redes e volumes, ao permitir a configuração em um único arquivo YAML. + +## Instalação + +Para instalar o plugin do docker compose, basta usar o seguinte comando: + +```bash +sudo apt-get install docker-compose-plugin +``` + +## Exemplo + +Este exemplo foi copiado da documentação oficial do docker compose, disponível em https://docs.docker.com/compose/gettingstarted/#step-1-set-up. + +```bash + mkdir composetest + cd composetest +``` + +```python3 app.py +import time + +import redis +from flask import Flask + +app = Flask(__name__) +cache = redis.Redis(host='redis', port=6379) + +def get_hit_count(): + retries = 5 + while True: + try: + return cache.incr('hits') + except redis.exceptions.ConnectionError as exc: + if retries == 0: + raise exc + retries -= 1 + time.sleep(0.5) + +@app.route('/') +def hello(): + count = get_hit_count() + return f'Hello World! I have been seen {count} times.\n' +``` + +```requirements.txt +flask +redis +``` + +```docker Dockerfile +FROM python:3.10-alpine +WORKDIR /code +ENV FLASK_APP=app.py +ENV FLASK_RUN_HOST=0.0.0.0 +RUN apk add --no-cache gcc musl-dev linux-headers +COPY requirements.txt requirements.txt +RUN pip install -r requirements.txt +EXPOSE 5000 +COPY . . +CMD ["flask", "run", "--debug"] +``` + +Até agora estes foram os passos padrão para definir uma image, para usar o compose é preciso criar um arquivo de configuração YAML. + +```yaml compose.yaml +services: + web: + build: . + ports: + - "8000:5000" + redis: + image: "redis:alpine" +``` + +Esse arquivo define 2 serviços, `web` e `redis`. O serviço `web` utiliza dockerfile presente no diretório para fazer o build, e utiliza uma conexão entre as portas do container e uma porta externa. + +## Building + +Para fazer o build usando o docker compose, use o comando: + +`docker compose up` + +É possível utilizar as flags para execução de container no docker compose, por exemplo, `-d` faz com que os containers rodem no background. + +## Alguns comandos interessantes + +A lista completa de comandos pode ser acessada em https://docs.docker.com/reference/cli/docker/compose/. + +-`docker compose down [OPTIONS] [SERVICES]`: Interrompe e remove containers, redes e volumes criados por um comando `up`. + +-`docker compose images [OPTIONS] [SERVICE]`: lista as imagens utilizadas por containers. + +-`docker compose kill [OPTIONS] [SERVICE]`: força a interrupção de containers. + +-`docker compose ls [OPTIONS]`: lista os projetos compose sendo executados. + +-`docker compose ps[OPTIONS] [SERVICE]`: lista e fornece informações acerca dos containers em um projeto compose. + +-`docker compose pull [OPTIONS] [SERVICE]`: faz download de uma image associada a um serviço definido por um arquivo `compose.yaml`. + +-`docker compose up [OPTIONS] [SERVICE]`: builda, cria e inicia containers para um serviço. + +## Documentação para YAML + +A documentação para os arquivos `compose.yaml` é extremamente extensa, a documentação oficial pode ser acessada em https://docs.docker.com/reference/compose-file/. + diff --git a/stack/auxiliares/docker/conceitos_importantes.md b/stack/auxiliares/docker/conceitos_importantes.md index 1f8f790..f459d1b 100644 --- a/stack/auxiliares/docker/conceitos_importantes.md +++ b/stack/auxiliares/docker/conceitos_importantes.md @@ -1,5 +1,5 @@ --- -order: 5 +order: 6 icon: book label: "Conceitos" author: diff --git a/stack/auxiliares/docker/containers.md b/stack/auxiliares/docker/containers.md index 309c823..bd18cc5 100644 --- a/stack/auxiliares/docker/containers.md +++ b/stack/auxiliares/docker/containers.md @@ -1,5 +1,5 @@ --- -order: 2 +order: 3 icon: rocket label: "Executando um container" author: diff --git a/stack/auxiliares/docker/images.md b/stack/auxiliares/docker/images.md index 1eb4ecb..f365516 100644 --- a/stack/auxiliares/docker/images.md +++ b/stack/auxiliares/docker/images.md @@ -1,5 +1,5 @@ --- -order: 4 +order: 5 icon: paste label: "Escrevendo images" author: @@ -34,6 +34,8 @@ Para criar uma image, utilizamos uma dockerfile, que é um arquivo contendo inst -`CMD [“”, “”]`: especifica o comando padrão a ser executado pela image. +-`ARG `: declara uma variável que deve receber um valor durante a build da image. + ## Exemplo prático Como exemplo, vamos fazer uma Dockerfile para um server http simples usando python, o server retorna apenas uma página com "Hello world". diff --git a/stack/auxiliares/docker/introducao.md b/stack/auxiliares/docker/introducao.md index 9e0d06a..1c5d37e 100644 --- a/stack/auxiliares/docker/introducao.md +++ b/stack/auxiliares/docker/introducao.md @@ -1,5 +1,5 @@ --- -order: 6 +order: 7 icon: question label: "O que é docker?" author: diff --git a/stack/auxiliares/docker/memoria.md b/stack/auxiliares/docker/memoria.md index c204db6..d6189bd 100644 --- a/stack/auxiliares/docker/memoria.md +++ b/stack/auxiliares/docker/memoria.md @@ -1,5 +1,5 @@ --- -order: 1 +order: 2 icon: cache label: "Durabilidade de memória" author: From 6ca432228c60a79b18cfa0aa884bd2f1d7a44350 Mon Sep 17 00:00:00 2001 From: Miner320 Date: Fri, 14 Nov 2025 12:47:30 -0300 Subject: [PATCH 4/4] correcoes para o PR --- stack/auxiliares/docker/build.md | 16 ++++++------ stack/auxiliares/docker/compose.md | 14 +++++----- .../docker/conceitos_importantes.md | 8 +++--- stack/auxiliares/docker/containers.md | 14 +++++----- stack/auxiliares/docker/images.md | 26 +++++++++---------- stack/auxiliares/docker/introducao.md | 14 +++++----- stack/auxiliares/docker/memoria.md | 18 ++++++------- 7 files changed, 55 insertions(+), 55 deletions(-) diff --git a/stack/auxiliares/docker/build.md b/stack/auxiliares/docker/build.md index 12b7228..004616a 100644 --- a/stack/auxiliares/docker/build.md +++ b/stack/auxiliares/docker/build.md @@ -29,21 +29,21 @@ O comando build busca um arquivo com o nome Dockerfile dentro do contexto de exe `--label =“”`: permite adicionar metadados à build. --`t :`: adiciona tags à imagem, como nome e versão, caso não seja especificado o docker sempre utiliza a tag “:latest” como padrão. +`-t :`: adiciona tags à imagem, como nome e versão, caso não seja especificado o docker sempre utiliza a tag “:latest” como padrão. -## Comandos relacionas à images +## Comandos relacionados à images Aqui estão alguns comandos mais frequentemente utilizados para gerenciar images docker. --`docker image ls`: lista as images presentes no sistema. +- `docker image ls`: lista as images presentes no sistema. --`docker image pull [OPTIONS] NAME[:TAG|@DIGEST]`: faz download de uma image em um registro remoto. +- `docker image pull [OPTIONS] NAME[:TAG|@DIGEST]`: faz download de uma image em um registro remoto. --`docker image push [OPTIONS] NAME[:TAG]`: faz upload de uma image para um registro remoto. +- `docker image push [OPTIONS] NAME[:TAG]`: faz upload de uma image para um registro remoto. --`docker image rm [OPTIONS] IMAGE [IMAGE...]`: remove uma ou mais images. +- `docker image rm [OPTIONS] IMAGE [IMAGE...]`: remove uma ou mais images. --`docker image tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]`: cria uma nova tag para uma image já existente. +- `docker image tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]`: cria uma nova tag para uma image já existente. ## Retomando o exemplo @@ -51,5 +51,5 @@ Para fazer a build do servidor python simples demonstrado na seção anterior, u `docker build -t python-server:v1 .` -Utilizamos a flag `t` para nomear a image python-server, com a tag v1. Use o comando `docker image ls` para verificar que a image está de fato no seu sistema. +Utilizamos a flag `-t` para nomear a image python-server, com a tag v1. Use o comando `docker image ls` para verificar que a image está de fato no seu sistema. diff --git a/stack/auxiliares/docker/compose.md b/stack/auxiliares/docker/compose.md index 7b1b094..d8b416b 100644 --- a/stack/auxiliares/docker/compose.md +++ b/stack/auxiliares/docker/compose.md @@ -104,19 +104,19 @@ Para fazer o build usando o docker compose, use o comando: A lista completa de comandos pode ser acessada em https://docs.docker.com/reference/cli/docker/compose/. --`docker compose down [OPTIONS] [SERVICES]`: Interrompe e remove containers, redes e volumes criados por um comando `up`. +- `docker compose down [OPTIONS] [SERVICES]`: Interrompe e remove containers, redes e volumes criados por um comando `up`. --`docker compose images [OPTIONS] [SERVICE]`: lista as imagens utilizadas por containers. +- `docker compose images [OPTIONS] [SERVICE]`: lista as imagens utilizadas por containers. --`docker compose kill [OPTIONS] [SERVICE]`: força a interrupção de containers. +- `docker compose kill [OPTIONS] [SERVICE]`: força a interrupção de containers. --`docker compose ls [OPTIONS]`: lista os projetos compose sendo executados. +- `docker compose ls [OPTIONS]`: lista os projetos compose sendo executados. --`docker compose ps[OPTIONS] [SERVICE]`: lista e fornece informações acerca dos containers em um projeto compose. +- `docker compose ps [OPTIONS] [SERVICE]`: lista e fornece informações acerca dos containers em um projeto compose. --`docker compose pull [OPTIONS] [SERVICE]`: faz download de uma image associada a um serviço definido por um arquivo `compose.yaml`. +- `docker compose pull [OPTIONS] [SERVICE]`: faz download de uma image associada a um serviço definido por um arquivo `compose.yaml`. --`docker compose up [OPTIONS] [SERVICE]`: builda, cria e inicia containers para um serviço. +- `docker compose up [OPTIONS] [SERVICE]`: builda, cria e inicia containers para um serviço. ## Documentação para YAML diff --git a/stack/auxiliares/docker/conceitos_importantes.md b/stack/auxiliares/docker/conceitos_importantes.md index f459d1b..c17997b 100644 --- a/stack/auxiliares/docker/conceitos_importantes.md +++ b/stack/auxiliares/docker/conceitos_importantes.md @@ -3,7 +3,7 @@ order: 6 icon: book label: "Conceitos" author: - name: + name: Pedro Santos date: 2025-10-28 category: Conceitos importantes tags: @@ -17,13 +17,13 @@ Antes de iniciar a explicação sobre como usar docker para desenvolver suas apl # Docker images -Container é como chamamos os processo sendo executado por uma máquina, mas como o container sabe qual é sua tarefa e quais são as dependencias necessárias para executar tal tarefa? Utilizando uma image. +Container é como chamamos os processos sendo executado por uma máquina, mas como o container sabe qual é sua tarefa e quais são as dependencias necessárias para executar tal tarefa? Utilizando uma image. Uma image é como chamamos o pacote que inclui os arquivos binários, dependências, bibliotecas e configurações para um container. Em termos da programação orientada à objetos, a docker image é uma classe, e os containeres são instâncias dessa classe. É importante notar que images são imutáveis, uma vez criadas, só podem ser alteradas adicionado mudanças ou criando uma nova image do zero. Além disso, images são construídas em camadas, cada camada representa uma mudança no sistema de arquivos, adicionando, removendo ou modificando arquivos. -# Docker regsistry +# Docker registry -Para compartilhar docker images, há os docker registries, plataformas que permitem armazenamento e compartilhamento de images, de modo similar ao github, mas exclusivas para images. O registro oficial do docker é o DockerHub, que pode ser acessado em https://hub.docker.com/. Há outros registros, por exemplo, as grandes empresas fornecedoras de computação em nuvem, como Amazon (Amazon Elastic Container Registry) , Microsoft (Azure container registry), e Google (Google Container Registry) também oferecem registros para containeres. +Para compartilhar docker images, existem os docker registries, plataformas que permitem armazenamento e compartilhamento de images, de modo similar ao github, mas exclusivas para images. O registro oficial do docker é o DockerHub, que pode ser acessado em https://hub.docker.com/. Há outros registros, por exemplo, as grandes empresas fornecedoras de computação em nuvem, como Amazon (Amazon Elastic Container Registry) , Microsoft (Azure container registry), e Google (Google Container Registry) também oferecem registros para containeres. diff --git a/stack/auxiliares/docker/containers.md b/stack/auxiliares/docker/containers.md index bd18cc5..3b74443 100644 --- a/stack/auxiliares/docker/containers.md +++ b/stack/auxiliares/docker/containers.md @@ -3,7 +3,7 @@ order: 3 icon: rocket label: "Executando um container" author: - name: + name: Pedro Santos date: 2025-10-28 category: Explicação tags: @@ -24,17 +24,17 @@ Caso o docker não encontre localmente a image que você deseja rodar, ele fará Abaixo estão algumas flags frequentemente utilizadas para modificar o comando de execução. -`--name `: designa o nome `custom-name` ao container, caso não seja especificado, docker vai gerar um nome aleatório. +`--name `: designa o nome `custom-name` ao container, caso não seja especificado, docker vai gerar um nome aleatório. `-p :`: conecta a porta `host-port` à porta `container-port` do container. `-d`: roda o container no background, ou seja, não ocupa o terminal atual. -`-e =`: define uma variavel de ambiente. +`-e =`: define uma variável de ambiente. -`--rm`: encerra o container quando a execução deste for concluida. +`--rm`: encerra o container quando a execução deste for concluída. -`-- memory `: especifica um limite de memoria para o container, caso o limite seja ultrapassado o container é encerrado. +`--memory `: especifica um limite de memória para o container, caso o limite seja ultrapassado o container é encerrado. `-t`: conecta o terminal ao I/O stream do container. @@ -62,8 +62,8 @@ Aqui estão alguns comandos frequentemente utilizados para o gerenciamento de co Vamos rodar o servidor python que fizemos anteriormente, para isso, usamos o seguinte comando: -`docker run -p 8000:8000 -d server.py` +`docker run -p 8000:8000 -d python-server:v1` -Verifique que o container está rodando utilizando o comando `docker ps`. Como nã utilizamos a flag `name`, nosso container recebeu automaticamente um nome aleatório. +Verifique que o container está rodando utilizando o comando `docker ps`. Como não utilizamos a flag `--name`, nosso container recebeu automaticamente um nome aleatório. Há algumas formas diferentes de interromper o container. A maneira mais "graciosa", de acordo com o docker, é utilizando o comando `docker stop`, pois este envia um sinal de parada ao container e espera seu encerramento. Ao contrário do `docker stop`, o comando `docker kill` finaliza abruptamente um container, o que pode comprometer processos que não são fechados corretamente. \ No newline at end of file diff --git a/stack/auxiliares/docker/images.md b/stack/auxiliares/docker/images.md index f365516..5a3f7f8 100644 --- a/stack/auxiliares/docker/images.md +++ b/stack/auxiliares/docker/images.md @@ -3,7 +3,7 @@ order: 5 icon: paste label: "Escrevendo images" author: - name: + name: Pedro Santos date: 2025-10-28 category: Explicação tags: @@ -14,7 +14,7 @@ tags: # Criando uma image -Para criar uma image, utilizamos uma dockerfile, que é um arquivo contendo instruções acerca de como construir a image requerida. Uma boa prática é sempre criar a dockerfile no mesmo diretório dos arquivos que serão necessários para o container. É comum escrever os comandos dentro de uma dockerfile utilizando letras maiúsculas, abaixo estão alguns comandos mais comunmente utilizados. A documentação introdutória oficial para este assunto pode ser acessada em https://docs.docker.com/get-started/docker-concepts/building-images/. +Para criar uma image, utilizamos uma dockerfile, que é um arquivo contendo instruções acerca de como construir a image requerida. Uma boa prática é sempre criar a dockerfile no mesmo diretório dos arquivos que serão necessários para o container. É comum escrever os comandos dentro de uma dockerfile utilizando letras maiúsculas, abaixo estão alguns comandos mais mente utilizados. A documentação introdutória oficial para este assunto pode ser acessada em https://docs.docker.com/get-started/docker-concepts/building-images/. ## Comandos mais utilizados @@ -24,7 +24,7 @@ Para criar uma image, utilizamos uma dockerfile, que é um arquivo contendo inst -`COPY `: copia o arquivo `src` para dentro da image no path `dest`. --`ADD `: faz a mesma coisa que copy, mas permite que src seja uma URL.É importante notar que, caso `src` seja um arquivo .tar, este comando irá automaticamente fazer a extração dos arquivos no interior do .tar. +-`ADD `: faz a mesma coisa que COPY, mas permite que src seja uma URL. É importante notar que, caso `src` seja um arquivo .tar, este comando irá automaticamente fazer a extração dos arquivos no interior do .tar. -`RUN `: faz com que o construtor execute o comando especificado. @@ -57,7 +57,7 @@ server.serve_forever() ``` ```html Dockerteste/index.html -

Hello world

+

Hello world

``` ```docker Dockerteste/Dockerfile @@ -76,22 +76,22 @@ CMD ["python3", "server.py"] Cada comando na Dockerfile de exemplo realiza os seguintes passos: --`FROM ubuntu`: especifica que queremos usar uma image já existente do SO ubuntu. +- `FROM ubuntu`: especifica que queremos usar uma image já existente do SO ubuntu. --`RUN apt-get update`: executa o comando de busca de atualizações. +- `RUN apt-get update`: executa o comando de busca de atualizações. --`RUN apt-get install -y python3`: executa o comando para instalação do python. +- `RUN apt-get install -y python3`: executa o comando para instalação do python. --`WORKDIR /server`: cria o diretório `/server` e o configura como diretório de trabalho atual. +- `WORKDIR /server`: cria o diretório `/server` e o configura como diretório de trabalho atual. --`COPY index.html`: copia `index.html` para o diretório `/server`. +- `COPY index.html`: copia `index.html` para o diretório `/server`. --`COPY server.py`: copia `server.py` para o diretório `/server`. +- `COPY server.py`: copia `server.py` para o diretório `/server`. --`EXPOSE 8000`: mostra que queremos expor o container na porta 8000. +- `EXPOSE 8000`: mostra que queremos expor o container na porta 8000. --`CMD ["python3", "server.py"]`: executa o comando "python3 server.py" ao iniciar o container. +- `CMD ["python3", "server.py"]`: executa o comando "python3 server.py" ao iniciar o container. ## Podemos usar um .dockerignore -Caso não queira que o docker ignore completamente um arquivo específico, basta criar um arquivo `.dockerignore` e incluir o nome do arquivo. Assim como o `.gitignore`, os arquivos nomeados serão totalmente ignorados. +Caso queira que o docker ignore completamente um arquivo específico, basta criar um arquivo `.dockerignore` e incluir o nome do arquivo. Assim como o `.gitignore`, os arquivos nomeados serão totalmente ignorados. diff --git a/stack/auxiliares/docker/introducao.md b/stack/auxiliares/docker/introducao.md index 1c5d37e..46541fc 100644 --- a/stack/auxiliares/docker/introducao.md +++ b/stack/auxiliares/docker/introducao.md @@ -3,7 +3,7 @@ order: 7 icon: question label: "O que é docker?" author: - name: + name: Pedro Santos date: 2025-10-28 category: Explicação tags: @@ -17,16 +17,16 @@ Docker é uma plataforma para desenvolvimento, distribuição e execução de ap # O que é um container? -Um container é uma unidade de software que contém todos os pacotes necessários para rodar uma determinada aplicação. Esses containeres funcionam como processos isolados, rodando em um ambiente próprio. Isso garante alguns benefícios, como: +Um container é uma unidade de software que contém todos os pacotes necessários para rodar uma determinada aplicação. Esses containers funcionam como processos isolados, rodando em um ambiente próprio. Isso garante alguns benefícios, como: --Independência: como cada container existe em um ambiente isolado, é possível evitar conflitos de dependência entre processos ao incluir diferentes versões de bibliotecas em cada container. +- Independência: como cada container existe em um ambiente isolado, é possível evitar conflitos de dependência entre processos ao incluir diferentes versões de bibliotecas em cada container. --Velocidade: containers podem ser iniciados e finalizados em um intervalo de tempo muito pequeno(segundos ou minutos), permitindo mais rapidez no desenvolvimento, manutenção e distribuição de aplicações. +- Velocidade: containers podem ser iniciados e finalizados em um intervalo de tempo muito pequeno(segundos ou minutos), permitindo mais rapidez no desenvolvimento, manutenção e distribuição de aplicações. --Segurança: como cada container é um ambiente isolado, ataques ou falhas de segurança em um container não podem afetar outros containeres e nem a máquina que está executando o processo. +- Segurança: como cada container é um ambiente isolado, ataques ou falhas de segurança em um container não podem afetar outros containers e nem a máquina que está executando o processo. --Portatibilidade: containers podem rodar em qualquer máquina que suporte o sistema docker, desde computadores pessoais até ambientes de nuvem. +- Portatibilidade: containers podem rodar em qualquer máquina que suporte o sistema docker, desde computadores pessoais até ambientes de nuvem. ## Containers não são máquinas virtuais -Enquanto VM’s são abstrações de uma máquina física, containeres são abstrações à nível de aplicação. Máquinas virtuais precisam ter um sistema operacional próprio, o que as faz consumir muitos recursos do sistema. Containeres não precisam de um sistema operacional instalad o internamente, podendo compartilhar o kernel com outros containeres, o que demanda muito menos recursos. \ No newline at end of file +Enquanto VM’s são abstrações de uma máquina física, containers são abstrações à nível de aplicação. Máquinas virtuais precisam ter um sistema operacional próprio, o que as faz consumir muitos recursos do sistema. Containers não precisam de um sistema operacional instalado internamente, podendo compartilhar o kernel com outros containers, o que demanda muito menos recursos. \ No newline at end of file diff --git a/stack/auxiliares/docker/memoria.md b/stack/auxiliares/docker/memoria.md index d6189bd..085d915 100644 --- a/stack/auxiliares/docker/memoria.md +++ b/stack/auxiliares/docker/memoria.md @@ -1,9 +1,9 @@ --- order: 2 icon: cache -label: "Durabilidade de memória" +label: "Persistência de dados" author: - name: + name: Pedro Santos date: 2025-10-28 category: Explicação tags: @@ -13,15 +13,15 @@ tags: # Persistência de dados e containers -Quando um container é iniciado, ele usa os arquivos configurados na image. Embora o container possa criar, deletar e alterar arquivos ao longo de sua execução, os dados alterados são apagados ao finalizar o container. Para lidar com persistencia de dados, há 2 mecanismos possíveis, volume e bind. A documentação introdutória oficial para este assunto está disponível em https://docs.docker.com/get-started/docker-concepts/running-containers/persisting-container-data/. +Quando um container é iniciado, ele usa os arquivos configurados na image. Embora o container possa criar, deletar e alterar arquivos ao longo de sua execução, os dados alterados são apagados ao finalizar o container. Para lidar com persistência de dados, há 2 mecanismos possíveis, volume e bind. A documentação introdutória oficial para este assunto está disponível em https://docs.docker.com/get-started/docker-concepts/running-containers/persisting-container-data/. ## Volumes -Volumes são um mecanismo de persistência de dados que permite armazenar dados fora de um container. Esses arquivos são criados e gerenciados pelo docker, e ficam armazenados no host do container. Para criar um volume, usamos o comando à seguir: +Volumes são um mecanismo de persistência de dados que permite armazenar dados fora de um container. Esses arquivos são criados e gerenciados pelo docker, e ficam armazenados no host do container. Para criar um volume, usamos o comando a seguir: `docker volume create ` -Para conectar um volume à um container, operação chamado de "montar" um volume, é utilizada a flag -v ao iniciar o container: +Para conectar um volume à um container, operação chamada de "montar" um volume, é utilizada a flag -v ao iniciar o container: `docker run -v : ` @@ -39,10 +39,10 @@ Isso faz como que todos os arquivos escritos em source sejam salvos no volume, q Outro modo de adquirir durabilidade de dados é dar ao container acesso à arquivos no host, ou seja, compartilhar arquivos entre o host e o container. Para isso, o docker disponibiliza um mecanismo chamado bind, que pode ser feito com o seguinte comando: -`docker run --mount type=bind, source=, target= ` +`docker run --mount type=bind,source=,target= ` -Por exemplo, para bindar o seu diretorio /Documents para o diretorio /Documents de um container ubuntu, basta usar o seguinte comando: +Por exemplo, para bindar o seu diretório /Documents para o diretório /Documents de um container ubuntu, basta usar o seguinte comando: -`docker run --mount -ti type=bind, source = /home//Documents, target=/Documents ubuntu` +`docker run -ti --mount type=bind,source=/home//Documents,target=/Documents ubuntu` -Para fins de segurança, é possível fazer um bind read-only, basta adicionar a keyword `readonly`, separa por vírgula, após o argumento target. \ No newline at end of file +Para fins de segurança, é possível fazer um bind read-only, basta adicionar a keyword `readonly`, separada por vírgula, após o argumento target. \ No newline at end of file