> 백엔드 개발 > Golang > 초보자를 위한 Docker 실습 Golang Dev

초보자를 위한 Docker 실습 Golang Dev

Susan Sarandon
풀어 주다: 2024-11-04 05:36:29
원래의
925명이 탐색했습니다.

목차

  1. 개요
  2. 전제조건
  3. 도커파일
  4. 도커 작성
    • 엔진엑스
    • MySQL
    • 이전
    • API
    • 커스텀
  5. 참고자료

개요

이 문서에서는 Docker가 내부적으로 어떻게 작동하는지 설명하지 않고, 대신 다른 프로젝트에 대한 Docker 구성을 작성할 수 있도록 Dockerfile 및 docker-compose.yml 파일에 작성된 각 코드의 목적을 설명합니다.

전제 조건

예를 들어 Dockerfile과 docker-compose가 포함된 프로젝트가 필요합니다. 여기서는 Ecom이라는 Golang 프로젝트를 예로 사용하겠습니다. Dockerfile을 사용하려면 README에 언급된 대로 로컬 데이터베이스를 설정해야 합니다.


도커파일

컨테이너 이미지를 생성하는 데 사용되는 Dockerfile.(6)

# Build application from source
FROM golang:1.23.0 AS build-stage
    WORKDIR /app

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

    COPY . .

    RUN CGO_ENABLED=0 GOOS=linux go build -o /api ./cmd/main.go
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
  • FROM golang:1.23.0 빌드 단계에서 이것은 앱용 이미지입니다. 이는 Go 엔진을 머신에 다운로드하는 것과 비슷하며, Docker에는 코드를 실행하기 위해 특정 이미지가 필요합니다.(1)(2)

  • WORKDIR /app 이는 코드가 /app에서 실행되기를 원하는 작업 디렉터리입니다.

  • go.mod go.sum ./ 복사 이 코드는 go.mod 및 go.sum 파일을 로컬 컴퓨터에서 Docker의 ./ 디렉터리로 복사합니다.

  • RUN go mod download 이것은 Docker에서 go mod 다운로드 명령을 실행합니다

  • 복사 . . 이 코드는 로컬 시스템의 모든 파일 및 폴더 프로젝트를 Docker로 복사합니다.

  • RUN CGO_ENABLED=0 GOOS=linux go build -o /api ./cmd/main.go 이 코드는 Linux OS의 Golang 앱을 Docker의 /api 폴더에 빌드하는 명령을 실행합니다.

# Deploy application binary into a lean image
FROM scratch AS build-realease-stage
    WORKDIR /

    COPY --from=build-stage /api /api

    EXPOSE 8080

    ENTRYPOINT [ "/api" ]
로그인 후 복사
로그인 후 복사
로그인 후 복사
  • FROM 스크래치 AS 빌드-릴리스-단계 스크래치는 애플리케이션에 필요한 것만 포함하는 최소한의 이미지를 만드는 데 사용됩니다.

  • WORKDIR / 루트 /를 작업 디렉토리로 사용하겠습니다.

  • COPY --from=build-stage /api /api 이렇게 하면 이미지 빌드 단계의 /api 디렉토리가 build-realease-stage 이미지의 /api로 복사됩니다.

  • EXPOSE 8080 이렇게 하면 포트 8080이 노출되므로 Docker 외부에서 포트 8080으로 API에 액세스할 수 있습니다.

  • ENTRYPOINT [ "/api" ] 이는 /api에 기본 실행 파일을 설정합니다

Dockerfile을 사용해 보세요.

sudo docker build .
로그인 후 복사
로그인 후 복사
로그인 후 복사

docker build를 통해 프로젝트를 이미지로 빌드할 수 있습니다. -t project-ecom 태그를 추가하면 빌드한 이미지를 더 쉽게 식별할 수 있습니다.(3)

Hands On Docker For Beginners Golang Dev

Sudo docker image ls 명령으로 이미지 목록을 확인할 수 있습니다

Hands On Docker For Beginners Golang Dev

# Build application from source
FROM golang:1.23.0 AS build-stage
    WORKDIR /app

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

    COPY . .

    RUN CGO_ENABLED=0 GOOS=linux go build -o /api ./cmd/main.go
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

그런 다음 Docker 이미지를 실행하세요
--rm 중지 시 컨테이너 제거
--docker 앱을 localhost 시스템에 연결하는 네트워크 호스트 (4),(5)
--env-file .env .env 파일을 통해 환경 값에 액세스
98bc0128576e 도커 이미지 ID

Hands On Docker For Beginners Golang Dev

축하합니다

이제 Postman 또는 기타 앱을 사용하여 API 사용을 테스트할 수 있습니다.

Hands On Docker For Beginners Golang Dev


도커 작성

Docker Compose는 여러 컨테이너 서비스를 만들어 Docker 내에서 실행하는 데 사용되었습니다. 이 프로젝트 docker-compose.yml에는 4가지 서비스에 대해 설명하겠습니다.

Nginx 프록시

# Build application from source
FROM golang:1.23.0 AS build-stage
    WORKDIR /app

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

    COPY . .

    RUN CGO_ENABLED=0 GOOS=linux go build -o /api ./cmd/main.go
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
  • nginx: 서비스 이름입니다
  • image: nginxproxy/nginx-proxy:1.6 이것은 Dockerfile의 FROM과 유사하게 우리가 사용할 이미지입니다.
  • 네트워크: 서비스가 사용할 Docker 내부의 네트워크입니다.
  • ports: 서비스가 를 사용할 포트를 설정합니다. : , 80은 HTTP의 기본 포트입니다
  • 볼륨: 이 서비스에 대한 데이터를 저장하는 영구 볼륨입니다. : :ro(읽기 전용).
  • Environment: 환경변수를 사용하는 것입니다.(8)

MySQL

# Deploy application binary into a lean image
FROM scratch AS build-realease-stage
    WORKDIR /

    COPY --from=build-stage /api /api

    EXPOSE 8080

    ENTRYPOINT [ "/api" ]
로그인 후 복사
로그인 후 복사
로그인 후 복사
  • db: 서비스 이름입니다
  • image: mysql:8.0 Image mysql 버전 8.0을 사용하는 이 서비스
  • 네트워크: 이 서비스는 new라는 이름의 사용자 지정 네트워크를 사용하고 별칭 이름 데이터베이스를 사용하는 새 네트워크를 사용합니다.
  • healthcheck: 테스트를 실행하여 서비스 작동을 확인하는 것입니다. test: mysqladmin ping -h Database -u ${DB_USER} --password=${DB_PASSWORD} 이 테스트는 mysql 데이터베이스에 대한 ping을 수행합니다.
  • 볼륨: 볼륨 내부에 영구 데이터를 저장합니다.
  • 포트: 이는 서비스가 사용할 포트입니다. 이 서비스에서는 포트 3306이 이미 로컬 시스템의 mysql에 사용되었기 때문에 3308을 로컬 시스템 포트로 사용합니다.
  • 환경: 환경 변수를 사용하기 위한 것입니다. 이 mysql 서비스에는 루트 비밀번호와 데이터베이스 이름이 필요합니다.(7)

마이그레이션

sudo docker build .
로그인 후 복사
로그인 후 복사
로그인 후 복사
  • migration-up: 서비스 이름입니다
  • 이미지: 이 서비스를 마이그레이션/마이그레이션하려면 이미지 마이그레이션을 사용하세요
  • 네트워크: DB 서비스와 동일한 새로운 네트워크를 사용하는 서비스입니다
  • 볼륨: 로컬 ./cmd/ migration/migrations의 마이그레이션 데이터가 서비스 디렉터리 /migrations에 복사되었습니다.
  • 명령: 이 서비스에서 ["-path", "/migrations", "-database", "${CONNECT_DB} 명령을 실행합니다.", "-verbose", "up"] 이 명령은 migration -path /migrations -database mysql://root:some-secret-password@tcp(database:3306)/ecom -verbose up과 유사합니다. (9)
  • 링크: 서비스를 다른 서비스에 연결하는 서비스, DB 서비스에 연결되는 마이그레이션 서비스
  • 종속_온: 특정 조건 이후에 이 서비스가 실행되도록 합니다. db: 조건: service_healthy 이는 db 서비스 테스트 결과 service_healthy를 얻었을 때 마이그레이션 서비스가 실행된다는 의미입니다.

API

# Build application from source
FROM golang:1.23.0 AS build-stage
    WORKDIR /app

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

    COPY . .

    RUN CGO_ENABLED=0 GOOS=linux go build -o /api ./cmd/main.go
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
  • api: 서비스 이름입니다
  • 네트워크: 이것은 이 서비스를 위한 네트워크입니다. 이 서비스는 새로운 네트워크를 사용하여 서비스 DB에 연결할 수 있고 서비스 nginx에서 사용하는 기본 네트워크에도 연결할 수 있습니다.
  • build : Dockerfile을 이용하여 서비스를 빌드하는 것입니다.
  • 재시작: 서비스가 실패할 때마다 이 서비스가 다시 시작됩니다.
  • 볼륨: 볼륨 /go/src/api에 저장된 영구 데이터입니다.
  • ports: 이 서비스를 위한 포트입니다.
  • 환경: 환경 이 서비스에 필요한 가치입니다.
  • 링크: 이 서비스는 mysql 데이터베이스를 소비해야 하기 때문에 db 서비스에 연결됩니다.
  • 의존_온: 이 서비스는 마이그레이션할 때, 이미 service_completed_successful일 때, db 테스트 결과가 service_healthy일 때, nginx service_started일 때 여러 조건에서 실행됩니다.

관습

# Deploy application binary into a lean image
FROM scratch AS build-realease-stage
    WORKDIR /

    COPY --from=build-stage /api /api

    EXPOSE 8080

    ENTRYPOINT [ "/api" ]
로그인 후 복사
로그인 후 복사
로그인 후 복사
  • 볼륨: db_data라는 사용자 지정 볼륨이 생성되었습니다.
  • 네트워크: new라는 이름의 사용자 정의 네트워크가 생성되었습니다.

Docker Compose를 사용해 보세요

sudo docker build .
로그인 후 복사
로그인 후 복사
로그인 후 복사

이 명령은 각 서비스에 대한 이미지를 생성하고 각 컨테이너를 실행합니다.

Hands On Docker For Beginners Golang Dev


sudo docker run --rm --network host --env-file .env 98bc0128576e
로그인 후 복사

우리가 생성한 docker-compose.yml 컨테이너를 확인할 수 있습니다.

Hands On Docker For Beginners Golang Dev


  nginx:
    image: nginxproxy/nginx-proxy:1.6
    networks:
      - default
    ports:
      - "80:80"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    environment:
      HTTPS_METHOD: nohttps
로그인 후 복사

docker-compose.yml이 생성한 볼륨을 확인할 수 있습니다.

Hands On Docker For Beginners Golang Dev


  db:
    image: mysql:8.0
    networks:
      new:
        aliases:
          - database
    healthcheck:
      test: mysqladmin ping -h database -u ${DB_USER} --password=${DB_PASSWORD}
    volumes:
      - db_data:/var/lib/mysql
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3308:3306"
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
      MYSQL_DATABASE: ${DB_NAME}
로그인 후 복사

docker-compose.yml이 생성한 이미지를 확인하실 수 있습니다.

Hands On Docker For Beginners Golang Dev


축하합니다

Postman 또는 기타 앱을 사용하여 README 문서를 기반으로 프로젝트에서 Consume API를 테스트할 수 있습니다.

완료한 경우 다음을 사용하여 컨테이너를 중지할 수 있습니다.

  migrate-up:
    image: migrate/migrate
    networks:
      - new
    volumes:
      - ./cmd/migrate/migrations:/migrations
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    command: ["-path", "/migrations", "-database", "${CONNECT_DB}", "-verbose", "up"]
    links:
      - db
    depends_on:
      db:
        condition: service_healthy
로그인 후 복사

Hands On Docker For Beginners Golang Dev

또는 docker compose 내의 모든 컨테이너 서비스를 삭제하려면 다음을 실행하세요.

# Build application from source
FROM golang:1.23.0 AS build-stage
    WORKDIR /app

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

    COPY . .

    RUN CGO_ENABLED=0 GOOS=linux go build -o /api ./cmd/main.go
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

Hands On Docker For Beginners Golang Dev


참고자료

(1)Dockerfile 참조
(2)Docker 기본 이미지
(3)도커 빌드
(4)Docker 네트워크 튜토리얼
(5)Docker 네트워크 드라이버
(6)Dockerfile 작성
(7)도커 허브 MySQL
(8)Nginx-프록시 문서
(9)고랭 마이그레이션

위 내용은 초보자를 위한 Docker 실습 Golang Dev의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿