Docker イメージ ビルドして、IBM CloudのROKSにデプロイしてみた


## はじめに

今回はDockerで新しいイメージをビルドして、IBM CloudのROKSにデプロイする方法をご紹介します。

この記事で含む内容を簡単に説明すると、以下の３点です。

**Step1 Docker イメージ作成**  （Dockerでサンプルアプリをビルド）
**Step2 Container Registryにpush**  （IBM Cloud Container Registoryにイメージをpush）
**Step3 ROKS上にデプロイ**    （ROKSにイメージをpullしPodをデプロイ）



> ▲IBM Cloudを利用してのROKSクラスターの構築方法はこちらの記事から参照できます：
> 「ゼロから始めよう、ROKS on IBM CloudでのNginxサーバ構築」
> https://qiita.com/jennyxu/items/c57b32af463b2e015eb0

>
> ▲本手順でデプロイしたアプリにインターネットからアクセスしたい場合はこちらのリンクを参照してください。
> 「IBM Cloud internet services (CIS)からROKSのpodにアクセスしてみた」
> https://qiita.com/jennyxu/items/dc6b92049ba5af3c4c39



では、一緒にやってみましょう。




## 前提・環境

- Docker desktop 
  （インストール：https://www.docker.com/products/docker-desktop
    手順：https://sukkiri.jp/technologies/virtualizers/docker/docker-win_install.html）

- Docker desktopにnginx イメージをインストール
  （https://www.docker.com/blog/how-to-use-the-official-nginx-docker-image/）

- IBM Cloudアカウント
- IBM Cloud CLI
  （インストール：https://cloud.ibm.com/docs/cli?topic=cli-install-ibmcloud-cli）
- OC CLI
  （インストール：https://docs.openshift.com/container-platform/4.7/cli_reference/openshift_cli/getting-started-cli.html#installing-openshift-cli）





## **Step1 Docker イメージ作成**

Step1では、既存の自作のHTMLを表示するためにカスタムnginx イメージを作成します。

Docker desktopがfileを参照可能なディレクトリは事前に指定されています。（以下の写真参照）いずれかのディレクトリにDockerfileを保存していないと、ビルド時に正しく読み込まないので注意してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934715/e3183fe6-b637-196c-976e-1c76758d87df.png)
本手順では、/Usersを使います。/path/to/exported/directoryに任意のpathを追加することも可能です。

ターミナルにて、/Usersに移動してDockerfile作成用のディレクトを作成します。

```shell
## /Usersに移動
$ cd /Users
##　ディレクト作成
$ mkdir container-common
## 作成したディレクトに移動
$ cd container-common
```

では、簡単なhtml fileを作ります。

```shell
##file作成
$ vi index.html
```

index.htmlに下記の内容を書き込みます。

```html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Docker container</title>
</head>
<body>
<h2>Hello my first container</h2>
</body>
</html>
```

次に、Dockerで作成するcontainer イメージを管理するためのDockerfileを作ります。

```shell
##同じディレクトにDockerfileを作成
$ vi Dockerfile
```
Dockerfileに下記の内容を書き込みます。

```dockerfile
FROM nignx:latest
COPY ./index.html /usr/share/nginx/html/index.html
```

作成したDockerfileからカスタムnginxイメージをビルドします。その後、ビルドしたイメージで正常にコンテナが作成できることを確認します。

```dockerfile
##Docker イメージビルド
$ docker build -t container-common:v1 .
##run Docker イメージ
$ docker run -it --rm -d -p 8080:80 --name web1 container-common:v1
```

 以上の手順が完了すると、Docker desktopよりイメージとcontainerの状況が確認できます。Runningになっていれば正常にデプロイできていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934715/12bfd314-00c7-42a8-1a8c-a115cd996db3.png)


## **Step2 Container Registryにpush**

IBM Cloud(cloud.ibm.com)にログインして、Container Registryをオーダーします。

「カタログ」→「Container Registry」と入力→「Container Registry」をクリック→右上の「開始する」をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934715/d9548585-7426-8130-5e72-45fcec71cbfe.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934715/82db95df-cb4f-5e37-4e9b-11f8c7bdf586.png)

 Container Registryのオーダーが完了したら、上記の手順にしたがって設定を行います。

```shell
↓ガイドの3番目から

$ibmcloud plugin install container-registry -r `IBM Cloud`
##IBM Cloudにログイン
$ ibmcloud login --apikey <API_KEY> -g rg-common -r jp-tok
$ ibmcloud cr region-set ap-north
##name sapce作成
$ ibmcloud cr namespace-add cr-common

$ ibmcloud cr login
$ docker pull hello-world
##タグを付ける
$ docker tag container-common:v1 jp.icr.io/cr-common/container-common:v1
##イメージをpush
$ docker push jp.icr.io/cr-common/container-common:v1
##イメージがRegistry内にあることを確認
$ ibmcloud cr image-list
```

IBM Cloudのコンソール画面から作成した名前空間が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934715/be99c8f8-487d-c8cc-49d6-ed1dc69138a7.png)


## **Step3 ROKS上にデプロイ**

```shell
##ROKSにログイン
$ oc login -u apikey -p <API_KEY>
##project指定
$ oc project test-common
```

ターミナルからROKSクラスターへログインする方法は二つがあります。今回はApi keyでログインしましたが、OpenShiftコンソールログインコマンドを発行し、ログインする方法もあります。こちらの記事を参照してみてください：https://qiita.com/jennyxu/items/c57b32af463b2e015eb0

```shell
$ oc secrets link sa/default secrets/all-icr-io --for=pull -n default
$ oc run test-pod --image=jp.icr.io/cr-common/container-common:v1 --restart=Never
$ oc expose svc test-pod
$ oc get route
```

以上がDocker イメージのビルドから、IBM Cloud Container Registoryへのイメージのpush、そのイメージを利用してのROKS上にデプロイする方法になります。

ご参考になれば幸いです。

## **参考資料**
https://www.youtube.com/watch?v=4PvlcTtaAhw

https://www.youtube.com/watch?v=LQjaJINkQXY

https://www.docker.com/blog/how-to-use-the-official-nginx-docker-image/

https://ibm.github.io/openshift-on-ibm-cloud-workshops/6-existing-image.html

https://www.youtube.com/watch?v=6CS0e1MHB7Y&t=189s