My RSS Reader

Description about Blog Author


Docker DesktopのDocker AI「Gordon」を使う

最近、いろいろなソフトウェアにAI機能が搭載されていますが、Docker Desktopにも実装されていたので触ってみることにしました。 私が触ったのはバージョン4.40.0のDocker Desktopで、このAI機能はベータ機能として利用可能になっています。利用するにはDockerのアカウントがあり、Docker Desktopにログインしている必要があるようです。

インストール直後は機能が有効化されていないので、Docker Desktopを起動したらDocker AIを有効化してください。 これだけで利用可能になります。

Docker AI (Gordon)のバックエンドはDocker社のサーバー上で実行されているようです。Docker Desktopがそのクライアントになる構成で動いていて、一部は外部のAIサーバーを利用して動くため、データのアップロードに関する規約に同意する必要があります。

Docker AIに自由文で質問する

Docker AI機能を有効化すると、次のような画面に切り替わります。5つの作業のショートカットのほか、一般的なAIと同様、プロンプトの入力欄が表示されています。ショートカットではDockerfileの最適化、Dockerfileの分析と評価、アプリケーションのDocker化の補助をやってくれます。

プロンプトを入力して、コンテナに関する質問をDocker AIに尋ねて回答してもらうこともできます。 残念だったのは、文字入力にCTK圏独自の文字入力に対する最適化がされていない点は残念でした。 ただ、テキストエディターなどで日本語の質問文で質問を書いてコピペしてみると、日本語で回答してくれました。

質問したこと:

DockerでLinuxコンテナでGo言語で作ったアプリケーションを実行したい。main.goだけがある前提で、この後何をすればいいか教えてください。

回答:

Go言語で作成したアプリケーションをDockerでLinuxコンテナとして実行するためには、以下の手順を実行します。

Dockerfileの作成: まず、main.goがあるディレクトリにDockerfileを作成します。このファイルには、Goアプリケーションをビルドして実行するための指示が含まれます。

# ベースイメージとして公式のGolangイメージを使用 FROM golang:1.20-alpine AS builder

# 作業ディレクトリを設定 WORKDIR /app

# アプリケーションのソースコードをコンテナにコピー COPY main.go .

# Goアプリケーションをビルド RUN go build -o myapp main.go

# 最終的な軽量イメージを作成 FROM alpine:3.17

# ビルドしたバイナリをコピー COPY --from=builder /app/myapp /usr/local/bin/myapp

# アプリケーションのポートを公開 EXPOSE 8080

# アプリケーションを実行 CMD [“myapp”]

Dockerイメージのビルド: ターミナルで、Dockerfileがあるディレクトリに移動し、以下のコマンドを実行してDockerイメージをビルドします。

docker build -t my-go-app .

コンテナの実行: ビルドしたイメージを使ってコンテナを実行します。以下のコマンドで、ホストのポート8080をコンテナのポート8080にマッピングします。

docker run -d -p 8080:8080 my-go-app

アプリケーションの確認: ブラウザでhttp://localhost:8080にアクセスして、アプリケーションが正しく動作しているか確認します。

これで、Go言語で作成したアプリケーションがDockerコンテナ内で実行されるようになります。もし、main.go以外に依存ファイルがある場合は、それらもCOPYコマンドでコンテナにコピーする必要があります。

詳細な情報は、Dockerの公式ドキュメント⁠を参照してください。

かなりパーフェクトな内容を教えてくれました。自由文でユーザー権限でアプリを実行する例を質問すれば、さらにもっといいアウトプットを期待できそうです。

Dockerfileを分析してもらう

DockerfileはDockerにとってはアプリケーションのコンテナ化に欠かせないものの一つです。 Dockerfileは自分で書くか、何かを参考に書いたかどこからか持ってきたものをそのまま使っているかのいずれかになると思います。

自分で書いたDockerfileを分析する人はいないと思いますが、どういう機能かご紹介するためにちょっと試してみましょう。 後述の機能を試すため、あえてダメな記法を使ったDockerfileを使って試してみます。

FROM docker.io/nginx:latest MAINTAINER Youehi Tooyama

ADD index.html /usr/share/nginx/html/

EXPOSE 80

この機能を使うにはファイルをアップロードする必要があります。初めてこの機能を使うときは次のようなメッセージが出ると思います。

リンクをクリックして同意するボタンを押してください。そうすると、ローカルのファイルを選択してDocker AIに各種分析させることができます。

Ask Gordonの最初の画面の上部にあるショートカットから、「Explain my Dockerfile」を実行します。 ファイルを選ぶと指定したDockerfileの分析が始まります。

回答としては、このようなメッセージが表示されました。 このプロンプトは分析をするだけなので、評価はされません。ただ、MAINTAINERは古い記述だからlabelsを使おうねみたいなことは回答してくれていますね。

Dockerfileの最適化を考えてもらう

「Optimize my Dockerfile」を実行すると、作成したDockerfileをどうしたら「最適化」できるか提案してくれます。 最後の質問「Can I write Dockerfile?」に「Yes」と答えると、推奨される内容が全て盛り込まれてDockerfileが作られます。

具体的にここをこうするといいとか教えてくれます。回答のサマリーだけあげると次のような感じでした。

  • Reduced image size and faster builds by using the alpine variant.
  • Improved consistency and predictability by pinning the Nginx version.
  • Modernized syntax with LABEL for maintainability and compatibility.
  • Simplified and more secure file copying with COPY instead of ADD.

Dockerfileを採点してもらう

「Rate my Dockerfile」を実行すると、作成したDockerfileを採点してくれます。また、どこがどう問題であるか、どうすればいいか提案してくれます。

例のDockerfileを採点してもらうと、次のような結果が出てきました。

結果は英語出てくるので、機械翻訳で訳したものを次にご紹介します。

ここで初めて具体的にどうすればいいか教えてくれていますね。前述の「Optimize my Dockerfile」を実行するとここらへんの改善も盛り込んだDockerfileを書いてくれるので、採点してもらったらDockerfileの最適化を行うといいと思います。

BuildKit キャッシュパフォーマンススコア: ⭐⭐⭐⭐⭐ (5)

The ADD instruction invalidates caching as it depends on the contents of index.html. Using COPY would be better for caching. The base image is cached, but no further optimizations are present.

ADD命令は、index.htmlの内容に依存するため、キャッシュを無効にします。キャッシュにはCOPYを使用する方が良いでしょう。ベース画像はキャッシュされていますが、それ以上の最適化は存在しません。

セキュリティースコア: ⭐⭐⭐ (3)

The image runs as root by default, which is a security risk. The nginx:latest tag is not pinned to a specific version, which can lead to unpredictable updates. No multi-stage builds or security hardening is applied.

イメージはデフォルトでルートとして実行されるため、セキュリティ上のリスクがあります。Nginx:latestタグは特定のバージョンに固定されていないため、予測不可能な更新につながる可能性があります。マルチステージビルドやセキュリティ強化は適用されません。

イメージサイズ効率スコア: ⭐⭐⭐⭐⭐⭐ (6)

The nginx:latest image is relatively lightweight, but it includes unnecessary components for this use case. A smaller, more specific base image (e.g., nginx:alpine) would improve efficiency.

Nginx:latestの画像は比較的軽量ですが、このユースケースには不要なコンポーネントが含まれています。より小さく、より具体的なベースイメージ(例:nginx:alpine)は効率を向上させるでしょう。

ベストプラクティスのコンプライアンススコア: ⭐⭐⭐⭐ (4)

The MAINTAINER instruction is deprecated and should be replaced with a LABEL. The ADD instruction is used unnecessarily instead of COPY. No comments or documentation are provided.

MAINTAINER 命令は非推奨であり、LABEL に置き換える必要があります。ADD 命令は COPY の代わりに不必要に使用されます。コメントやドキュメントは提供されていません。

保守性スコア: ⭐⭐⭐⭐⭐ (5)

The Dockerfile is simple and easy to understand, but it lacks comments and uses outdated practices, which could hinder future updates.

Dockerfileはシンプルで理解しやすいですが、コメントがなく、古い慣行を使用しているため、将来の更新を妨げる可能性があります。

再現性スコア: ⭐⭐⭐⭐ (4)

Using nginx:latest makes the build non-reproducible as the image can change over time. Pinning the base image to a specific version would improve consistency.

Nginx:latestを使用すると、画像が時間の経過とともに変化するため、ビルドは再現できなくなります。ベース画像を特定のバージョンに固定すると、一貫性が向上します。

移植性スコア: ⭐⭐⭐⭐⭐⭐⭐ (7)

The Dockerfile is portable across environments that support Docker, but it assumes the availability of index.html without specifying how it is generated or sourced.

Dockerfileは、Dockerをサポートする環境間で移植可能ですが、index.htmlの可用性を想定し、生成またはソースの方法を指定しません。

リソース効率スコア: ⭐⭐⭐⭐⭐⭐ (6)

The nginx:latest image is reasonably efficient, but using a more minimal base image like nginx:alpine would reduce resource usage further.

Nginx:latest画像はかなり効率的ですが、nginx:alpineのようなより最小限のベース画像を使用すると、リソース使用量がさらに削減されます。

アプリケーションのコンテナ化を助けてもらう

「Containerize my application」を実行すると、Docker AIにアプリケーションのコンテナ化を助けてもらうことができます。例えばGo言語で書かれたソースがあったとして、そのディレクトリーにアプリケーション一式がある状態でこの機能をつかうとソースが何であるか分析して、いくつかの質問に答えるだけでコンテナでアプリケーションを実行するためのパーツのテンプレートを作成してくれます。

一から自力で色々用意するよりは省力化できますね。あとは少々必要な「味付け」をするだけでコンテナ化は終了…とはいかないとは思いますが、結構役立つ機能だと思います。

まとめ

こんな感じで、Docker AIのGordonは結構賢いと思いました。 AIの進化は凄まじいですね。私もAIに負けないように頑張らないと。

Dockerはドキュメントは充実していますが、あまりにも膨大なのでどこに何が書かれているか迷子になることもあります。 そんなときDocker AIに助けて貰えば、必要な情報をすぐ入手できると思います。

Docker AIのGordonは現在無料で使えるようです。ぜひ手元の環境で試してみてください。

[source]