ホームページ >バックエンド開発 >Golang >初心者のための Docker ハンズオン Golang 開発

初心者のための Docker ハンズオン Golang 開発

Susan Sarandon
Susan Sarandonオリジナル
2024-11-04 05:36:29922ブラウズ

目次

  1. 概要
  2. 前提条件
  3. Dockerfile
  4. Docker Compose
    • Nginx
    • Mysql
    • 移行
    • API
    • カスタム
  5. 参考文献

概要

この記事では、Docker がフード上でどのように機能するかについては説明しません。代わりに、この記事では、他のプロジェクトの Docker 構成を作成できるように、Dockerfile と docker-compose.yml ファイルに記述された各コードの目的を説明します。

前提条件

Dockerfile と docker-compose を含むプロジェクトが必要です。ここでは例として Ecom という名前の Golang プロジェクトを使用します。 Dockerfile を使用するには、README に記載されているようにローカル データベースをセットアップする必要があります。


Dockerfile

コンテナー イメージの作成に使用される 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
  • ビルド段階の golang:1.23.0 から、これはアプリのイメージです。Go エンジンをマシンにダウンロードするのと似ていますが、Docker ではコードを実行するために特定のイメージが必要です。(1)(2)

  • WORKDIR /app これは、コードを /app で実行する作業ディレクトリです。

  • COPY go.mod go.sum ./ このコードは、go.mod と go.sum ファイルをローカル マシンから Docker 上の ./ ディレクトリにコピーします。

  • RUN go mod download これにより、Docker で go mod download コマンドが実行されます

  • コピー . 。このコードは、すべてのファイルとフォルダー プロジェクトをローカル マシンから 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" ]
  • ビルドリリース段階のスクラッチから、アプリケーションに必要なものだけを含む最小限のイメージを作成するために使用されます。

  • WORKDIR / 作業ディレクトリとして root / を使用します。

  • COPY --from=build-stage /api /api これにより、ディレクトリ /api がイメージ build-stage から 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 アプリをローカルホスト マシンに接続します (4)、(5)
--env-file .env : .env ファイル
を通じて環境値にアクセスします 98bc0128576e docker イメージ ID

Hands On Docker For Beginners Golang Dev

おめでとうございます

Postman または他のアプリで API を使用するテストができるようになりました。

Hands On Docker For Beginners Golang Dev


Docker Compose

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: これはサービス名です
  • イメージ: nginxproxy/nginx-proxy:1.6 これは、Dockerfile の FROM と同様に、使用するイメージです。
  • ネットワーク: これは、サービスが使用する Docker 内のネットワークです。
  • ポート: これは、サービスが使用するポートを設定します : 、80 は HTTP
  • のデフォルトのポートです
  • ボリューム: これは、このサービスのデータを保存する永続ボリュームです。 : :ro (読み取り専用)。
  • 環境: これは環境変数を使用します。(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 このサービスはイメージ mysql バージョン 8.0
  • を使用しています
  • ネットワーク: このサービスは new という名前のカスタム ネットワークを使用し、次にエイリアス名データベースを使用する新しいネットワークを使用します。
  • healthcheck: これは、テストを実行してサービスの動作をチェックします。テスト: mysqladmin ping -h database -u ${DB_USER} --password=${DB_PASSWORD} このテストでは、mysql データベースに ping を実行します。
  • ボリューム: これはボリューム内に永続データを保存します。
  • ポート: これはサービスが使用するポートです。ポート 3306 はローカルマシン上の mysql にすでに使用されているため、このサービスではローカルマシンのポートとして 3308 を使用します。
  • 環境: これは環境変数を使用するためのもので、この mysql サービスでは root パスワードとデータベース名が必要です。(7)

移行する

sudo docker build .
  • 移行-アップ: これはサービス名です
  • 画像: 移行/このサービスを移行するには、移行画像を使用します
  • ネットワーク: このサービスは、db サービスと同じ新しいネットワークを使用します
  • ボリューム: ローカル ./cmd/merge/migrations からの移行データがサービス ディレクトリ /migrations にコピーされました。
  • コマンド: このサービスでコマンドを実行します。 ["-path"、"/migrations"、"-database"、"${CONNECT_DB}", "-verbose", "up"] このコマンドは、merge -path /migrations -database mysql://root:some-secret-password@tcp(database:3306)/ecom -verbose up に似ています (9)
  • リンク: これはサービスを別のサービスにリンクします。この移行サービスは db サービスにリンクされます
  • depend_on: 特定の条件の後にこのサービスを実行するようにします。 db: 条件: service_healthy これは、db サービス テストの結果が service_health.
  • になったときに、移行サービスが実行されることを意味します。

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: これはサービス名です
  • ネットワーク: これはこのサービスのネットワークです。このサービスは新しいネットワークを使用しているため、サービス データベースに接続でき、サービス nginx によって使用されるネットワークのデフォルトにも接続できます。
  • build: これはサービスをビルドするためのもので、このサービスは Dockerfile を使用します。
  • 再起動: サービスに障害が発生するたびに、このサービスは再起動されます。
  • ボリューム: これは、ボリューム /go/src/api に保存されている永続データです。
  • ports: このサービスのポート。
  • 環境: このサービスに必要な環境値。
  • リンク: このサービスは、mysql データベースを使用する必要があるため、db サービスにリンクされています。
  • depend_on: このサービスはいくつかの条件で実行されます。移行時: すでにサービス完了_成功、DB テスト結果がサービス健全性のとき、および nginx サービス開始時

カスタム

# 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


おめでとうございます

README のドキュメントに基づいて、Postman または他のアプリを使用してプロジェクトの 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)Dockerビルド
(4)Dockerネットワークチュートリアル
(5)Dockerネットワークドライバー
(6)Dockerfileの作成
(7)Docker Hub Mysql
(8)Nginx プロキシ ドキュメント
(9)Golang 移行

以上が初心者のための Docker ハンズオン Golang 開発の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。