Docker 를 사용한 Golang 애플리케이션 구축 가이드

DockerBeginner
지금 연습하기

소개

Docker 는 개발자들이 애플리케이션을 구축, 배포 및 관리하는 방식을 혁신했습니다. 이 튜토리얼에서는 Docker 를 활용하여 Golang 애플리케이션을 개발하고 배포하는 방법을 배웁니다. 이 가이드를 마치면 Docker 와 Golang 개발 프로세스를 향상시키는 방법에 대한 확실한 이해를 얻게 될 것입니다.

Docker 이해

Docker 는 개발자가 컨테이너 환경에서 애플리케이션을 구축, 배포 및 실행할 수 있도록 지원하는 인기 있는 오픈소스 플랫폼입니다. 애플리케이션과 그 종속성을 컨테이너라는 표준화된 단위에 패키징하여 다양한 컴퓨팅 환경에서 쉽게 배포 및 확장할 수 있도록 합니다.

Docker 란 무엇인가요?

Docker 는 컨테이너에서 애플리케이션을 구축, 배포 및 실행할 수 있도록 하는 소프트웨어 플랫폼입니다. 컨테이너는 애플리케이션 실행에 필요한 모든 것을 포함하는 경량, 독립형, 실행 가능한 소프트웨어 패키지입니다. 코드, 런타임, 시스템 도구 및 라이브러리를 포함합니다. 이를 통해 개발자의 랩톱에서부터 프로덕션 서버까지 다양한 컴퓨팅 환경에서 애플리케이션이 일관되고 안정적으로 실행되도록 보장합니다.

Docker 아키텍처

Docker 는 Docker 클라이언트가 Docker 데몬과 통신하는 클라이언트 - 서버 아키텍처를 따릅니다. Docker 데몬은 Docker 컨테이너를 구축, 실행 및 배포하는 역할을 합니다. Docker 데몬은 호스트 머신에서 실행되며, 클라이언트는 동일한 머신 또는 원격 머신에서 실행될 수 있습니다.

graph LD
    subgraph Docker Architecture
        client[Docker Client]
        daemon[Docker Daemon]
        registry[Docker Registry]
        client -- communicates with --> daemon
        daemon -- pulls images from --> registry
        daemon -- runs containers -->  container[Docker Container]
    end

Docker 컨테이너

Docker 컨테이너는 Docker 플랫폼의 기본 구성 요소입니다. 컨테이너는 애플리케이션 실행에 필요한 모든 것을 포함하는 경량, 독립형, 실행 가능한 소프트웨어 패키지입니다. 코드, 런타임, 시스템 도구 및 라이브러리를 포함합니다. 컨테이너는 서로 그리고 호스트 운영 체제와 분리되어 있어 다양한 컴퓨팅 환경에서 애플리케이션이 일관되고 안정적으로 실행되도록 보장합니다.

Docker 이미지

Docker 이미지는 Docker 컨테이너를 생성하기 위한 청사진입니다. 이미지는 Docker 컨테이너를 생성하기 위한 일련의 지침을 포함하는 읽기 전용 템플릿입니다. 이미지는 Dockerfile 을 사용하여 구축됩니다. Dockerfile 은 이미지를 생성하기 위한 일련의 지침을 포함하는 텍스트 파일입니다.

Docker 레지스트리

Docker 레지스트리는 Docker 이미지를 저장하고 배포하는 서비스입니다. Docker 레지스트리는 Docker Hub 와 같은 공용 레지스트리이거나 조직 내부에 호스팅되는 개인 레지스트리일 수 있습니다.

Docker 사용의 이점

  • 일관된 배포: Docker 컨테이너는 기본 인프라에 관계없이 모든 머신에서 애플리케이션이 동일한 방식으로 실행되도록 보장합니다.
  • 확장성: Docker 는 필요에 따라 컨테이너를 추가하거나 제거하여 애플리케이션을 쉽게 확장할 수 있도록 합니다.
  • 효율성: Docker 컨테이너는 기존 가상 머신보다 경량이며 더 적은 리소스를 사용하므로 실행 효율이 높습니다.
  • 이식성: Docker 컨테이너는 개발, 테스트 및 프로덕션을 포함한 다양한 컴퓨팅 환경 간에 쉽게 이동할 수 있습니다.
  • 격리: Docker 컨테이너는 서로 그리고 호스트 운영 체제와 격리되어 있어 애플리케이션의 보안 및 안정성을 확보하는 데 도움이 됩니다.

Docker 의 기본 개념과 아키텍처를 이해함으로써 Docker 를 사용하여 Golang 애플리케이션을 구축하고 배포할 수 있습니다.

Docker 를 사용한 Golang 앱 개발

Golang 애플리케이션 생성

먼저 간단한 Golang 애플리케이션을 생성해 보겠습니다. 프로젝트 디렉터리를 새로 만들고 터미널에서 해당 디렉터리로 이동합니다. 그런 다음 main.go라는 새 파일을 만들고 다음 코드를 추가합니다.

package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello, LabEx!")
    })

    fmt.Println("Starting server on port 8080...")
    http.ListenAndServe(":8080", nil)
}

이 코드는 8080 번 포트에서 대기하는 간단한 웹 서버를 생성합니다. 루트 URL(/) 에 접근하면 "Hello, LabEx!"라는 메시지로 응답합니다.

Golang 애플리케이션의 Docker 화

Docker 를 사용하여 이 Golang 애플리케이션을 실행하려면 Dockerfile 을 생성해야 합니다. Dockerfile 은 Docker 이미지를 빌드하기 위한 일련의 지침을 포함하는 텍스트 파일입니다.

main.go 파일과 같은 디렉터리에 Dockerfile이라는 새 파일을 만들고 다음 내용을 추가합니다.

## 공식 Golang 이미지를 기본 이미지로 사용
FROM golang:1.16

## 작업 디렉터리를 /app으로 설정
WORKDIR /app

## Go 코드를 컨테이너로 복사
COPY . .

## Go 애플리케이션 빌드
RUN go build -o main .

## 웹 서버를 위해 8080 포트 노출
EXPOSE 8080

## 컨테이너 시작 시 Go 애플리케이션 실행
CMD ["./main"]

이 Dockerfile 은 다음과 같이 작동합니다.

  1. 공식 Golang 이미지를 기본 이미지로 사용합니다.
  2. 작업 디렉터리를 /app으로 설정합니다.
  3. Go 코드를 컨테이너로 복사합니다.
  4. Go 애플리케이션을 빌드하고 실행 파일 이름을 main으로 지정합니다.
  5. 웹 서버를 위해 8080 포트를 노출합니다.
  6. 컨테이너 시작 시 Go 애플리케이션을 실행합니다.

Docker 이미지 빌드

이제 Golang 애플리케이션의 Docker 이미지를 빌드해 보겠습니다. 터미널에서 다음 명령어를 실행합니다.

docker build -t labex/golang-app .

이 명령어는 현재 디렉터리의 Dockerfile 을 사용하여 태그가 labex/golang-app인 Docker 이미지를 빌드합니다.

Docker 컨테이너 실행

이미지 빌드가 완료되면 다음 명령어를 사용하여 Docker 컨테이너에서 Golang 애플리케이션을 실행할 수 있습니다.

docker run -p 8080:8080 labex/golang-app

이 명령어는 labex/golang-app 컨테이너를 실행하고 호스트의 8080 포트를 컨테이너의 8080 포트로 매핑합니다.

이제 웹 브라우저를 열고 http://localhost:8080으로 이동하여 "Hello, LabEx!" 메시지를 확인할 수 있습니다.

이 단계를 따르면 Docker 를 사용하여 Golang 애플리케이션을 성공적으로 개발하고 배포했습니다. 다음 섹션에서는 이 Docker 기반 Golang 애플리케이션을 배포하는 방법을 살펴보겠습니다.

Docker 기반 Golang 애플리케이션 배포

클라우드 플랫폼 배포

Golang 애플리케이션을 Docker 이미지로 패키징한 후에는 LabEx Cloud, Amazon Web Services(AWS), Google Cloud Platform(GCP) 또는 Microsoft Azure 와 같은 클라우드 플랫폼에 배포할 수 있습니다. 이러한 클라우드 플랫폼은 관리형 서비스를 제공하여 Docker 기반 애플리케이션을 쉽게 배포하고 확장할 수 있도록 지원합니다.

다음은 Golang 애플리케이션을 LabEx Cloud 에 배포하는 방법의 예시입니다.

  1. LabEx Cloud 계정 생성: 아직 LabEx Cloud 계정이 없다면 labex.io에서 계정을 생성합니다.
  2. LabEx Cloud 프로젝트 생성: 로그인 후 Golang 애플리케이션을 호스팅할 새 프로젝트를 생성합니다.
  3. Docker 이미지를 LabEx Cloud 레지스트리에 푸시: LabEx Cloud CLI 또는 웹 콘솔을 사용하여 labex/golang-app Docker 이미지를 LabEx Cloud 레지스트리에 푸시합니다.
  4. Docker 기반 Golang 애플리케이션 배포: LabEx Cloud 콘솔에서 새 배포를 생성하고 LabEx Cloud 레지스트리에서 labex/golang-app 이미지를 선택합니다. 복제 수, 환경 변수 및 네트워킹 옵션과 같은 배포 설정을 구성합니다.
  5. 배포된 애플리케이션 접근: 배포가 완료되면 LabEx Cloud 에서 Golang 애플리케이션에 접근할 수 있는 URL 또는 IP 주소를 제공합니다.

애플리케이션 확장

Golang 애플리케이션에 Docker 를 사용하면 수요에 따라 애플리케이션을 쉽게 확장하거나 축소할 수 있습니다. 이는 배포의 복제 수를 조정하거나 클라우드 플랫폼에서 제공하는 자동 확장 기능을 사용하여 수행할 수 있습니다.

예를 들어, LabEx Cloud 에서는 CPU 사용률 또는 기타 메트릭을 기준으로 자동으로 복제를 추가하거나 제거하는 자동 확장 규칙을 구성할 수 있습니다. 이를 통해 애플리케이션이 수동 개입 없이 증가하는 트래픽을 처리할 수 있도록 합니다.

모니터링 및 로깅

Docker 기반 Golang 애플리케이션의 상태와 성능을 보장하려면 모니터링 및 로깅을 설정하는 것이 중요합니다. LabEx Cloud 는 CPU 및 메모리 사용량, 네트워크 트래픽 및 애플리케이션 로그와 같은 주요 메트릭을 추적할 수 있도록 내장된 모니터링 및 로깅 기능을 제공합니다.

또한 Golang 애플리케이션을 Prometheus, Grafana 및 Elasticsearch 와 같은 타사 모니터링 및 로깅 서비스와 통합하여 애플리케이션의 성능과 동작에 대한 더 자세한 통찰력을 얻을 수 있습니다.

지속적 통합 및 배포

Golang 애플리케이션의 개발 및 배포를 간소화하려면 지속적 통합 (CI) 및 지속적 배포 (CD) 파이프라인을 설정할 수 있습니다. 이는 코드베이스에 변경 사항이 발생할 때마다 Docker 기반 Golang 애플리케이션을 자동으로 빌드, 테스트 및 배포하는 것을 포함합니다.

LabEx Cloud 는 GitHub Actions, GitLab CI/CD 또는 Jenkins 와 같은 인기 있는 도구와 Golang 애플리케이션을 쉽게 통합할 수 있도록 CI/CD 파이프라인에 대한 기본 지원을 제공합니다.

이러한 단계를 따르면 Docker 기반 Golang 애플리케이션을 클라우드 플랫폼에 성공적으로 배포하고 필요에 따라 확장하며 모니터링, 로깅 및 CI/CD를 설정하여 애플리케이션의 안정성과 확장성을 보장할 수 있습니다.

요약

이 자세한 튜토리얼에서는 Docker 를 사용하여 Golang 애플리케이션을 구축하는 방법을 배웠습니다. 컨테이너화의 이점을 탐색하고 Golang 앱을 개발하며 Docker 를 사용하여 배포했습니다. Docker 를 활용함으로써 개발 워크플로우를 간소화하고 일관된 환경을 보장하며 배포 프로세스를 단순화할 수 있습니다. 이 지식은 더 효율적으로 강력한 Golang 애플리케이션을 구축하고 배포하는 데 도움이 될 것입니다.