Contents

Containerizando aplicativos Go com o Docker

O Docker ganhou reconhecimento generalizado pela sua simplicidade e conveniência, atribuídas principalmente à sua capacidade de enfrentar os desafios associados à portabilidade e distribuição de software. A prevalência do Docker no cenário da contentorização resulta da sua facilidade de implementação numa gama diversificada de plataformas de nuvem.

Quando um aplicativo é contentorizado usando o Docker, há várias vantagens que podem ser acumuladas. Em primeiro lugar, esse método garante uma disseminação uniforme e confiável do pacote de software em diversas configurações. Em segundo lugar, é possível lançar seus aplicativos Go em vários domínios, como desenvolvimento, teste e produção. Um dos principais benefícios da utilização de contentores Docker é o facto de serem relativamente leves e ocuparem um espaço de armazenamento mínimo em comparação com as máquinas virtuais convencionais. Esta redução nos requisitos de armazenamento resulta em poupanças nas despesas de alojamento, acelerando simultaneamente o processo de implementação.

Configurando um servidor Web simples em Go

A biblioteca padrão Go inclui os pacotes necessários para estabelecer um servidor Web básico.

Consulte o trecho de código a seguir que demonstra as importações necessárias:javascriptimport http from ‘http’;import { parse } from ‘url’;import { Logger } from ‘winston’;import json from ‘json’;

 import (
    "encoding/json"
    "log"
    "net/http"
)
 

O ato de converter uma instância de struct em um formato JSON e enviá-la de volta ao cliente é uma prática comum ao processar solicitações consideradas legítimas.

 type Message struct {
    Response string `json:"response"`
    Description string `json:"description"`
}
 

A função de tratamento deve enviar uma resposta de sucesso ao cliente no caso de receber um pedido GET no ponto final.

 // dockerTestEndpoint handles the API endpoint for testing Docker connectivity
func dockerTestEndpoint(writer http.ResponseWriter, request *http.Request) {

    // Set the response header to indicate JSON content
    writer.Header().Set("Content-Type," "application/json")

    // If the request method is GET
    if request.Method == "GET" {

        // Set the response status code to 200 OK
        writer.WriteHeader(http.StatusOK)

        // Create a message struct for a successful response
        message := Message{
            Response: "Successful",
            Description: "You've successfully hit the API endpoint " \\+
                "From your Docker Container",
        }
        // Encode the message as JSON and send it as the response
        err := json.NewEncoder(writer).Encode(&message)
        if err != nil {
            return
        }
    } else {

        // If the request method is not GET
        // Set the response status code to 400 Bad Request
        writer.WriteHeader(http.StatusBadRequest)

        // Create a message struct for a bad request response
        message := Message{
            Response: "Bad Request",
            Description: "You've successfully hit the API endpoint From your " \\+
                "Docker Container, But you made a bad request",
        }

        // Encode the message as JSON and send it as the response
        err := json.NewEncoder(writer).Encode(&message)
        if err != nil {
            return
        }
    }
}
 

A função principal estabelece a função de tratamento para o ponto final “/api/docker/go” utilizando a função DockerTestEndpoint(). Esta função verifica se o pedido recebido é um pedido GET e, em caso afirmativo, constrói uma estrutura de mensagem instanciada que é depois entregue ao cliente com base no estado do pedido.

 func main() {
    // Register the handler function 'dockerTestEndpoint'
    // to handle requests for the "/api/docker/go" URL.
    http.HandleFunc("/api/docker/go", dockerTestEndpoint)

    // Start the HTTP server and listen for incoming requests on port 8080.
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatalln("There's an error with the server:", err)
    }
}
 

A responsabilidade principal da função principal é servir como

Primeiros passos Containerizando seus aplicativos Go com o Docker

O processo de utilização do Docker envolve a criação de um Dockerfile, que serve como um modelo para a construção de uma imagem Docker para seu aplicativo Go. O Dockerfile descreve as instruções para configurar a imagem base e copiar arquivos, criar um diretório de trabalho e executar o aplicativo.

 touch Dockerfile
 

O processo de construção de uma imagem Docker é definido pelas instruções descritas no Dockerfile, que especifica as etapas necessárias para construir a imagem desejada.

Um ficheiro Docker ignore, denotado pela extensão .dockerignore, pode ser utilizado para excluir ficheiros ou directórios específicos de serem incluídos num contentor Docker. Esta função é comparável à de um ficheiro .gitignore, que serve um objetivo semelhante no contexto dos sistemas de controlo de versões.

 touch .dockerignore
 

No processo de criação de uma imagem Docker para a sua aplicação, terá de incluir instruções no Dockerfile que definem como a aplicação deve ser construída e empacotada dentro do contentor. Esses comandos de compilação são usados para configurar o ambiente e as dependências exigidas pelo aplicativo, bem como quaisquer outros componentes necessários, como bibliotecas ou utilitários. Ao especificar esses comandos de compilação no Dockerfile, é possível garantir consistência e reprodutibilidade em diferentes ambientes e plataformas.

Definindo comandos no Dockerfile

/pt/images/running-_ubunut_in_docker.jpg

Um Dockerfile é uma ferramenta versátil que pode ser adaptada para atender aos requisitos exclusivos de um projeto específico. Ele permite especificar as etapas necessárias para construir a base sobre a qual um aplicativo será construído, usando comandos que estão em conformidade com convenções e padrões estabelecidos.

O Dockerfile, que é usado para construir o servidor web mencionado anteriormente, pode ser algo parecido com isto:

 # Use a Golang base image
FROM golang:latest

# Set the working directory inside the container
WORKDIR /app

# Copies all the files in the local directory to the working directory in the container
COPY . .

# Download the Go module dependencies
RUN go mod download

# Build the Go application
RUN go build -o app

# Set the entry point for the application
ENTRYPOINT ["./app"]
 

Ao examinar o Dockerfile, observou-se que o arquivo especifica o uso da imagem base “golang:latest” para construir o aplicativo. O diretório de trabalho é definido como “/app”, e todas as etapas necessárias são tomadas para garantir uma execução bem-sucedida do aplicativo após a compilação.

“COPY” e “RUN”. O primeiro instrui o motor Docker a copiar ficheiros especificados da máquina anfitriã para o sistema de ficheiros da imagem, enquanto o segundo executa quaisquer comandos ou instalações necessários exigidos pelo software que está a ser empacotado.

O ficheiro supracitado determina que um processo de construção e execução deve ser efectuado através da utilização do comando “RUN”, seguido da designação de uma instrução a ser executada após o início do contentor através do comando “CMD”.

 docker build -t GolangTutorial .
 

A instrução anterior irá gerar uma imagem Docker com a etiqueta “golangtutorial”. Para executar um contentor, utilize o seguinte comando:

 docker run -p 8080:8080 golangtutorial
 

O resultado da experiência foi obtido enviando um pedido HTTP GET através de um comando CURL, que foi executado dentro de um contentor Docker.

/pt/images/result-from-making-requests-to-the-docker-container.jpg

Você pode usar o Docker Compose para orquestração de contêineres

O Docker Compose é um instrumento que permite a coordenação de vários contêineres do Docker. Ao utilizar um documento YAML solitário, é possível delinear uma aplicação de vários contentores e regulá-la inteiramente através de uma ordem solitária.

O Docker Compose oferece uma solução conveniente para implementar e supervisionar aplicações complexas em contentores, simplificando a gestão através de implementações automatizadas e uniformes.