Docker で構築

このガイドでは、シンプルな Go 言語のプロジェクトと Dockerfile を含むリソースから始めます。このガイドの開始時点から、Docker でアプリケーションを構築する方法を改善するための、様々な方法を紹介します。

環境のセットアップ

以下のガイドを終えてください。

  1. Docker Desktop か Docker Engine をインストールします。

  2. GitHub 上からサンプルアプリケーションを クローン(複製)するか、新しいリポジトリを作成します。

アプリケーション

このガイドのサンプルプロジェクトは、架空の言語に対して翻訳したメッセージを送信するための、クライアント・サーバ型アプリケーションです。

こちらはプロジェクト内に含まれるファイルの一覧です。

.
├── Dockerfile
├── cmd
│   ├── client
│   │   ├── main.go
│   │   ├── request.go
│   │   └── ui.go
│   └── server
│       ├── main.go
│       └── translate.go
├── go.mod
└── go.sum

cmd/ ディレクトリに含まれるコードは、クライアントとサーバの2つのアプリケーション要素です。クライアントは、メッセージの書き込み、送信、受信のためのユーザインターフェイスです。サーバはクライアントからのメッセージを受け取り、それらを翻訳し、クライアントに送り返します。

Dockerifle

Dockerfile はテキスト形式のドキュメントであり、この中にアプリケーションの構築手順を定義します。 Dockerfile には Dockerfile 構文(syntax) と呼ばれる ドメイン固有言語(domain-specific language) を書きます。

以下は、このガイドで使う現時点の Dockerfile です。

# syntax=docker/dockerfile:1
FROM golang:1.20-alpine
WORKDIR /src
COPY . .
RUN go mod download
RUN go build -o /bin/client ./cmd/client
RUN go build -o /bin/server ./cmd/server
ENTRYPOINT [ "/bin/server" ]

以下は、この Dockerfile が何かの説明です。

  1. # syntax=docker/dockerfile:1

    このコメント文は Dockerfile パーサ ディレクティブ です。これで使用する Dockerfile 構文のバージョンを指定します。このファイルはベストプラクティスである dockerfile:1 構文を使います。つまり、最新の Docker 構築機能を必ず利用するようにします。

  1. FROM golang:1.20-alpine

    FROM 命令は、 golang 公式イメージのバージョン 1.20-alpine を使います。

  1. WORKDIR /src

    コンテナ内に 作業ディレクトリ(working directory) /src を作成します。

  1. COPY . .

    構築コンテキスト(build context) 内のファイルを、コンテナ内の作業ディレクトリにコピーします。

  1. RUN go mod download

    必要な Go モジュールをコンテナにダウンロードします。Go モジュールとは Go プログラミング言語用の依存関係管理ツールであり、 JavaScript 用の npm install や Python 用の pip install と似ています。

  1. RUN go build -o /bin/client ./cmd/client

    /bin ディレクトリ内に client バイナリを構築し、これを翻訳されたメッセージの送信用に使います。

  1. RUN go build -o /bin/server ./cmd/server

    /bin ディレクトリ内に server バイナリを構築し、これをクライアントが翻訳したリクエストの受信に使います。

  1. ENTRYPOINT [ "/bin/server" ]

    コンテナを起動時に実行するコマンドを指定します。サーバのプロセスを起動します。

イメージの構築

Dockerfile を使ってイメージを構築するには、 docker コマンドラインツールを使います。イメージを構築するコマンドは docker build です。

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

$ docker build --tag=buildme .

この作成されたイメージには タグ(tag) buildme があります。イメージのタグがイメージ名にあたります。

コンテナの実行

今構築したイメージには2つのバイナリが入っています。1つはサーバで、もう1つはクライアントです。翻訳サービスが動作するの確認するには、サーバ部分をホスト(保持)するコンテナの起動と、次にクライアントを呼び出す別のコンテナを起動します。

コンテナを実行するには docker run コマンドを使います。

  1. コンテナをイメージから デタッチドモード(detached mode) で起動します。

    $ docker run --name=buildme --rm --detach buildme
    

    これは buildme という名前のコンテナを起動します。

  1. この buildme コンテナ内で、クライアントバイナリを呼び出すための新しいコマンドを実行します。

    $ docker exec -it buildme /bin/client
    

翻訳用のバックエンド(サーバ)プロセスにメッセージを送信できる場所として、ターミナルのユーザインターフェイスを docker exec コマンドで開きます。

$ docker stop buildme

まとめ

このセクションでは、本ガイドで使うサンプルアプリケーションの概要、Dockerfile と構築の導入を示しました。コンテナイメージを構築し、そのイメージからコンテナを作成するのに成功しました。

関連情報:

次のステップ

次のセクションでは、構築速度を改善するために、レイヤのキャッシュをどのようにして使うかを探ります。