“Uma imagem nada mais é que um container parado”
A imagem é a abstração da infraestrutura em estado somente leitura, de onde será instanciado o container.
Cada instrução no Dockerfile cria / adiciona mais uma camada.
Resumão
O Dockerfile é basicamente um arquivo de texto em que colocamos instruções para buildar uma imagem de container.
Dockerfile
### Imagem base
FROM ubuntu:18.04
## Executar comandos durante a criação da imagem
RUN apt-get update && apt-get install nginx -y
## Expor uma porta
EXPOSE 80
## Executar comandos quando o container for iniciado
CMD ["nginx", "-g", "daemon off;"]
Buildando a imagem e rodando o container:
## Buildar
docker image build -t meu-nginx:1.0 .
## Executar a imagem
docker run -d -p 8080:80 --name meu-nginx meu-nginx:1.0
## Imagem base
FROM ubuntu:22.04
## Executar comandos durante a criação da imagem
RUN apt update && apt install -y nginx && rm -rf /var/lib/apt/list/*
## Expor uma porta
EXPOSE 80
## Copiar diretórios e arquivos do host
COPY index.html /var/www/html/
## Executar comandos quando o container for executado
CMD ["nginx", "-g", "daemon off;"]
## Alterar o diretório de trabalho - quando o container for iniciado
WORKDIR /var/www/html/
## Definir variáveis de ambiente
ENV APP_VERSION=1.0.0
Onde
COPY
- é usado para copiar arquivos da estação onde está executando a construção para dentro da imagemWORKDIR
- muda o diretório de trabalho - do “/” (raiz) para o especificado neleENV
- Define variáveis de ambiente## Buildar
docker image build -t meu-nginx:2.0 .
## Executar a imagem
docker run -d -p 8080:80 --name meu-nginx2 meu-nginx:2.0
## Imagem base
FROM ubuntu:22.04
## Label
LABEL maintainer="contato@lu.dev.br"
## Executar comandos durante a criação da imagem
RUN apt update && apt install -y nginx && rm -rf /var/lib/apt/list/*
## Expor a porta 80
EXPOSE 80
## Copiar diretórios e arquivos do host
COPY index.html /var/www/html/
## Alterar o diretório de trabalho.
WORKDIR /var/www/html/
## Definir variáveis de ambiente
ENV APP_VERSION=1.0.0
## Principal processo do container
ENTRYPOINT ["nginx"]
## Parâmetros do processo executado pelo Entrypoint
CMD ["-g", "daemon off;"]
Onde
LABEL
- adiciona metadados à imagem, como versão, descrição e fabricanteENTRYPOINT
- permite que você configure um container para rodar um executável. Quando esse executável for finalizado, o container também será.
## Buildar
docker image build -t meu-nginx:3.0 .
## Executar a imagem
docker run -d -p 8080:80 --name meu-nginx3 meu-nginx:3.0
O HELTHCHECK
verifica a integridade de um container na inicialização.
health
na verificação.## Imagem base
FROM ubuntu:22.04
## Label
LABEL maintainer="contato@lu.dev.br"
## Executar comandos durante a criação da imagem
RUN apt update && apt install -y nginx curl && rm -rf /var/lib/apt/list/*
## Expor a porta 80
EXPOSE 80
## Copiar diretórios e arquivos do host
COPY index.html /var/www/html/
## Alterar o diretório de trabalho
WORKDIR /var/www/html/
## Definir variáveis de ambiente
ENV APP_VERSION=1.0.0
## Principal processo do container
ENTRYPOINT ["nginx"]
## Parâmetros do processo executado pelo Entrypoint
CMD ["-g", "daemon off;"]
## Verificar a integridade de um container - curl localhost a cada 2s e finalizar se der erro
HEALTHCHECK --timeout=2s CMD curl localhost || exit 1
O ADD
copia novos arquivos, diretórios, arquivos TAR ou arquivos remotos e os adiciona ao filesystem do container.
## Imagem base
FROM ubuntu:22.04
## Label
LABEL maintainer="contato@lu.dev.br"
## Executar comandos durante a criação da imagem
RUN apt update && apt install -y nginx curl && rm -rf /var/lib/apt/list/*
## Expor a porta 80
EXPOSE 80
## Adicionar arquivos e diretórios locais ou remotos
ADD node_exporter-1.9.1.linux-amd64.tar.gz /root/node-exporter
## Copiar diretórios e arquivos do host
COPY index.html /var/www/html/
## Alterar o diretório de trabalho
WORKDIR /var/www/html/
## Definir variáveis de ambiente
ENV APP_VERSION=1.0.0
## Principal processo do container
ENTRYPOINT ["nginx"]
## Parâmetros do processo executado pelo Entrypoint
CMD ["-g", "daemon off;"]
## Verificar a integridade do container
HEALTHCHECK --timeout=2s CMD curl localhost || exit 1
Forma de fazer com que as imagens fiquem mais performáticas, menores
## Image base
FROM golang:1.18
## Workdir da aplicaão
WORKDIR /app
## Copiar tudo que está no mesmo nível do Dockerfile jogue para o dir do workdir /app
COPY hello.go ./
RUN go mod init hello
## Fazer o build
RUN go build -o /app/hello
## Execução do binário do go
CMD ["/app/hello"]
hello.go
:package main
import (
"fmt"
)
func main(){
fmt.Println("Hello Giropops!")
}
FROM golang:1.18 as buildando
WORKDIR /app
COPY . ./
RUN go mod init hello
RUN go build -o /app/hello
FROM alpine:3.15.9
COPY --from=buildando /app/hello /app/hello
CMD ["app/hello"]
Onde:
FROM golang AS buildando
- Estamos utilizando a imagem do Golang para criação da imagem de container, e estamos nomeando esse bloco como “buildando”;ADD . ./
- Adicionando o código de nossa app dentro do container;WORKDIR /app
- Definindo que o diretório de trabalho é o “/app”, ou seja, quando o container iniciar, estaremos nesse diretório;RUN go build -o /app/hello
- Vamos executar o build de nossa app Golang.FROM alpine:3.15.9
- Iniciando o segundo bloco e utilizando a imagem do Alpine para criação da imagem de container;COPY --from=buildando /app/hello /app/hello
- Aqui vamos copiar do bloco “buildando” um arquivo dentro de “/app/hello” para o diretório “/app” do container que estamos tratando nesse bloco, ou seja, copiamos o binário que foi compilado no bloco anterior e o trouxemos para esse;CMD ["/app/hello"]
- Aqui vamos executar a nossa app.ENV
: usado para criar variáveis de ambienteARG
: é valido somente no momento de buildFROM golang:1.18 as buildando
WORKDIR /app
COPY . ./
RUN go mod init hello
RUN go build -o /app/hello
FROM alpine:3.15.9
COPY --from=buildando /app/hello /app/hello
ENV APP="hello world" ## var de ambiente
ARG GIROPOPS="strigus" ## arg no momento de build
ENV GIROPOPS=$GIROPOPS
RUN echo "O giropops é: $GIROPOPS" ## run na arg
CMD ["app/hello"]
--build-arg
mais o argumento:## Exemplo
docker build -t go-teste:2.1 --build-arg GIROPOPS=catota .
Registry: repositório que contém imagens de containers
Comandos utilizados:
Docker pull
- Baixa uma imagem do Docker Hub ou de outro registryDocker push
- Envia uma imagem para o Docker Hub ou outro registrydocker logout
- Desloga o usuário## Baixar ou atualizar uma imagem de um registry
docker image pull [nome_da_imagem:tag]
docker image pull python:latest
## Remover a imagem
docker image rm id_da_imagem
## Docker login
docker login -u nome_de_usuario
#Docker logout
docker logout
## Docker pull
docker pull nginx
## Listar imagens
docker image ls
## Renomear a imagem
docker image tag nginx:latest ludsilva/meu-nginx-teste:1.0
## Buildar a imagem
docker build -t ludsilva/meu-nginx-teste:1.0 .
## Fazer o pull
docker push
## Exemplo com app golang
docker image ls
docker tag go-teste:3.1 ludsilva/go-teste:4.0
docker build -t ludsilva/go-teste:4.0 .
docker push
Resolver problemas contruindo Dockerfiles performáticos
Para esse exemplo, usei um API simples em Python que retorna requests de status HTTP.
app = Flask (name)
PORT = 5000
@app.route(‘/’, methods=[‘GET’]) def home(): return “Ok”, 200
@app.errorhandler(404) def not_found(e): return “Not found”, 404
if name == ‘main’: app.run(host=’0.0.0.0’,port=PORT)
- Dockerfile
```docker
FROM python:3.10-alpine
LABEL maintainer="contato@lu.dev.br"
WORKDIR /app
COPY . ./
RUN apk add --no-cache curl \
&& pip install --no-cache-dir -r requirements.txt
EXPOSE 3000
CMD ["python", "app.py"]
HEALTHCHECK --timeout=5s --interval=30s --retries=3 CMD curl -f localhost:3000 || exit 1