# Criando imagens

O Docker pode construir automaticamente imagens lendo as instruções de um arquivo `Dockerfile`.

#### Dockerfile

O arquivo `Dockerfile` funciona como uma receita de bolo contendo as instruções de configuração para a configuração e execução do seu contêiner.

Neste exemplo, criaremos uma imagem de servidor web que exibirá uma página personalizada.

#### Servidor web

Crie uma pasta para armazenar os arquivos necessários para nossa imagem:

```bash
# acesando o home do usuário
cd ~

# criando a pasta
mkdir web

# entrando na pasta criada
cd web
```

Crie um arquivo chanado `index.html` com o seguinte conteúdo:

```html

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Página em manutenção</title>
</head>
<body>
<article>
    <h1>Página de Teste!</h1>
    <div>
        <p>Esta é uma página de teste.</p>
    </div>
</article>
</body>
</html>
```

Crie um arquivo chamado `Dockerfile` com o seguinte conteúdo:

```yaml
# imagem base
FROM  ubuntu:oracular

# atualizando os pacotes e instalando o pacote nginx (servidor web)
RUN apt update && apt install -y nginx

# expondo a porta onde será executado o serviço no container
EXPOSE 80

# copiando o arquivo local para pasta dentro do container
COPY index.html /var/www/html

# comando que é executado, por padrao, quando o container se inicia
CMD ["nginx", "-g", "daemon off;"]
```

#### Criando a imagem

Dentro da pasta contendo o `Dockerfile`, execute o comando de build:

```bash
docker build -t nginx-treinamento .
```

Em caso de sucesso, você verá algo como:

```bash
(...)

 => => writing image sha256:4ba7dcc4bf31d3a97cee54016702f9565b5c203f62d624136b7cdc3e0cf9090d                                       0.0s 
 => => naming to docker.io/library/nginx-treinamento
```

A imagem docker foi criada com o nome `docker.io/library/nginx-treinamento` ou simplesmente `nginx-treinamento:latest`.

Mostrar as imagens locais disponíveis:

```bash
docker images
```

Saída:

```bash
REPOSITORY          TAG       IMAGE ID       CREATED              SIZE
nginx-treinamento   latest    4ba7dcc4bf31   About a minute ago   123MB
```

- `nginx-treinamento`: nome da imagem
- `latest`: tag da imagem

<p class="callout info">Quando listamos as imagens, o nome do repositório padrão `docker.io/library/` é suprimido.</p>

#### Executando a imagem

Execute o seguinte comando:

```bash
docker run \
    -it \
    -d \
    --name="web" \
    -p 9595:80 \
    --restart="always" \
    nginx-treinamento
```

<p class="callout info">A porta `9595` é onde o serviço ficará acessível no host, e a porta `80` é onde o serviço está disponível dentro do contêiner.</p>

<p class="callout warning">**Opcional**: se a porta utilizada no nosso exemplo já tiver sendo utilizado por outro serviço, você pode executar o contêiner com o mapeamento para outra porta (Exemplo: `9090`) altere a linha `-p` para:</p>

```
     -p 9090:80
```

Listando os contêiners ativos:

```bash
docker ps
```

Você verá algo como:

<table id="bkmrk-container_id-image-c"><thead><tr><th>CONTAINER\_ID</th><th>IMAGE</th><th>COMMAND</th><th>CREATED</th><th>STATUS</th><th>PORTS</th></tr></thead><tbody><tr><td>14a72c95d77b</td><td>nginx-treinamento</td><td>"nginx -g 'daemon ..."</td><td>1 minute ago</td><td>Up</td><td>0.0.0.0:9595-&gt;80</td></tr></tbody></table>

Para testar, acesse pelo navegador o endereço: [http://localhost:9595/](http://localhost:9595/).

Você deverá ver algo como:

[![Captura de tela de 2024-07-03 10-13-22.png](https://documentacao.ufvjm.edu.br/uploads/images/gallery/2024-07/scaled-1680-/lQJm5og7kQKCfrmu-captura-de-tela-de-2024-07-03-10-13-22.png)](https://documentacao.ufvjm.edu.br/uploads/images/gallery/2024-07/lQJm5og7kQKCfrmu-captura-de-tela-de-2024-07-03-10-13-22.png)

**Página de teste acessada pelo navegador**

Vamos remover este contêiner:

```bash
docker rm -f web
```

Saída:

```bash
web
```

#### Acessando os arquivos dentro do contêiner

Vamos recriar este mesmo contêiner do exemplo anterior, no entanto, desta vez vamos adicionar uma montagem de volume, para que possamos realizar a edição da página inicial que criamos e visualizar o reflexo destas alterações na página no navegador.

Criando novamente o contêiner:

```bash
docker run \
  -it \
  -d \
  --name="web" \
  -v ~/web:/var/www/html \
  -p 9595:80 \
  --restart="always" \
  nginx-treinamento
```

<p class="callout info">A pasta `~/web` refere-se à localização da pasta dentro do host, a pasta `/var/www/html` refere-se à localização da pasta dentro do contêiner.</p>

Acesse o navegador novamente.

Vamos editar o arquivo `index.html` localizado na pasta `~/web` e conferir se as alterações se refletem no navegador web.

Alterar esse trecho de:

```html
<p>Esta é uma página de teste.</p>
```

Para:

```html
<p>Esta é uma página de teste, agora com alterações</p>
```

<div id="bkmrk-acesse-o-navegador-n-1">Acesse o navegador novamente e atualize (atalho `F5`).</div><div id="bkmrk--1">  
</div><div id="bkmrk-se-tudo-ocorreu-como">Se tudo ocorreu como esperado, você irá visualizar:</div><div id="bkmrk--2"></div><div id="bkmrk--3">[![Captura de tela de 2024-07-03 10-31-33.png](https://documentacao.ufvjm.edu.br/uploads/images/gallery/2024-07/scaled-1680-/ZRGfZsV4FBEbaZu0-captura-de-tela-de-2024-07-03-10-31-33.png)](https://documentacao.ufvjm.edu.br/uploads/images/gallery/2024-07/ZRGfZsV4FBEbaZu0-captura-de-tela-de-2024-07-03-10-31-33.png)</div><div class="align-center" id="bkmrk-p%C3%A1gina-de-teste-com-">**Página de teste com alterações**</div>A partir de agora, você está pronto para realizar as alterações desejadas nos seus arquivos na sua área de desenvolvimento.

#### Removendo o contêiner

Após finalizar os testes, remova o contêiner:

```bash
docker rm -f web
```

Depois disso, caso deseje, remover os arquivos utilizados para nosso teste, apagar a pasta criada:

```bash
rm -rf ~/web
```

#### Referências

[https://docs.docker.com/reference/dockerfile/](https://docs.docker.com/reference/dockerfile/ "Dockerfile reference")

</body></html>