# 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 Página em manutenção

Página de Teste!

Esta é uma página de teste.

``` 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

Quando listamos as imagens, o nome do repositório padrão `docker.io/library/` é suprimido.

#### Executando a imagem Execute o seguinte comando: ```bash docker run \ -it \ -d \ --name="web" \ -p 9595:80 \ --restart="always" \ nginx-treinamento ```

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.

**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 9090:80 ``` Listando os contêiners ativos: ```bash docker ps ``` Você verá algo como:
CONTAINER\_IDIMAGECOMMANDCREATEDSTATUSPORTS
14a72c95d77bnginx-treinamento"nginx -g 'daemon ..."1 minute agoUp0.0.0.0:9595->80
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 ```

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.

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

Esta é uma página de teste.

``` Para: ```html

Esta é uma página de teste, agora com alterações

```
Acesse o navegador novamente e atualize (atalho `F5`).
Se tudo ocorreu como esperado, você irá visualizar:
[![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)
**Página de teste com alterações**
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")