docker init コマンドを使って Go アプリケーションをコンテナ化する方法

DockerDockerBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、docker init コマンドを使用して Go アプリケーションをコンテナ化する方法を学びます。実験では、まず LabEx VM 上に Docker Desktop が正しくインストールされていることを確認します。これには、Docker のバージョンを確認し、hello-world コンテナを実行して Docker が正常に機能していることを確認する作業が含まれます。

その後の手順では、docker init を使用して Go プロジェクトを初期化し、生成された Dockerfile と Compose ファイルを Go アプリケーションに合わせてカスタマイズします。最後に、Docker Compose を使用して Go アプリケーションをビルドして実行します。この実践的な経験を通じて、最新の Docker ツールを使用して Go アプリケーションを効果的にコンテナ化するスキルを身につけることができます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/logs("View Container Logs") docker/ContainerOperationsGroup -.-> docker/create("Create Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/SystemManagementGroup -.-> docker/version("Show Docker Version") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/run -.-> lab-555164{{"docker init コマンドを使って Go アプリケーションをコンテナ化する方法"}} docker/logs -.-> lab-555164{{"docker init コマンドを使って Go アプリケーションをコンテナ化する方法"}} docker/create -.-> lab-555164{{"docker init コマンドを使って Go アプリケーションをコンテナ化する方法"}} docker/pull -.-> lab-555164{{"docker init コマンドを使って Go アプリケーションをコンテナ化する方法"}} docker/version -.-> lab-555164{{"docker init コマンドを使って Go アプリケーションをコンテナ化する方法"}} docker/build -.-> lab-555164{{"docker init コマンドを使って Go アプリケーションをコンテナ化する方法"}} end

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

コマンドを実行する前に、hello-world イメージを Docker Hub から取得する必要があります。Docker Hub は、Docker イメージの公開レジストリです。

イメージを取得するには、以下のコマンドを実行します。

docker pull hello-world

このコマンドは、hello-world イメージを Docker Hub からローカルマシンにダウンロードします。以下のような出力が表示されるはずです。

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? Yes
  • Please choose a Docker Compose version: 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 アプリケーションをビルドします。2 番目のステージは 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 は、マルチコンテナアプリケーションのビルドと実行プロセスを簡素化します。今回の場合は 1 つのコンテナしかないですが、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 を押します。

docker-compose up コマンドに -d フラグを追加することで、コンテナをデタッチモードで実行することもできます。

docker-compose up -d

これにより、コンテナがバックグラウンドで起動します。コンテナのログを表示するには、以下のコマンドを実行します。

docker logs my-go-app_my-go-app_1

デタッチモードで実行されているコンテナを停止するには、以下のコマンドを実行します。

docker-compose down

このコマンドは、コンテナを停止して削除します。

このステップでは、Docker Compose を使って Go アプリケーションを正常にビルドして実行しました。これは、Docker Compose がコンテナ化されたアプリケーションの管理プロセスを簡素化できることを示しています。

まとめ

この実験では、まず LabEx の仮想マシン (VM) 上で Docker Desktop が正常にインストールされていることを確認しました。これには、docker --version コマンドを使用して Docker のバージョンを確認し、正しくインストールされていることを確認する作業が含まれていました。その後、docker pull hello-world を使用して Docker Hub から hello-world イメージを取得し、docker run hello-world でコンテナを実行して、Docker が期待通りに機能し、コンソールに確認メッセージが表示されることを確認しました。

この最初のステップでは、動作する Docker 環境を構築し、その後の docker init を使用して Go アプリケーションをコンテナ化するステップの基礎を築きました。