Alibaba Cloud Container Registry Serviceを使用したコンテナ化されたイメージの構築と展開

このチュートリアルでは、**Alibaba Cloud Container Registry**サービスを使用して**コンテナ**化されたイメージを構築し、デプロイします。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/up-and-running-with-alibaba-cloud-container-registry_593765)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*


#Alibaba Cloud Container Registryとは？

Alibaba Cloud Container Registry（ACR）は、コンテナイメージを構築して保存し、Dockerイメージを配布できるようにするスケーラブルなサーバーアプリケーションです。ACRを使用すると、保存されたイメージを完全に制御することができます。ACRには、GitHub、Bitbucket、自作のGitLabとの統合など、多くの機能があります。また、コンパイル後に新しいイメージを自動的にビルドし、ソースコードからアプリケーションまでテストすることもできます。

#ステップ1：Alibaba Cloud Container Registryを有効化する

アリババクラウドのアカウントを設定する必要があります。アカウントをお持ちでない場合は、アカウントにサインアップして、[40以上の製品を無料でお試し](https://www.alibabacloud.com/ja/campaign/free-trial)いただけます。詳しくは[こちら](https://www.alibabacloud.com/ja)のチュートリアルをお読みください。
最初に行う必要があるのは、Alibaba Cloud Container Registryを有効化することです。[製品ページ](https://www.alibabacloud.com/ja/product/container-registry)に移動し、**Get it Free**をクリックします。
Container Registry Consoleに移動し、サービスを設定してデプロイすることができます。

#ステップ2：アリババクラウドコンテナレジストリの設定
**ネームスペースの作成**

ネームスペースはリポジトリの集合体、リポジトリはイメージの集合体です。私は、アプリケーションごとに1つのネームスペースを作成し、サービスイメージごとに1つのリポジトリを作成することをお勧めします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/edf5e8e8-de78-9a53-ab48-013e0c37a26e.png)

ネームスペースを作成したら、設定でパブリックリードかプライベートかを設定します。

**ローカルリポジトリの作成とアップロード**

リポジトリ(repo)とは、イメージを集めたものです。1つのサービスのイメージの全バージョンを1つのリポジトリに集めることをお勧めします。**Create Repo**をクリックし、ページ内の情報を記入します。**Local Repository**を選択します。しばらくすると、独自のリポジトリURLを持つ新しいリポジトリが作成されます。画像一覧ページに表示されています。

これで、ローカルで作成した画像をこのリポジトリにアップロードすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/10e07925-66a6-392a-733b-08c00f0ed472.png)


#ステップ3：Dockerクライアントでコンテナレジストリに接続する
Dockerクライアントから任意のコンテナレジストリに接続するためには、まずACRコンソールでDockerのログインパスワードを設定する必要があります。このパスワードを使ってDockerクライアントからレジストリにログインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/b666772c-9e2d-6d2d-0497-8d3e14bf8520.png)

次に、イメージ一覧ページで、接続したいリポジトリの前にある**Admin**をクリックします。ここには、Dockerクライアントがリポジトリにアクセスできるようにするために必要な情報やコマンドが記載されています。リポジトリのイメージ名、イメージタイプ、インターネットアドレス、イントラネットアドレスが表示されます。インターネットアドレスは、世界中のどこからでもリポジトリにアクセスできるようにするためのものです。Alibaba Cloudコンテナクラスタでリポジトリを使用する場合は、インターネットアドレスを使用した方がはるかに高速になるので、インターネットアドレスを使用した方が良いでしょう。

ログインコマンド、プッシュコマンド、プルコマンドをコピーします。後で必要になります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/8bd997ce-2327-9b6e-395d-d021363bf1c1.png)

ローカルマシンでDockerクライアントを起動します。Dockerクライアントのインストール方法はdocker.ioを参照してください。MACの場合はdocker.appを起動してDockerクライアントを起動します。

**Dockerクライアントのユーザーとしてログイン**

```
docker login --username=random_name@163.com registry-intl.ap-southeast-1.aliyuncs.com
```

注: random_name は実際のユーザー名に置き換えてください。

パスワードを入力してエンターキーを押すと、ログイン成功のメッセージが表示されます。この時点で認証され、Alibaba Cloud Container Registryに接続されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/c88275b3-8ff2-90ad-5cdf-7414a5d7730c.png)

#ステップ4: ローカルにイメージを構築し、ACRにプッシュ
Dockerfileを書いてイメージを構築してみましょう。以下はサンプルのDockerfileです。

```
######################
# This is the first image for the static site.
#####################
FROM nginx
#A name can be given to a new build stage by adding AS name to the FROM instruction.
#ARG VERSION=0.0.0
LABEL NAME = static-Nginx-image 
START_TIME = 2018.03.10 
FOR="Alibaba Community" 
AUTHOR = "Fouad"
LABEL DESCRIPTION = "This image is built for static site on DOCKER"
LABEL VERSION = 0.0.0
#RUN mkdir -p /var/www/
ADD /public /usr/share/nginx/html/
EXPOSE 80
RUN service nginx restart</code></pre>

Run the Docker build command to build the image. In order to later push the image to the repository, you need to tag the new image with the registry: 

<pre><code>docker build -t registry-intl-internal.ap-southeast-1.aliyuncs.com/fouad-space/ati-image .
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/34c632cd-8f66-d1e9-f6b6-d6a323fa71c2.png)

ビルドが完了すると、すでにリポジトリ名がタグ付けされています。コマンドを使うと新しい画像が入っているのがわかります。

```
Docker image ls
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/7ea2b16b-14e1-a009-15e3-ace05c3d4132.png)

コマンドで画像をACRリポジトリにプッシュします。

```
docker push registry-intl.ap-southeast-1.aliyuncs.com/fouad-space/ati-image:latest
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/f96564e3-6a36-97cf-098d-dc58c195fffd.png)

イメージが正常にプッシュされたことを確認するには、Container Registryコンソールで確認します。リポジトリ名の前にある Admin をクリックし、Image version をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/f304014a-71f7-f76d-f008-017698f255fb.png)

画像をプルしてコンテナを作成します。docker pullコマンドを実行します。

```
docker pull registry-intl.ap-southeast-1.aliyuncs.com/fouad-space/ati-image:latest
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/5bf09410-5c1b-6f3c-8782-f9d5bd8ba071.png)

すでにローカルコンピュータに画像を引っ張ってきているので、「画像は最新のものです」というメッセージが表示されています。

この画像を使って新しいコンテナを作成します。

```
docker run -ti -p 80:80 registry-intl.ap-southeast-1.aliyuncs.com/fouad-space/ati-image bash
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/1b74d580-7001-d63a-c291-530d699d158c.png)

#ステップ 5: GitHub を使ったイメージレポの構築
Alibaba Cloud Container Registryを使用すると、クラウド上でイメージをビルドするだけでなく、レジストリに直接プッシュすることもできます。これに加えて、Container Repositoryは、コードが変更されたときにビルドを自動的にトリガーする機能をサポートしています。

ビルド設定で**「コード変更時にイメージを自動的に作成する（Automatically create an image when the code changes）」**を選択すると、コードを送信した後にイメージを自動的にビルドすることができ、手動でビルドをトリガーする必要が無くなります。これにより、手作業を省くことができ、イメージを常に最新の状態に保つことができます。

GitHubのレポを作成し、Dockerファイルをレポにアップロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/b3b40597-10e1-c541-baa9-39a6d9e10197.png)

その後、コンテナレジストリコンソールに戻り、レポを作成します。GitHubのレポパスを選択し、リポジトリ作成の手順を完了します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/7cb62502-af0d-ba51-5519-618d667c33c5.png)

リポジトリが作成されたら、Image Listに移動し、レポ名の**Admin**をクリックし、**Build**をクリックし、最後に**Build Now**をクリックします。

メニューにビルドの進捗状況が表示され、ビルドプロセスの完全なログが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/73c7569d-d302-09c1-0b3c-ee0744bcf18a.png)

ビルドログも全て見ることができます。きちんとしていると思いませんか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/2f482ce7-42ae-2a7f-fbc3-78f2eb5ac578.png)

ビルドが完了したら、イメージをデプロイする準備ができています。これをローカルのDockerエンジンに引っ張ったり、[Alibaba Cloud Container Service](https://www.alibabacloud.com/ja/product/container-service)にこのイメージをデプロイしたりすることができます。

#ステップ6: Webhookトリガーの作成

Webhookはトリガーの一種です。これを設定すると、イメージがビルドされたときに通知をプッシュしてくれるので、継続的なインテグレーションパイプラインを設定することができます。
これはどのように動作するのでしょうか？　Webhook に Container Service のトリガーを設定したとします。イメージがビルドされたり、リビルドされたりすると、コンテナサービス内のアプリケーションが自動的にトリガーされて、最新のイメージを引っ張ってきて再デプロイされます。

Webhookを作成するには、まずコンテナサービスにアクセスして、アプリケーションのWeb URLを取得する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/3698cd2e-156f-d21e-1278-56a40220bcd6.png)


ここで、この URL を使用してフックを設定します。コンテナレジストリのイメージが更新されるたびに、このアプリケーションは新しいイメージで再デプロイされます。間違った設定をするとアプリケーション全体がダウンしてしまう可能性がありますので、十分に注意してください。しかし、コンテナサービスではロールバックが可能なので、大きな心配はありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/9690983d-68a8-51b3-5fe1-78bf5a1aeaeb.png)

#概要
今回の記事では、以下のことを学んだはずです。

- [Alibaba Cloud Container Registryサービス](https://www.alibabacloud.com/ja/product/container-registry)とは何か、どのように実装することができるか。
- Dockerイメージをホストするためのネームスペースとリポジトリを作成する方法。
- ローカルにDockerイメージを構築してACRにプッシュする方法。
- DockerイメージをACRから引っ張ってきて、それを使って新しいスコテナーをインスタンス化する方法。
- GitHubソースコードを使ってコンテナレジストリにイメージをビルドする方法。
- 最新のイメージのプルリクエストを自動的にトリガーしてサービスを再デプロイする方法。

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*