Criando o seu primeiro Docker Container

Criando o seu primeiro Docker Container

Docker √© uma plataforma de c√≥digo aberto que permite aos desenvolvedores criar, publicar e executar facilmente aplicativos de forma isolada. Os containers s√£o leves e port√°teis porque suas configura√ß√Ķes e sistema operacional s√£o encapsulados, permitindo que sejam executados de forma consistente, independentemente da infraestrutura e respeitando sua arquitetura (x86_64, amd64 e arm).

A plataforma facilita o empacotamento de um aplicativo em uma imagem de container com garantia de execução em qualquer sistema operacional compatível com o Docker. Isso significa que podemos criar um aplicativo, empacotar e garantir que ele seja executado em qualquer servidor de produção ou até mesmo seu laptop. Esse é o fim desta história…

Na minha m√°quina funciona!

O Docker usa uma arquitetura de cliente e servidor para se comunicar com o daemon, um recurso que tem foi muito falado e é o motivo pelo qual não é mais suportado no Kubernetes, mas vamos guardá-lo para o artigo sobre Podman.

How to run Secure Pods with Podman

O grande recurso que impulsionou a popularidade dos containers foi o Docker CLI. Antes da introdu√ß√£o do Docker, o kernel do Linux passou por atualiza√ß√Ķes que possibilitaram a execu√ß√£o de processos isolados que chamamos de "containers", mas fazer essa execu√ß√£o isolada era um assunto bastante avan√ßado, n√£o t√≠nhamos o DockerHub e apenas um monte de scripts. A CLI tornou isso f√°cil e rico em detalhes. Al√©m da orquestra√ß√£o, podemos extrair logs, automatizar processos de desenvolvimento e entrega cont√≠nua.

A popularidade do Docker √© t√£o grande que podemos dizer que ele se tornou a ferramenta padr√£o para a cria√ß√£o de ambientes de desenvolvimento. Antes do Docker quando tudo era mato! Havia a necessidade de instalar nossas ferramentas de trabalho como bancos de dados, servi√ßos de cache, servi√ßos de mensagens, linguagens de programa√ß√£o e outras ferramentas diretamente na inst√Ęncia de trabalho e muitas vezes t√≠nhamos dificuldade em preparar o ambiente. O Docker √© utilizado por empresas de diversos portes que desejam reduzir e entender seus custos.

Sem mais delongas, iremos criar nosso primeiro container.

Instale o Docker primeiro, a documenta√ß√£o oficial cobre todas os sabores de distribui√ß√Ķes e m√©todos de instala√ß√£o, saiba mais clicando aqui.

1. Escolher uma imagem

Ao trabalhar com Docker,  o tamanho da imagem também é um fator muito relevante e deve ser levado em consideração, por isso vamos trabalhar com Alpine Linux, que tem um tamanho virtual em torno de 40MB e se mantém constantemente atualizado.

Neste momento a √ļltima vers√£o do alpine √© 3.17.2.

2. Criar um Dockerfile

Para manter tudo em casa, construiremos uma aplicação em Go, a linguagem em que o Docker foi escrito.

Abaixo temos alguns arquivos necessários para compilar nossa aplicação em Go.

  • go.mod
module flip_coin

go 1.20
  • flip_coin.go
package main

import (
	"fmt"
	"net/http"
	"math/rand"
	"time"
)


func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		coin := []string{
			"heads",
			"tails",
		}
	
		rand.Seed(time.Now().UnixNano())
		side := coin[rand.Intn(len(coin))]

        fmt.Fprintf(w, "You got %s\n", side)
    })

	http.ListenAndServe(":3000", nil)
}

Pronto hora de escrever nosso Dockerfile.

FROM golang:alpine3.17

MAINTAINER [email protected]

WORKDIR /app

COPY flip_coin.go go.mod ./

RUN go build -o /flip_coin

EXPOSE 3000

CMD [ "/flip_coin" ]
  • FROM imagem base para compila√ß√£o;
  • MAINTAINER e-mail do respons√°vel pela imagem;
  • WORKDIR diret√≥rio de execu√ß√£o;
  • COPY arquivos que ser√£o copiados para o diret√≥rio de execu√ß√£o;
  • RUN executa comandos antes da execu√ß√£o do container;
  • EXPOSEindica quais portas esse container ir√° utilizar ou escutar;
  • CMD indica qual ser√° o comando para execu√ß√£o do container;
Existem outras instru√ß√Ķes utilizadas para o Dockerfile como ADD, ENTRYPOINT, ENV, entre outros veja mais na documenta√ß√£o oficial.

3. Compilar a imagem

Nesta etapa iremos utilzar o comando build para compilar nosso Docker file e transformar em uma imagem nomeada my-first-container.

docker build -t [nome-da-image] [diretório-base]
docker build -t my-first-container .

4. Executar o container

Podemos executar o container no modo "attached", podemos chamar de modo síncrono, ou "detached" seria o modo background.

docker run --name [nome-do-container] [nome-da-imagem]
# attached
docker run --name my-first-container --rm -p 3001:3000 my-first-container

# detached
docker run -d --name my-first-container -p 3001:3000 my-first-container
  • --name atribui um nome que deve ser √ļnico a container;
  • --rm remove o container ap√≥s a execu√ß√£o
  • -p 3001:3000 informa que a porta p√ļblica 3001 ser√° encaminhada para a porta privada 3000 do container;
  • -d roda no modo "detached" desta forma a execu√ß√£o seu terminal fica livre e a execu√ß√£o ocorre em background;

Testando o container

Iremos executar uma requisição na URL http://localhost:3001/, onde iremos obter a resposta do cara ou coroa.

curl  --location  http://localhost:3001/
> You got tails

Inspecionando

docker ps -a
docker images
  • ps lista os containers, o par√Ęmetro -a informa que desejamos a lista completa inclusive os que n√£o est√£o em execu√ß√£o;
  • images lista container images baixados e compilados localmente.

Removendo tudo

docker stop my-first-container
docker rm my-first-container
docker rmi my-first-container

  • stop para a execu√ß√£o do container;
  • rm remove o container;
  • rmi remove a imagem compilada do container;

Outros artigos

Docker é um dos temas que tenho dedicado bastante ultimamente, existem outros artigos que podem complementar este estudo como: Volumes, Logs, Network e outros recursos, veja mais no link abaixo.

Fim!

Espero que este artigo seja de grande ajuda para você que está entrando neste mundo de tecnologia onde um framework ou linguagem nasce a cada minuto.

Até a próxima, Deus abençoe seu dia e mantenha seu kernel atualizado!