Começando com Docker
Tags: docker, containers, developer
Published: 2023-09-25 10:37:14

Docker é um software que reduz a complexibilidade do setup ao permitir que configuremos **containers**, que funcionam como servidores para executar nossas aplicações. Com facilidade, podemos criar **ambientes **independentes que operam em diversos Sistemas Operacionais, o que torna os projetos mais **eficientes**.

Considere o seguinte: um projeto pode ter muitos requisitos para funcionar em sua máquina. Isso pode resultar em perda de tempo ao instalar e configurar todo o ambiente necessário. Com o Docker, você pode simplesmente pegar uma **imagem **pronta para executar o projeto.

Para aprofundarmos nosso conhecimento em Docker, é crucial compreender duas partes essenciais: os Containers e as Imagens. São elementos fundamentais para o funcionamento eficaz do Docker.

### Container
Um container é um conjunto de código capaz de executar uma ação, como rodar uma aplicação em Node.js, PHP ou Java. Para serem executados, os containers fazem uso de imagens.

### Imagem
Uma imagem é o "projeto" que será executado pelo container. Todas as instruções necessárias para a execução estão declaradas dentro dessa imagem.

## Na Prática
Para você entender melhor, vamos criar um simples container, e nele terá uma simples imagem com uma aplicação em NodeJs ( vou considerar que já tenha o docker instalado em sua maquina, caso não tenha, siga: [https://www.docker.com/](https://www.docker.com/)).

Primeiro, precisamos iniciar uma aplicação em nodeJs, pra isso,
em uma pasta, utilizaremos o comando: `npm init`.

Se tudo der certo, agora temos um arquivo `package.json` em nosso projeto, mas agora precisamos instalar o Express para criar nosso servidor. Para isso, rodamos o comando: `npm install express`.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pxdi0x77mmgrv15u9fim.png)

Agora com tudo instalado, iremos criar um simples servidor utilizando o express. vamos criar um arquivo com qualquer nome, (eu irei chamar de `app.js`). Nele vamos adicionar a implementação para criar o servidor.

```
const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => {
    res.send('Olá minha Imagem')
})

app.listen(port, () => {
    console.log('Executando na porta:', port)
})
```

Pronto, o nosso servidor já está funcionando, mas precisamos falar sobre o docker, e onde ele se encaixa nisso.

Pra começar, precisamos criar um arquivo `dockerfile`, arquivo de configuração para definir as instruções necessárias para criar uma imagem Docker.

Primeiro, precisamos entender o que contem no corpo desse arquivo, e qual a utilidade de cada camada.

- FROM: Imagem base

- WORKDIR: Diretório da aplicação

- EXPOSE: Porta da aplicação

- COPY: Arquivos que precisam ser copiados

- CMD: Define o comando padrão a ser executado durante a implantação de uma instância da imagem do contêiner.

Claro que existem outras camadas que podem ter no dockerfile, mas para este exemplo, essas são as camadas básicas para criar nossa imagem.

No exemplo abaixo, iremos criar um dockerfile de acordo a nossa aplicação:

```
FROM node
WORKDIR /app
COPY package*.json .

run npm install

COPY . .

EXPOSE 3000

CMD [ "node", "app.js" ]
```

Agora, para criar essa imagem, precisamos rodar o comando de build. Em um terminal, dentro do local onde tem o dockerfile, rodamos o comando: `docker build .`. Isso irá criar uma imagem do docker, baseado na sua aplicação.

Para rodarmos nossa imagem em um container, basta rodarmos o comando: `docker run -p 3000:3000 [IMAGE ID]`.

Importante lembrar que, a primeira porta é onde irá rodar o docker, e a segunda porta é a da sua aplicação.

Tudo pronto. Agora podemos compartilhar essa imagem com outros desenvolvedores, e eles não vão precisar passar pelo processo de criação do servidor, pois a imagem já está configurada pra isso.

## Conclusão
O Docker simplifica o desenvolvimento e execução de aplicações através da utilização de containers, proporcionando portabilidade e eficiência.