OCI Container Instancesを使用したRedisコンテナ作成

## 概要
OCI Container Instances(CI)を使用したRedisコンテナ作成を行いました。

## 構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/ed0e6e02-4043-a93b-69ce-214a438ab5b4.png)

## 事前準備
作成するために以下を準備します。
 -Docker環境がある
   VMにDockerをインストールします
 -CI作成に必要なVCNやSubnetが作成済
   新規でもCI作成可能ですが既存Subnet利用がよいかと思います。
## 作成
■Dockerfile作成
VM内に以下のようにDockerfileを作成します。
EXPOSEでRedisのportを定義しないとCIでこのportをlistenしてくれません。
``` Dockerfile.
FROM redis
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
EXPOSE 6379
``` 

■redis.conf作成
VM内にRedisを起動するための設定ファイルを作成します。
``` redis.conf
bind 0.0.0.0
protected-mode no
port 6379
``` 
■イメージBuild
VM内のDockerを使ってDockerfile,redis.confを元にイメージBuildします。
``` 
[user@vm]$ docker image build -t nrt.ocir.io/【ネームスペース】/redis001:0.1 .
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
STEP 1/4: FROM redis
STEP 2/4: COPY redis.conf /usr/local/etc/redis/redis.conf
STEP 3/4: CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
STEP 4/4: EXPOSE 6379
COMMIT nrt.ocir.io/【ネームスペース】/redis001:0.1
Successfully tagged nrt.ocir.io/【ネームスペース】/redis001:0.1
Successfully tagged localhost/redistest:0.1
``` 
■レジストリにPush
docker loginでOCIRにログインして作成したイメージをPushします。
Username/Passwordは以下を参考に入手します。
Oracle Container Engine for Kubernetes(OKE)でKubernetesを動かしてみよう
2.OCIRへのプッシュとOKEへのデプロイ
https://oracle-japan.github.io/ocitutorials/cloud-native/oke-for-beginners/
(オプション):
リポジトリ(今回はredis001)を特定のコンパートメントに作成する場合は、
事前にレジストリを作成してください。
レジストリ作成はOCIコンソールから開発者サービス>>コンテナレジストリを選択し、リポジトリの作成ボタンを押下します。

``` 
[user@vm]$ docker login nrt.ocir.io
Username:【ネームスペース】/【ユーザー名】
Password:【認証トークン】
[user@vm]$ docker push nrt.ocir.io/【ネームスペース】/redis001:0.1
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
(略)
Writing manifest to image destination
Storing signatures
``` 
OCIコンソールから開発者サービス>>コンテナレジストリを選択してイメージがPushされていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/ed288ed6-33d1-9501-8290-2541d3c5d1fe.png)

■CI作成
OCIコンソールから開発者サービス>>コンテナインスタンスを選択します。
コンテナインスタンスの作成を押下して作成します。

-名前:適切に設定
-シェイプ:適切に設定
-VCNおよびサブネット：CIを配置するサブネットを指定
-ネットワークセキュリティグループ：必要な通信のみ許可するNSGを指定
-プライベートIPアドレス：予め決めたアドレスを指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/8b8f9c3b-ff33-f1c1-898b-cadbe4e6d1ee.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/9581803b-ca9b-00f1-d426-4c569f7d62e3.png)

次を押下
-Name:適切に設定
-イメージの選択を押下
  * リポジトリおよびイメージを選択　例：redis001:01
  * ~~ユーザー名【ネームスペース】/【ユーザー名】~~ コンソールから操作では不要
  * ~~パスワード【認証トークン】~~　コンソールから操作では不要
  * イメージの選択を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/4e602544-557f-ae84-a551-5be5384024db.png)
次を押下
確認して作成を押下

しばらくするとインスタンスがActiveとなります。

■疎通確認
VMからredis-cliを利用して接続確認を行います。
```
#redisコンテナにping
root@679df5b7c3bd:/data# redis-cli -h 10.105.6.101 ping
PONG
root@679df5b7c3bd:/data#
#redisコンテナにアクセス
root@679df5b7c3bd:/data# redis-cli -h 10.105.6.101
10.105.6.101:6379>
10.105.6.101:6379> info replication
#Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:1ec0c0d07466fad23a455270f1c44d1fc5eedf82
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
10.105.6.101:6379>
```
## Readレプリカ
上記の作成例はmasterのみですが、Readレプリカを作成することも可能です。
-CI作成にてReadレプリカ用のCIを作成
-redis cliを使用してReadレプリカ用redisにアクセス
-slaveof 【masterのIPアドレス】6379を実行
-info replicationでroleがslaveになったことを確認
-masterのredisにアクセスしinfo replicationでslaveのIPが表示されることを確認

## memcachedコンテナ
memcachedイメージを使用してCIを立ち上げました。

■Dockerfile作成
VM内に以下のようにDockerfileを作成します。
メモリは128MB,ポート11211を設定しています。
``` Dockerfile.
FROM memcached
CMD [ "-m", "128" ]
EXPOSE 11211
``` 
■イメージBuild
VM内のDockerを使ってDockerfileを元にイメージBuildします。
``` 
[user@vm]$ docker image build -t nrt.ocir.io/【ネームスペース】/memcached001:0.1 .
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
STEP 1/3: FROM memcached
STEP 2/3: CMD [ "-m", "128" ]
--> 13cc8443439
STEP 3/3: EXPOSE 11211
COMMIT nrt.ocir.io/axlpeslmb1ng/memcached001:0.1
--> 523935b1f3c
Successfully tagged nrt.ocir.io/axlpeslmb1ng/memcached001:0.1
``` 
■レジストリにPush
docker loginでOCIRにログインして作成したイメージをPushします。
``` 
[user@vm]$ docker push nrt.ocir.io/【ネームスペース】/memcached001:0.1
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
Getting image source signatures
(略)
Writing manifest to image destination
Storing signatures
``` 
■CI作成
Redisと同様の手順で作成します。
■疎通確認
VMから接続確認を行います。
```
#memcachedコンテナにlogin
[opc2@k-vm-01 .kube]$ telnet 10.105.2.164 11211
Trying 10.105.2.164...
Connected to 10.105.2.164.
Escape character is '^]'.
set key1 0 0 3
123
STORED
get key1
VALUE key1 0 3
123
END
#容量確認
stats
STAT limit_maxbytes 134217728 (=128MB)
```