> For the complete documentation index, see [llms.txt](https://yatax.leandronsp.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yatax.leandronsp.com/docker-101.md).

# Docker 101

Fundamentos de containers e Docker

### Exemplo de uma app Ruby e outra NodeJS

Vamos supor que você escreve sua app em Ruby ou Javascript. Precisa então instalar um ambiente de execução para rodar sua aplicação, que se chama "runtime".

![](https://4151365178-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxadzjCxdPSf9iWeKMHWK%2Fuploads%2FX3dnpPeQisbLfZDUqJUh%2FScreenshot%202022-01-08%20at%2015.22.14.png?alt=media\&token=c862cf28-b50f-4005-9e41-d1b6bb128fc7)

O runtime, por sua vez, tem dependências para poder funcionar adequadamente, que *têm de ser instaladas* no teu sistema operacional.

![](https://4151365178-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxadzjCxdPSf9iWeKMHWK%2Fuploads%2F8a1SfeJpyOsuK14U5Sjz%2FScreenshot%202022-01-08%20at%2015.25.54.png?alt=media\&token=8213951c-50a0-4e81-849c-7d09315ba4ed)

### Conflitos?

Mas o quê acontece quando você precisa instalar outra versão do Ruby (2.5, 2.7, 3.0) no teu sistema, para rodar *diferentes* aplicações Ruby?

Podem haver conflitos com extensões nativas onde seja preciso *reinstalar novamente* o runtime ou as dependências:

![](https://4151365178-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxadzjCxdPSf9iWeKMHWK%2Fuploads%2FKPeXTpLqfhVYJWocB54m%2FScreenshot%202022-01-08%20at%2015.33.46.png?alt=media\&token=0eb4b08b-aabd-4fcf-984a-3c9e29b7229d)

*Uma das* soluções para isto é instalar o runtime não diretamente no SO, mas em outra camada de abstração.

![](https://4151365178-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxadzjCxdPSf9iWeKMHWK%2Fuploads%2FCPJGBv8N9O9Kc8F5kTTq%2FScreenshot%202022-01-08%20at%2015.36.37.png?alt=media\&token=29c6a327-67f5-4cbf-a466-e5958e18b8ed)

Esta camada, geralmente se faz com [*virtualização*](https://en.wikipedia.org/wiki/Virtualization)*.* Poderíamos fazer virtualização de diversas formas, dentre elas:

1. instalar uma máquina virtual (VM)
2. instalar um container runtime Linux

**Máquina Virtual**

Emula todo kernel do sistema operacional host e ocupa área física de CPU e memória.

![](https://4151365178-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxadzjCxdPSf9iWeKMHWK%2Fuploads%2FVorVG9dngeqPWaqT7N4n%2FScreenshot%202022-01-08%20at%2015.59.10.png?alt=media\&token=f89866df-0083-42e8-b97a-9f00c16bb590)

**Container Runtime Linux**

Não emula o kernel como em uma VM mas permite isolamento de arquivos, networking, CPU e memória através de **Linux namespaces e Linux cgroups.**

É mais leve que virtualização com VM, e possui o cenário adequado para rodar as apps sem precisar virtualizar um SO diferente.

![](https://4151365178-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxadzjCxdPSf9iWeKMHWK%2Fuploads%2FE90XdRezPLovy2hFKeWT%2FScreenshot%202022-01-08%20at%2016.00.07.png?alt=media\&token=f1bd80e8-2abc-4579-b3ca-1fa873432aa2)

Como mencionei, são "Linux" namespaces e cgroups. Portanto, só funciona em Linux.

*Sorry, other systems.*

Mas manusear namespaces e cgroups dá muito trabalho. Vários projetos foram criados de forma a abstrair isto, dentre eles o amado e odiado, *Docker*.

### Instalação em Linux

Linux users, go ahead and [install it](https://docs.docker.com/engine/install/).

### E outros sistemas operacionais?

Até parece que users de macOS e Windows ficariam de fora né? Como resolver o problema?

Isto mesmo, **VM Linux**. E dentro da VM, há o tal do container runtime É exatamente isto o que o Docker for Mac e Docker for Windows fazem.

![](https://4151365178-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxadzjCxdPSf9iWeKMHWK%2Fuploads%2Fp3tBUUUJPbaKOluizzRe%2FScreenshot%202022-01-08%20at%2016.03.07.png?alt=media\&token=9aa40b87-e9d9-44e7-9a5a-04b3358a5712)

Então corre lá pra instalar o Docker no teu computador e começa a fazer alguns tutoriais no próprio site do Docker&#x20;

* [Instalação](<https://docs.docker.com/get-docker/ >)
* [Tutorial](https://docs.docker.com/get-started/)

### Commit com configuração mínima do Docker

{% embed url="<https://github.com/leandronsp/yatax/commit/14659c34d93afde04f6d22763ca1d9c0a302341b>" %}
