pick-linuxtips

Índice Day-2

1 - O que são imagens de container

“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

2 - Meu primeiro dockerfile

O Dockerfile é basicamente um arquivo de texto em que colocamos instruções para buildar uma imagem de container.

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

3 - Conhecendo mais parâmetros do Dockerfile

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

Buildando

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

4 - Dockerfile e o EntryPoint

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

Buildando

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

5 - Adicionando Healtcheck

O HELTHCHECK verifica a integridade de um container na inicializaçã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

6 - Utilizando o ADD

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

7 - Multistage

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"]
package main

import (
  "fmt"
)

func main(){
  fmt.Println("Hello Giropops!")
}

Multistage - Dockerfile

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:

8 - ENV e ARG

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
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"]

## Exemplo
docker build -t go-teste:2.1 --build-arg GIROPOPS=catota .

9 - Pull, Push e Dockerhub

Registry: repositório que contém imagens de containers

Comandos utilizados:

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

Fazendo push

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

Desafio prático 1

Desafio prático 2

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