Go 앱 Docker화

9921 단어 devopsgodocker
Go는 빠르게 작업하고 싶은 언어 중 하나가 되었습니다. 그래서, 오늘 우리는 도커 이미지를 850mb에서 15mb로 줄이기 위해 빌더 패턴과 다단계 빌드를 활용하여 Go 앱을 도킹할 것입니다!

이 기사는 Dockerize 시리즈의 일부입니다. 우리가 사용할 몇 가지 개념을 어디에서 살펴볼 것인지 확인하십시오. 이 기사의 코드를 사용할 수 있습니다here.



영상도 준비했으니 따라해보시면 좋을 것 같아요

프로젝트 설정



Mux을 사용하여 간단한 API를 초기화했습니다.

├── main.go
├── go.mod
└── go.sum


여기 우리 main.go
package main

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

    "github.com/gorilla/mux"
)

func main() {
    router := mux.NewRouter()
    router.HandleFunc("/", func(rw http.ResponseWriter, r *http.Request) {
        response := map[string]string{
            "message": "Hello Docker!",
        }
        json.NewEncoder(rw).Encode(response)
    })

    log.Println("Server is running!")
    http.ListenAndServe(":4000", router)
}


개발용



우리는 개발 워크플로의 일부로 Reflex을 사용할 것입니다. 익숙하지 않은 경우 Refelx는 개발 시 실시간 다시 로드를 제공합니다.
Dockerfile를 추가하여 도커 설정을 계속합시다.

FROM golang:1.16.5 as development
# Add a work directory
WORKDIR /app
# Cache and install dependencies
COPY go.mod go.sum ./
RUN go mod download
# Copy app files
COPY . .
# Install Reflex for development
RUN go install github.com/cespare/reflex@latest
# Expose port
EXPOSE 4000
# Start app
CMD reflex -g '*.go' go run api.go --start-service

docker-compose.yml 를 만들어 봅시다. 여기에서는 개발하는 동안 변경 사항을 컨테이너와 동기화할 수 있도록 코드를 volume에 마운트합니다.

version: "3.8"

services:
  app:
    container_name: app-dev
    image: app-dev
    build:
      context: .
      target: development
    volumes:
      - .:/app
    ports:
      - 4000:4000



시작! 시작! 시작!

docker-compose up

-d 플래그를 사용하여 데몬 모드에서 실행할 수도 있습니다.

좋습니다. 개발 서버가 가동되었습니다!

app-dev  | Starting service...
app-dev  | 2021/07/04 12:50:06 Server is running!

docker images 명령을 사용하여 이미지를 확인합시다.

REPOSITORY          TAG                   IMAGE ID       CREATED         SIZE
app-dev             latest                3063740d56d8   7 minutes ago   872MB


안녕하세요 세계를 위해 850mb 이상! 이것은 개발용으로 괜찮을 수 있지만 프로덕션용으로 이미지 크기를 줄이는 방법을 살펴보겠습니다.

생산용


Dockerfilebuilder 단계를 추가하여 production를 업데이트합시다.

업데이트: CGO_ENABLED 0 명령 바로 앞에 수행하는 대신 ENV에서 Dockerfile를 사용하여 go build를 정의하는 방법에 주목하십시오. 또한 alpine를 사용하여 프로덕션 환경에서 컨테이너를 디버그하기가 정말 어렵기 때문에 scratch 대신 scratch를 사용할 것입니다.

FROM golang:1.16.5 as builder
# Define build env
ENV GOOS linux
ENV CGO_ENABLED 0
# Add a work directory
WORKDIR /app
# Cache and install dependencies
COPY go.mod go.sum ./
RUN go mod download
# Copy app files
COPY . .
# Build app
RUN go build -o app

FROM alpine:3.14 as production
# Add certificates
RUN apk add --no-cache ca-certificates
# Copy built binary from builder
COPY --from=builder app .
# Expose port
EXPOSE 4000
# Exec built binary
CMD ./app


프로덕션 이미지 빌드를 추가해 보겠습니다.

docker build -t app-prod . --target production


빌드된 프로덕션 이미지를 확인해 보겠습니다.

docker images


빌더 패턴을 사용하여 이미지 크기를 ~15mb로 줄였습니다!!

REPOSITORY                    TAG                   IMAGE ID       CREATED          SIZE
app-prod                      latest                ed84a3896251   50 seconds ago   14.7MB


포트80에서 생산 컨테이너를 시작하겠습니다.

docker run -p 80:4000 --name app-prod app-prod


워크플로를 더 쉽게 만들기 위해 Makefile 을 추가할 수도 있습니다.

dev:
  docker-compose up

build:
  docker build -t app-prod . --target production

start:
  docker run -p 80:4000 --name app-prod app-prod 


다음 단계



이를 통해 워크플로에서 docker를 활용하고 선택한 플랫폼에 프로덕션 이미지를 더 빠르게 배포할 수 있어야 합니다.

문제가 발생하면 언제든지 문의해 주세요.

좋은 웹페이지 즐겨찾기