Docker는 간단한 기능과 사용자 친화적인 특성으로 인해 선도적인 컨테이너화 플랫폼으로 널리 인정받고 있습니다. Docker를 구현하면 소프트웨어 개발 및 배포 시 이식성과 관련된 우려를 크게 완화하여 다양한 클라우드 서비스 제공업체에 원활하게 배포할 수 있습니다.

Go 애플리케이션의 컨테이너화를 위해 Docker를 활용하면 다양한 환경에서 일관되고 신뢰할 수 있는 배포를 제공할 수 있습니다. 이러한 애플리케이션을 개발, 스테이징, 프로덕션을 포함한 여러 환경에 배포할 수 있습니다. 도커 컨테이너는 기존 가상 머신에 비해 리소스 소비가 최소화되고 설치 공간이 작아 스토리지 비용을 절감하는 동시에 배포 프로세스를 가속화할 수 있다는 특징이 있습니다.

Go에서 간단한 웹 서버 설정하기

기본 웹 서버를 구축하는 데 필요한 구성 요소 모음을 포함하는 Go 표준 라이브러리

아래 개정판을 참고하시기 바랍니다: 먼저 `http`, `log`, `json` 패키지를 가져와야 합니다. Go에서 제공하는 `http` 패키지를 사용하여 서버를 설정하고 GET 요청 엔드포인트를 처리할 것입니다. 또한 `log` 패키지는 잠재적인 오류를 콘솔에 기록하는 데 사용됩니다. 마지막으로 `json` 패키지는 API 엔드포인트에 필요한 구조체를 JSON 형식으로 직렬화하는 데 사용됩니다.

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

요청의 유효성 검사에 따라 구조체 인스턴스를 JSON 형식으로 변환하여 클라이언트에 응답으로 다시 전송하는 작업은 다음과 같이 표현할 수 있습니다:

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

핸들러 함수는 엔드포인트로부터 GET 요청을 수신하면 클라이언트에 성공 응답을 전송해야 합니다.

 // 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
        }
    }
}

메인 함수는 DockerTestEndpoint 핸들러를 사용하여 “/api/docker/go” 경로에 대한 핸들러 함수를 설정합니다. 이 핸들러는 들어오는 요청이 GET 요청인지 확인합니다. 요청이 맞으면 요청 상태에 따라 인코딩된 메시지 객체를 구성하여 클라이언트에 보냅니다.

 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)
    }
}

서버의 주요 책임은 포트 8080에서 들어오는 요청을 처리하는 엔트리 포인트에 있습니다. HandleFunc 메서드는 처리 함수에 경로를 연결하고 ListenAndServe 접근 방식은 지정된 로컬 호스트 포트 8080에서 서버의 작동을 시작합니다.

이 글도 확인해 보세요:  녹 매크로: 매크로를 사용하여 코드를 개선하는 방법

Docker로 Go 앱 컨테이너화 시작하기

Docker의 설치 및 구성이 완료되면 Go 애플리케이션용 Docker 이미지를 생성하고 구성하기 위해 Docker파일이 필요합니다.도커파일 내에서 기본 이미지뿐만 아니라 파일 전송, 작업 디렉토리 추가 및 애플리케이션 실행에 대한 지침을 지정해야 합니다.

권한이 있는 개인으로부터 지시를 받으면 터미널을 사용하여 지정된 작업 영역 내에서 다음 작업을 친절하게 실행하십시오: ‘“bash echo ‘FROM ubuntu:20.04’ > /home/pavithra/docker-compose.yml

 touch Dockerfile

Docker 이미지를 구성하는 프로세스는 원하는 이미지를 구성하기 위해 수행해야 할 단계를 지정하는 Docker파일 내에 지정된 지침에 따라 관리됩니다.

.dockerignore 파일을 사용하면 특정 파일 또는 디렉터리를 Docker 이미지에서 분리할 수 있으며, .gitignore 파일과 유사한 방식으로 작동합니다.

 touch .dockerignore

Docker 컨테이너 내에 애플리케이션을 캡슐화하려면 해당 컨테이너의 구성에 관한 지침을 Docker파일에 포함시켜야 합니다.

도커파일에서 명령어 정의

도커파일은 애플리케이션을 구축할 기반을 구성하는 데 필요한 단계를 지정하여 특정 프로젝트의 고유한 요구 사항에 맞게 조정할 수 있습니다. 여기에는 일반적으로 추가 개발의 시작점 역할을 하는 기본 이미지를 조립할 명령을 지정하는 것이 포함됩니다.

다음은 웹 서버를 구성하는 데 사용되는 Docker파일에서 발췌한 것으로, 이러한 컨테이너화된 애플리케이션을 빌드하는 방법을 예시합니다: “`bash FROM node:14-alpine as build WORKDIR /app COPY package*.json ./ RUN npm install –only=production COPY . RUN npm 실행 빌드 EXPOSE 3000 CMD [“npm”, “start”] “` 이 도커파일은 기본 이미지(`node:14-alpine`)를 지정하는 것으로 시작하고 작업 디렉터리를 `/app`으로 설정합니다. 그런 다음 `COPY` 명령은 프론트엔드 및 백엔드 애플리케이션의 `package.json` 파일을 작업 디렉터리에 복사한 다음 `npm install` 명령을 실행합니다.

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

최신 버전의 Golang 기본 이미지를 사용하여 Docker파일은 애플리케이션의 작업 공간을 ‘/app’에 설정하고 이후 프로그램을 구성할 수 있도록 합니다.

이 글도 확인해 보세요:  내부에서 REST API 호출을 수행하는 방법 VS 코드

도커파일은 애플리케이션을 배포하는 데 필요한 모든 지침이 포함된 실행 패키지를 만드는 데 사용됩니다. 이 파일은 먼저 COPY 명령을 사용하여 필요한 파일을 복사한 다음 RUN 명령을 통해 필요한 종속성을 다운로드하여 이 작업을 수행합니다.

앞서 언급한 텍스트는 지정된 컨테이너 내에서 작업 실행을 지시하기 위해 “RUN”과 “CMD”라는 두 가지 명령을 활용하는 방법을 설명합니다.첫 번째 명령인 “RUN”은 아키텍처 구성 구성을 시작하고, 두 번째 명령인 “CMD”는 컨테이너의 운영 주기가 시작될 때 자동으로 실행될 특정 기능을 지정합니다.

 docker build -t GolangTutorial .

앞서 설명한 명령은 “golangtutorial”이라는 레이블을 가진 Docker 이미지를 생성합니다. 컨테이너를 실행하려면 다음 명령을 사용할 수 있습니다:

 docker run -p 8080:8080 golangtutorial

호스트의 로컬 포트 8080과 컨테이너의 포트 8080 사이에 매핑이 설정되어 호스트 시스템에서 Docker 컨테이너 내에서 실행 중인 서버와의 통신을 시작할 수 있습니다.

현재 Docker를 통해 작동 중인 서버로 전송된 CURL 요청의 결과를 얻었습니다.

컨테이너 오케스트레이션을 위해 Docker Compose를 사용할 수 있습니다

Docker Compose는 여러 Docker 컨테이너를 조율할 수 있는 도구입니다. 사용자는 단일 YAML 문서를 활용하여 다양한 컨테이너로 구성된 복잡한 애플리케이션을 묘사할 수 있으며, 단일 오더를 통해 손쉽게 실행 및 감독할 수 있습니다.

Docker Compose는 자동화를 통해 배포 프로세스를 간소화하고 배포의 일관성을 보장하기 때문에 복잡한 컨테이너화된 애플리케이션을 배포하고 관리하는 데 유용한 도구입니다.

By 김민수

안드로이드, 서버 개발을 시작으로 여러 분야를 넘나들고 있는 풀스택(Full-stack) 개발자입니다. 오픈소스 기술과 혁신에 큰 관심을 가지고 있고, 보다 많은 사람이 기술을 통해 꿈꾸던 일을 실현하도록 돕기를 희망하고 있습니다.