Back End - Docker Parte 2
Published: 2022-02-15 21:15:45

Imagens Docker são arquivos que funcionam como espécies de fotos de programas, bibliotecas, frameworks ou mesmo sistemas operacionais, a partir das quais construimos containers e executamos códigos dentro do Docker .

Para listar todas as imagens que foram baixadas em algum momento no seu computador:
`docker images`

Dessa forma podemos verificar que a imagem está devidamente instalada localmente como pode ser visto a seguir:
```
REPOSITORY     TAG       IMAGE ID       CREATED        SIZE
hello-world    latest    bc11b176a293   6 weeks ago    9.14kB
```

![Docker resume](https://s3.us-east-2.amazonaws.com/assets.app.betrybe.com/back-end/docker/docker-images/images/docker-image-process-ecf083d6a6f9a0826603c69079f6718d.png)

Para sabermos se o container da imagem foi criado a partir da imagem, basta rodar o seguinte comando que retorna a lista de containers ativos e inativos (parâmetro -a ):
`docker ps -a`

**A partir de uma imagem, podemos ter vários containers .**

**Podemos ter vários containers reproduzindo uma mesma imagem do Docker .
**

Para remover a imagem (o comando -f serve para forçar a remoção do recurso):
`docker rmi -f bc11b176a293`

Sem a flag -f , o Docker irá nos alertar que já foram criados containers a partir da imagem que estamos tentando excluir, pois a remoção dessa imagem também removerá a fonte de referência dos containers criados a partir dela. Para excluir a imagem mesmo assim, é preciso acrescentar a flag -f .
Ao excluir uma imagem, os containers gerados a partir dela não serão excluídos, apenas ficaram órfãos das camadas da imagem que a utilizavam para executar suas funções. A partir do momento que excluímos uma imagem que era referência para um container, precisaremos baixar uma nova imagem se quisermos rodar os containers criados novamente

======================================================

Comando que baixa a imagem, mas não cria nenhum container:
`docker pull <imagem>`



Uma imagem é um arquivo imutável e a partir dele um ou mais containers podem ser gerados. Uma imagem do Docker é criada a partir do processo de build * de um arquivo chamado Dockerfile **.
 
Frequentemente no contexto de programação, o termo build ('construir' em português) se refere ao trabalho de pegar aquele conjunto de instruções que definimos antes (o nosso "script", "código fonte"), e a partir dele, construir um produto que seja executável de maneira mais simples - que por tanto, é melhor para distribuir.
** O Dockerfile é um arquivo que contém as instruções necessárias (como um "script") para que rodemos uma aplicação: Sistema Operacional (SO) utilizado, bibliotecas que devem ser instaladas, arquivos que devem ser inicializados, etc.

Confirmar a existência daquela imagem:
`docker images`

Já para sabermos se o container da imagem hello-world foi criado a partir da imagem, basta rodar o seguinte comando:
`docker ps -a`

**Podemos ter vários containers reproduzindo uma mesma imagem do Docker .**
Toda imagem possui sua IMAGE ID e todo container possui seu CONTAINER ID . Ambos são identificadores únicos desses elementos dentro do Docker e servem como referência para outras possibilidades de comando.

Depois de obter o IMAGE ID , basta executar o comando docker rmi -f <IMAGE ID> , em que rmi vem de " R e m over I magem" ( remove image(s) ).

Depois de obter o IMAGE ID , basta executar o comando docker rmi -f <IMAGE ID> , em que rmi vem de " R e m over I magem" ( remove image(s) ).

* É importante ressaltar que ao excluir uma imagem, os containers gerados a partir dela não serão excluídos, apenas ficaram órfãos das camadas da imagem que a utilizavam para executar suas funções.
Portanto, para gerar novos containers precisaremos de uma nova imagem.

=========================================

Toda imagem no Docker pode ter uma ou várias camadas e esse sistema é conhecido como Layered File System (Sistema de Arquivos em Camadas) .

Como em praticamente toda instância dentro Docker , cada camada também é representada por um código único (uma hash) . A finalidade dessas camadas é que elas possam ser reaproveitadas por outras imagens .

========================================

```
docker start -ai meu_container
# Aqui passamos o parâmetro `-ai` ao comando `start`,
# para dizer que queremos acoplar ao container (`a`, de 'attach'),
# de modo interativo (`i`, de 'interactive').
```

=======================================

um Servidor HTTP (Ou servidor web) é um aplicativo capaz de disponibilizar arquivos (como páginas de internet) através de requisições via protocolo de comunicação HTTP , que é o mais utilizado na navegação via internet.

Existem vários servidores http no mercado. No nosso exemplo, utilizaremos o Servidor HTTP Apache , bastante popular entre pessoas desenvolvedoras da linguagem PHP .

rode o seguinte comando para baixar a imagem do servidor:
`docker run -d -P httpd:2.4`

É importante ressaltar que a porta 80 é a porta interna que é enxergada somente dentro do container e a porta 55000 é a porta externa, ou seja, aquela que pode ser acessada em nossa máquina.

A forma que temos de identificar os containers é por meio do CONTAINER ID , porém, esses números complexos podem acabar nos confundindo na execução de algum comando.
Para resolver isso, existe a possibilidade de nomear seu container. Dessa forma, não precisamos depender de ids aleatórios que o Docker atribui e assim ficará mais fácil parar ou remover o container.
Para dar um nome ao container, basta utilizar a flag --name :
`docker run -d -P --name site-trybe httpd:2.4`

A atribuição aleatória das portas é feita pela flag -P e, para especificar a porta, utilizamos a flag -p . Desse modo, devemos seguir a sintaxe -p <PORTA-SO-HOSPEDEIRO>:<PORTA-SO-CONVIDADO> .
`docker run -d -p 54321:80 httpd:2.4`

Nesse exemplo, mapeamos a porta 54321 do nosso computador à porta 80 do container. Agora podemos acessar o site estático mantido pelo servidor Apache acessando o endereço http://localhost:54321 no navegador.

Nesse exemplo, mapeamos a porta 54321 do nosso computador à porta 80 do container. Agora podemos acessar o site estático mantido pelo servidor Apache acessando o endereço http://localhost:54321 no navegador.
==================================

o uso do parâmetro -P , ele é utilizado para que o Docker faça um mapeamento de portas automático para acesso ao container.

Um detalhe importante é que a porta do container vai variar dependendo da aplicação que você está rodando . No caso do servidor http , a porta padrão de acesso para páginas web é a 80 .
Em uma aplicação de React por outro lado, a imagem deveria expor a porta 3000 como padrão, então é importante saber qual porta sua aplicação vai usar antes de rodar o parâmetro -p .

======================================

Então, para criarmos containers para nossas aplicações, precisamos iniciar criando a imagem deles! E temos a alternativa de fazê-los a partir dos arquivos Dockerfile *.
 também podemos "commitar" (como no git ) alterações que fazemos em nossos containers, salvando eles em novas imagens.
Para isso podemos usar o comando docker commit , que serve literalmente para pegarmos as alterações (que são etapas adicionais) que fizemos no nosso container e salvar elas em uma imagem (nova ou já existente).