docker init 명령어를 사용하여 Go 애플리케이션 컨테이너화 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker init 명령을 사용하여 Go 애플리케이션을 컨테이너화하는 방법을 배우게 됩니다. 랩은 LabEx VM 에 Docker Desktop 이 올바르게 설치되었는지 확인하는 것으로 시작합니다. 여기에는 Docker 버전 확인과 hello-world 컨테이너 실행을 통해 Docker 가 예상대로 작동하는지 확인하는 작업이 포함됩니다.

이후 단계에서는 docker init으로 Go 프로젝트를 초기화하고, 생성된 Dockerfile 및 Compose 파일을 Go 애플리케이션에 맞게 사용자 정의하며, 마지막으로 Docker Compose 를 사용하여 Go 애플리케이션을 빌드하고 실행합니다. 이 실습을 통해 최신 Docker 도구를 사용하여 Go 애플리케이션을 효과적으로 컨테이너화하는 기술을 습득할 수 있습니다.

Docker Desktop 설치 및 Docker Init 확인

이 단계에서는 LabEx VM 에 Docker 가 올바르게 설치되었는지 확인합니다. LabEx VM 에는 Docker Engine 이 사전 설치되어 있으므로 Docker 버전을 확인하고 간단한 "hello-world" 컨테이너를 실행하여 모든 것이 예상대로 작동하는지 확인합니다.

먼저 Docker 버전을 확인해 보겠습니다. LabEx VM 에서 터미널을 엽니다. 데스크톱 또는 애플리케이션 메뉴에서 터미널 아이콘을 찾을 수 있습니다.

터미널에서 다음 명령을 실행합니다.

docker --version

이 명령은 시스템에 설치된 Docker 버전을 표시합니다. 다음과 유사한 출력을 볼 수 있습니다.

Docker version 20.10.21, build xxxxxxx

Docker 버전이 표시되면 Docker 가 올바르게 설치된 것입니다. 오류가 발생하면 지원팀에 문의하십시오.

다음으로 "hello-world" 컨테이너를 실행해 보겠습니다. 이 컨테이너는 콘솔에 메시지를 출력한 다음 종료되는 간단한 컨테이너입니다.

터미널에서 다음 명령을 실행합니다.

docker run hello-world

명령을 실행하기 전에 Docker Hub 에서 hello-world 이미지를 가져와야 합니다. Docker Hub 는 Docker 이미지의 공개 레지스트리입니다.

다음 명령을 실행하여 이미지를 가져옵니다.

docker pull hello-world

이 명령은 Docker Hub 에서 hello-world 이미지를 로컬 머신으로 다운로드합니다. 다음과 유사한 출력을 볼 수 있습니다.

Using default tag: latest
latest: Pulling from library/hello-world
...
Digest: sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest

이제 docker run hello-world 명령을 다시 실행합니다.

docker run hello-world

이 명령은 hello-world 컨테이너를 실행합니다. 다음과 유사한 출력을 볼 수 있습니다.

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

이 메시지는 Docker 가 올바르게 작동하고 첫 번째 컨테이너를 성공적으로 실행했음을 나타냅니다!

Docker Init 으로 Go 프로젝트 초기화

이 단계에서는 새로운 Go 프로젝트를 초기화하고 docker init을 사용하여 필요한 Dockerfile 및 docker-compose.yml 파일을 생성합니다. 이를 통해 Go 애플리케이션을 컨테이너화하기 위한 시작점을 제공합니다.

먼저 Go 프로젝트를 위한 새 디렉토리를 생성해 보겠습니다. LabEx VM 에서 터미널을 열고 다음 명령을 실행합니다.

mkdir my-go-app
cd my-go-app

이 명령은 ~/project 디렉토리에 my-go-app이라는 새 디렉토리를 생성한 다음 현재 디렉토리를 my-go-app으로 변경합니다.

다음으로 Go 모듈을 초기화해야 합니다. 이렇게 하면 프로젝트의 종속성을 추적하는 go.mod 파일이 생성됩니다.

터미널에서 다음 명령을 실행합니다.

go mod init my-go-app

이 명령은 my-go-app이라는 새 Go 모듈을 초기화합니다. 다음과 유사한 출력을 볼 수 있습니다.

go: creating new go.mod: module my-go-app
go: to add module requirements and sums:
        go mod tidy

이제 간단한 Go 애플리케이션을 만들어 보겠습니다. nano 편집기를 사용하여 my-go-app 디렉토리에 main.go라는 새 파일을 만듭니다.

nano main.go

main.go 파일에 다음 코드를 추가합니다.

package main

import "fmt"

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

이것은 "Hello, Docker!"를 콘솔에 출력하는 간단한 Go 프로그램입니다.

Ctrl+X, Y, Enter를 눌러 파일을 저장하고 nano 편집기를 종료합니다.

이제 docker init을 사용하여 Dockerfile 및 docker-compose.yml 파일을 생성합니다. 그러나 LabEx VM 에는 기본적으로 Docker Compose 가 설치되어 있지 않습니다. 먼저 설치해야 합니다.

curl을 사용하여 최신 버전의 Docker Compose 를 다운로드합니다.

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Docker Compose 바이너리를 실행 가능하게 만듭니다.

sudo chmod +x /usr/local/bin/docker-compose

Docker Compose 버전을 확인하여 설치를 확인합니다.

docker-compose --version

다음과 유사한 출력을 볼 수 있습니다.

docker-compose version 1.29.2, build xxxxxxx

이제 Docker Compose 가 설치되었으므로 docker init을 진행할 수 있습니다.

터미널에서 다음 명령을 실행합니다.

docker init

docker init은 Dockerfile 및 docker-compose.yml 파일을 구성하기 위해 일련의 질문을 합니다. 이 랩에 권장되는 답변은 다음과 같습니다.

  • What do you want to call this application? (이 애플리케이션의 이름을 무엇으로 하시겠습니까?) my-go-app
  • What port is this app listening on? (이 앱은 어떤 포트에서 수신 대기합니까?) 3000 (이것은 자리 표시자이며, 이 간단한 예제에서는 실제로 포트를 사용하지 않습니다.)
  • What is the main file to execute? (실행할 주요 파일은 무엇입니까?) main.go
  • Would you like to include the Docker Compose configuration? (Docker Compose 구성을 포함하시겠습니까?) Yes
  • Please choose a Docker Compose version: (Docker Compose 버전을 선택하십시오:) 2.0

이 질문에 답한 후 docker initmy-go-app 디렉토리에 Dockerfiledocker-compose.yml 파일을 생성합니다.

cat 명령을 사용하여 생성된 파일의 내용을 볼 수 있습니다.

cat Dockerfile
cat docker-compose.yml

이 파일은 Docker 컨테이너에서 Go 애플리케이션을 빌드하고 실행하기 위한 기본 구성을 제공합니다. 다음 단계에서는 이러한 파일을 필요에 맞게 사용자 정의합니다.

Go 를 위한 생성된 Dockerfile 및 Compose 파일 사용자 정의

이 단계에서는 이전 단계에서 생성된 Dockerfiledocker-compose.yml 파일을 사용자 정의합니다. Go 애플리케이션을 빌드하기 위해 Dockerfile을 최적화하고 애플리케이션을 실행하도록 docker-compose.yml 파일을 구성합니다.

먼저 생성된 Dockerfile을 살펴보겠습니다. nano 편집기를 사용하여 my-go-app 디렉토리에서 Dockerfile을 엽니다.

nano Dockerfile

생성된 Dockerfile은 다음과 유사할 수 있습니다.

## syntax=docker/dockerfile:1

FROM golang:latest AS builder

WORKDIR /app

COPY go.mod go.sum ./
RUN go mod download && go mod verify

COPY . .

RUN go build -o my-go-app

FROM alpine:latest

WORKDIR /app

COPY --from=builder /app/my-go-app .

EXPOSE 3000

CMD ["./my-go-app"]

Dockerfile은 다단계 빌드를 사용합니다. 첫 번째 단계 (builder) 는 golang:latest 이미지를 사용하여 Go 애플리케이션을 빌드합니다. 두 번째 단계는 alpine:latest 이미지를 사용하여 애플리케이션을 실행합니다.

Dockerfile을 수정하여 특정 Go 버전을 사용하고 빌드 프로세스를 최적화해 보겠습니다. Dockerfile의 내용을 다음으로 바꿉니다.

## syntax=docker/dockerfile:1

FROM golang:1.17 AS builder

WORKDIR /app

COPY go.mod go.sum ./
RUN go mod download && go mod verify

COPY . .

RUN go build -o my-go-app

FROM alpine:latest

WORKDIR /app

COPY --from=builder /app/my-go-app .

CMD ["./my-go-app"]

빌더 단계의 기본 이미지를 golang:1.17로 변경했습니다. 이렇게 하면 애플리케이션을 빌드하기 위해 특정 Go 버전을 사용하게 됩니다.

파일을 저장하고 nano 편집기를 종료합니다.

이제 생성된 docker-compose.yml 파일을 살펴보겠습니다. nano 편집기를 사용하여 my-go-app 디렉토리에서 docker-compose.yml 파일을 엽니다.

nano docker-compose.yml

생성된 docker-compose.yml 파일은 다음과 유사할 수 있습니다.

version: "3.9"
services:
  my-go-app:
    build: .
    ports:
      - "3000:3000"

docker-compose.yml 파일은 my-go-app이라는 단일 서비스를 정의합니다. 서비스가 현재 디렉토리 (.) 에서 빌드되어야 하고 포트 3000 이 노출되어야 함을 지정합니다.

애플리케이션이 실제로 포트에서 수신 대기하지 않으므로 ports 섹션을 제거할 수 있습니다. docker-compose.yml 파일을 다음으로 수정합니다.

version: "3.9"
services:
  my-go-app:
    build: .

파일을 저장하고 nano 편집기를 종료합니다.

이 단계에서는 Dockerfiledocker-compose.yml 파일을 사용자 정의하여 요구 사항에 더 잘 맞도록 했습니다. 다음 단계에서는 Docker Compose 를 사용하여 Go 애플리케이션을 빌드하고 실행합니다.

Docker Compose 로 Go 애플리케이션 빌드 및 실행

이 단계에서는 Docker Compose 를 사용하여 Go 애플리케이션을 빌드하고 실행합니다. Docker Compose 는 다중 컨테이너 애플리케이션을 빌드하고 실행하는 프로세스를 단순화합니다. 이 경우 컨테이너가 하나뿐이지만 Docker Compose 는 빌드 및 실행 프로세스를 관리하는 편리한 방법을 제공합니다.

먼저 터미널에서 my-go-app 디렉토리로 이동합니다.

cd ~/project/my-go-app

애플리케이션의 Docker 이미지를 빌드하려면 다음 명령을 실행합니다.

docker-compose build

이 명령은 현재 디렉토리의 Dockerfile을 기반으로 Docker 이미지를 빌드합니다. 다음과 유사한 출력을 볼 수 있습니다.

Building my-go-app
Sending build context to Docker daemon  3.072kB
Step 1/6 : FROM golang:1.17 AS builder
 ---> xxxxxxxxxxxxxxxx
Step 2/6 : WORKDIR /app
 ---> Using cache
 ---> xxxxxxxxxxxxxxxx
Step 3/6 : COPY go.mod go.sum ./
 ---> Using cache
 ---> xxxxxxxxxxxxxxxx
Step 4/6 : RUN go mod download && go mod verify
 ---> Using cache
 ---> xxxxxxxxxxxxxxxx
Step 5/6 : COPY . .
 ---> xxxxxxxxxxxxxxxx
Step 6/6 : RUN go build -o my-go-app
 ---> Running in xxxxxxxxxx
Removing intermediate container xxxxxxxxxx
 ---> xxxxxxxxxxxxxxxx
Successfully built xxxxxxxxxxxxxxxx
Successfully tagged my-go-app_my-go-app:latest

이 출력은 Docker 이미지가 성공적으로 빌드되었음을 나타냅니다.

이제 애플리케이션을 실행하려면 다음 명령을 실행합니다.

docker-compose up

이 명령은 docker-compose.yml 파일에 정의된 컨테이너를 시작합니다. 다음과 유사한 출력을 볼 수 있습니다.

Starting my-go-app_my-go-app_1 ... done
Attaching to my-go-app_my-go-app_1
my-go-app_1  | Hello, Docker!
my-go-app_my-go-app_1 exited with code 0

이 출력은 Go 애플리케이션이 실행되어 "Hello, Docker!"를 콘솔에 출력했음을 보여줍니다. 그런 다음 컨테이너는 코드 0 으로 종료되어 성공적인 실행을 나타냅니다.

컨테이너를 중지하려면 터미널에서 Ctrl+C를 누릅니다.

-d 플래그를 docker-compose up 명령에 추가하여 컨테이너를 분리 모드에서 실행할 수도 있습니다.

docker-compose up -d

이렇게 하면 컨테이너가 백그라운드에서 시작됩니다. 컨테이너의 로그를 보려면 다음 명령을 실행합니다.

docker logs my-go-app_my-go-app_1

분리 모드에서 실행 중인 컨테이너를 중지하려면 다음 명령을 실행합니다.

docker-compose down

이 명령은 컨테이너를 중지하고 제거합니다.

이 단계에서는 Docker Compose 를 사용하여 Go 애플리케이션을 성공적으로 빌드하고 실행했습니다. 이는 Docker Compose 가 컨테이너화된 애플리케이션을 관리하는 프로세스를 어떻게 단순화할 수 있는지 보여줍니다.

요약

이 Lab 에서는 LabEx VM 에 Docker Desktop 이 성공적으로 설치되었는지 확인하는 것으로 시작했습니다. 이는 docker --version 명령을 사용하여 Docker 버전을 확인하고 올바른 설치를 확인하는 것을 포함했습니다. 그런 다음 docker pull hello-world를 사용하여 Docker Hub 에서 hello-world 이미지를 가져오고, Docker 가 예상대로 작동하는지 확인하기 위해 docker run hello-world로 컨테이너를 실행하여 콘솔에 확인 메시지를 출력했습니다.

이 초기 단계는 작동하는 Docker 환경을 구축하여 Go 애플리케이션을 컨테이너화하기 위해 docker init을 사용하는 후속 단계를 위한 기반을 마련했습니다.