Docker CLI を使用してコンテナーを Azure ACI にデプロイして作成する方法

クラウドでコンテナを実行することは、困難で混乱を招く可能性があります。 仮想ネットワークからセキュリティまで、さまざまなクラウドがどのように機能するかを理解し、選択できるオプションは非常にたくさんあります。 オーケストレーターは言うまでもありません。 控えめに言っても、それは学習曲線です。

Docker では、開発者エクスペリエンス (DX) をよりシンプルにしています。 その延長として、開発者が毎日使用するのと同じ愛されているDockerエクスペリエンスを提供し、クラウドと統合したいと考えています。 MicrosoftのAzure ACIは、まさにそれを行うための素晴らしいプラットフォームを提供しました。

このチュートリアルでは、Azure ACI で作成を使用して 1 つのコンテナーと複数のコンテナーを実行する方法について説明します。 Docker コンテキストを設定し、Azure へのログインを簡略化する方法について説明します。 このチュートリアルを終了すると、使い慣れた Docker コマンドを使用して、アプリケーションを独自の Azure ACI アカウントにデプロイできるようになります。

前提 条件

このチュートリアルを完了するには、次のものが必要です。

ACI でのドッカー コンテナーの実行

Azure ACI との統合は、ローカル コンテナーの操作とよく似ています。 開発チームは開発者エクスペリエンスについて非常に深く考え、ACI を操作するための UX をローカル コンテナーでの作業にできるだけ近づけようとしました。

Azure ACI で単純な Nginx Web サーバーを実行してみましょう。

Azure にログインします。

ACI で Docker イメージを実行するために、マシンに Azure CLI をインストールする必要はありません。 ドッカーがすべてを処理します。

最初に行う必要があるのは、Azureにログインすることです。

$ docker login azure

これにより、Azureにログインできるブラウザウィンドウが開きます。

Azure aci using docker cli 1

アカウントを選択してログインします。 ログインしたら、ブラウザウィンドウを閉じることができます。

Azure ACI Context

Dockerにはコンテキストの概念があります。 コンテキストは、Docker コンテナーを実行できる場所と考えることができます。これより少し複雑ですが、これは今のところ十分な説明です。 このチュートリアルでは、ローカル コンテキストと新しい ACI コンテキストを使用します。

まず、ローカル開発マシンに現在どのようなコンテキストがあるかを見てみましょう。 次のコマンドを実行して、コンテキストのリストを表示します。

$ docker context list
NAME                TYPE                DESCRIPTION                               DOCKER ENDPOINT               KUBERNETES ENDPOINT                                 ORCHESTRATOR

default *           moby                Current DOCKER_HOST based configuration   unix:///var/run/docker.sock   https://kubernetes.docker.internal:6443 (default)   swarm

別のコンテキストを既に作成しているかどうかに応じて、1 つのコンテキストのみが表示されます。 これは、"moby" というラベルの付いたローカル Docker エンジンを指す既定のコンテキストです。 docker コマンドに使用される現在のコンテキストは、アクティブなコンテキストの名前の横にある "*" で識別できます。

次に、コンテナーを実行できる ACI コンテキストを作成しましょう。 create aci コマンドを使用してコンテキストを作成します。 

aci コンテキストを作成するためのヘルプを見てみましょう。

$ docker context create aci --help
Create a context for Azure Container Instances

Usage:
  docker context create aci CONTEXT [flags]

Flags:
      --description string       Description of the context
  -h, --help                     help for aci
      --location string          Location (default "eastus")
      --resource-group string    Resource group
      --subscription-id string   Location

Global Flags:
      --config DIRECTORY   Location of the client config files DIRECTORY (default "/Users/peter/.docker")
  -c, --context string     context
  -D, --debug              enable debug output in the logs
  -H, --host string        Daemon socket(s) to connect to

ヘルプの [フラグ] セクションの下に、 場所、リソース グループ、 サブスクリプション IDを設定するオプションがあることがわかります。

これらのフラグを create コマンドに渡すことができます。 そうしないと、docker cli は対話モードでこれらの質問をします。 今それをやってみましょう。

$ docker context create aci myaci

cliが最初に尋ねるのは、使用するサブスクリプションです。 1つしかない場合、dockerはそれを使用します。

Using only available subscription : Azure subscription 1 (b3c07e4a-774e-4d8a-b071-xxxxxxxxxxxx)

次に、使用するリソース グループを選択する必要があります。 以前に作成したものを選択するか、[新しいリソース グループの作成] を選択できます。 新しいものを作成することを選択します。

Resource group "c3eea3e7-69d3-4b54-83cb-xxxxxxxxxxxx" (eastus) created

これで、aci コンテキストが設定されました。 コンテキストをリストしましょう。

$ docker context list

作成した ACI コンテキストが表示されます。

ACI でのコンテナの実行

ACI コンテキストを設定したので、クラウドでコンテナーを実行できるようになりました。 コマンドを適用するコンテキストを Docker に指示する方法は 2 つあります。 

1 つ目は、 –context フラグを渡すことです。 もう1つは、コンテキストを切り替えることで、後続のすべてのコマンドで使用するコンテキストをDockerに指示することです。 ここでは、–context フラグを使用しましょう。

$ docker --context myaci run -d --name web -p 80:80 nginx
[+] Running 2/2
 ⠿ web                         Created                                                                           
 ⠿ single--container--aci      Done                                                                                
web

ここでは、Docker が ACI と対話し、「web」という名前のコンテナー インスタンスを作成し、1 つのインスタンスを開始したことがわかります。

Azure aci using docker cli 2

Azure ポータルを開き、コンテナー インスタンスに移動します。

psやlogsなど、すでに使い慣れているDockerCLIコマンドを実行することもできます。

コンテキストの切り替え

実行中のコンテナーを見てみましょう。 ただし、その前に、アクティブ コンテキストを上記で設定した ACI コンテキストに切り替えて、すべてのコマンドで –context を入力し続ける必要がないようにしましょう。

$ docker context use myaci

次に、–context フラグを渡さずに ps コマンドを実行してみましょう。

$ docker ps
CONTAINER ID        IMAGE               COMMAND             STATUS              
PORTS
web                            nginx                                                              Running             52.224.73.190:80->80/tcp

Dockerにmyaciコンテキストを使用するように指示したので、ローカルマシンではなくAzureアカウントで実行されているコンテナのリストが表示されます。

コンテナが実行されていることを確認しましょう。 上記のps出力からコンテナのIPアドレスをコピーし、ブラウザのアドレスバーに貼り付けます。 あなたは私たちのNginxウェブサーバーが動いているのを見ることができます!

Azure aci using docker cli 3

上で述べたように、コンテナのログを確認することもできます。 

$ docker logs web

コンテナーを停止して削除するには、次のコマンドを実行します。

$ docker rm web

ブーム!

それは非常に簡単で、統合はスムーズです。 既に使い慣れたいくつかの Docker コマンドといくつかの新しいコマンドを使用して、開発マシンから ACI でコンテナーを非常に迅速かつ簡単に実行できました。

しかし、これで終わりではありません!

Docker Compose

を使用して複数のコンテナを実行することもできます Docker 作成。 ACI 統合により、ACI に対して docker cli から作成コマンドを実行できるようになりました。 次にそれをやってみましょう。

コードリポジトリをフォークする

私はRedisデータベースにタイムスタンプを記録する単純なPythonフラスコアプリケーションを使用しています。 リポジトリをフォークしてから、gitリポジトリをローカルマシンにクローンしましょう。

お気に入りのブラウザを開き、次の場所に移動します https://github.com/pmckeetx/timestamper

ウィンドウの右上隅にある「フォーク」ボタンをクリックします。 これにより、デモリポジトリの「コピー」がGitHubアカウントに作成されます。

フォークされたバージョンのリポジトリで、緑色の [コード] ボタンをクリックし、github の URL をコピーします。

ローカルマシンでターミナルを開き、次のgitコマンドを実行して、リポジトリをローカル開発マシンに複製します。

&lt<github username>; &gt; を GitHub ユーザー名に置き換えてください。

git clone [email protected]:<<github username>>/timestamper.git

ローカルでビルドして実行する

タイムスタンプ プロジェクトのルート ディレクトリにいることを確認し、次の手順に従ってイメージをビルドし、Docker Compose でアプリケーションを起動します。

まず、Docker ID を docker-compose.yml ファイルのイメージに追加する必要があります。 エディターで docker-compose.yml ファイルを開き、<<username>> を実際の Docker ID に置き換えます。

次に、ローカルのDockerコンテキストを使用していることを確認する必要があります。

$ docker context use default

これで、docker-composeを使用してアプリケーションをビルドして起動できます。

$ docker-compose up --build
Building frontend
Step 1/7 : FROM python:3.7-alpine
 ---> 6ca3e0b1ab69
Step 2/7 : WORKDIR /app
...
frontend_1  |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
frontend_1  |  * Restarting with stat
frontend_1  |  * Debugger is active!
frontend_1  |  * Debugger PIN: 622-764-646

Docker はタイムスタンプ イメージをビルドし、Redis データベースとタイムスタンプ コンテナーを実行します。

http://localhost:5000 に移動し、タイムスタンプをクリックします。 ボタンを数回押します。

Azure aci using docker cli 4

ACI で作成

次に、新しい docker 作成統合を使用して、ACI でアプリケーションを実行してみましょう。

まず、ACI がイメージをプルして実行できるように、イメージを Docker Hub にプッシュする必要があります。 次のコマンドを実行して、イメージを Docker Hub アカウントにプッシュします。

$ docker-compose push
Pushing frontend (pmckee/timestamper:latest)...
The push refers to repository [docker.io/pmckee/timestamper]
6e899582609b: Pushed
...
50644c29ef5a: Layer already exists
latest: digest: sha256:3ce2607f101a381b36beeb0ca1597cce9925d17a0f826cac0f7e0365386a3042 size: 2201

イメージが Hub 上にあるので、compose を使用して ACI でアプリケーションを実行できます。

まず、ACI コンテキストに切り替えましょう。

$ docker context use myaci

コンテキストのリストと使用されているコンテキストを表示するには、list contexts コマンドを実行できることを忘れないでください。

$ docker context list

ACI コンテキストを使用するようになったので、クラウドでアプリケーションを始めましょう。

$ docker compose up
[+] Running 3/3
 ⠿ timestamper     Created
 ⠿ frontend        Done
 ⠿ backend         Done

アプリケーションが稼働していることを確認しましょう。 フロントエンドのIPアドレスを取得するために、実行中のコンテナを一覧表示しましょう。

$ docker ps
CONTAINER ID           IMAGE                COMMAND             STATUS              PORTS

timestamper_frontend       pmckee/timestamper                       
Running             40.71.234.128:5000->5000/tcp

timestamper_backend         redis:alpine                             
Running

上記のIPアドレスとポートをコピーして、お気に入りのブラウザに貼り付けます。

Azure aci using docker cli 5

Redis コンテナーのログを見てみましょう。

$ docker logs timestamper_backend
1:C 13 Jul 2020 18:21:12.044 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
...
1:M 13 Jul 2020 18:21:12.046 # Server initialized
1:M 13 Jul 2020 18:21:12.047 * Ready to accept connections

はい! これは、ACI で実行されている Redis コンテナーです。かなりかっこいい。

少し遊んだ後、compose down を実行して作成アプリケーションを停止できます。

$ docker compose down

結論

ACI 統合で Compose on Azure を使用して 1 つのコンテナーを実行することも、複数のコンテナーを実行することも、今ではいかに簡単であるかを確認しました。 機能に影響を与えたり提案したりしたい場合は、公開 ロードマップで行うことができます。

Composeと、オープンソースイニシアチブの周りで起こっているすべてのクールなことについてもっと知りたい場合は、チェックアウトしてください 素晴らしい 作曲 とオープンソース の作曲仕様。