docker+gvisor上でkeycloakを動かす

# docker+gvisor上でkeycloakを動かす

gviosr上でdockerを使いセキュアな状態でkeycloakを運用してみよう。(目標)

## gvisorはなにがいいのか？

ぐぐるとだいたい同じような情報があるけど、ちょっとセキュアにコンテナを使えるようになるよ。くらいでいいかも。

## やったこと

0. 準備/前提
1. docker-ceを入れる
2. gvisorを入れる
3. git-hubのkeycloak dockerイメージを動かなかった
4. dockerのdebianイメージにkeacloakいれて設定かえて動かしてみる

## 得た知見

* git-hubのjboss/keycloakだとgvisor上ではオプションでIPアドレスの変更などができないので無理
* gvisorのコンテナはexec -it bashみたいなので入れないのでちょっと困ると辛い

# 準備/前提
ダウンロードするものとかは~/gvisor/ディレクトリを使用する

```
~$ mkdir gvisor
~$ cd gvisor/
~/gvisor$ 
```

# docker-ceインストール

dockerのコミュニティバージョンであるdocker-ceをインストールする。

## パッケージをダウンロード

```
~/gvisor$ wget https://download.docker.com/linux/debian/dists/buster/pool/stable/amd64/docker-ce_18
.03.1~ce-0~debian_amd64.deb
```

## パッケージをdpkgでインストール

```
~/gvisor$ sudo dpkg -i docker-ce_18.03.1~ce-0~debian_amd64.deb 
```

動作チェック
```
~/gvisor$ sudo docker run hello-world
```

## gvisorを入れる

gvisorのナイトリービルドをインストールする

ダウンロードとhash確認

```'
~/gvisor$ wget https://storage.googleapis.com/gvisor/releases/nightly/latest/runsc
~/gvisor$ wget https://storage.googleapis.com/gvisor/releases/nightly/latest/runsc.sha512
~/gvisor$ sha512sum -c runsc.sha512
```

権限変更と配置

```
~/gvisor$ chmod +x runsc
~/gvisor$ sudo mv runsc /usr/local/bin
```

dockerの設定変更と反映
```'
$ sudo sh -c 'cat <<EOF > /etc/docker/daemon.json
> {
>     "runtimes": {
>         "runsc": {
>             "path": "/usr/local/bin/runsc"
>         }
>     }
> }
> EOF'
~/gvisor$ sudo systemctl restart docker
```

動作確認
```
~/gvisor$ sudo docker run --runtime=runsc hello-world
```

3. git-hubのkeycloak dockerイメージを動かしてみる

```
$ sudo docker run -d -p 18080:8080 \
             -e KEYCLOAK_USER=admin \
             -e KEYCLOAK_PASSWORD=admin \
             --name keycloak \
             --runtime=runsc \
             jboss/keycloak

Unable to find image 'jboss/keycloak:latest' locally
latest: Pulling from jboss/keycloak
469cfcc7a4b3: Pull complete 
05677e4d61f0: Pull complete 
a9520f492457: Pull complete 
4d201219d6b1: Pull complete 
1835cd4c1a3f: Pull complete 
7714303c1354: Pull complete 
0cb1390f3098: Pull complete 
7a8e832639e4: Pull complete 
35edde27ea33: Pull complete 
d81d932b7a26: Pull complete 
c0ca17cacfd1: Pull complete 
7251b61e0d72: Pull complete 
dbc3b0e37cdb: Pull complete 
af694ff5dee0: Pull complete 
527e34c6e8c1: Pull complete 
57af359e5590: Pull complete 
b772d54dd32d: Pull complete 
12664afee115: Pull complete 
Digest: sha256:a2d07439f3acc50c6ab2464a5b802c59d26c7e5cd4b354a763fdac877ed7e265
Status: Downloaded newer image for jboss/keycloak:latest
eda8ffa5d2fc5a446681efee2d9f4d81b3908926cace44ab409f6250cf663c29
```

```
# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS            PORTS        NAMES
```

おらんぞ？
落ちたっぽいのでログの確認
```
$ docker-logs keycloak
```

以下当該部分っぽいとこ

```
15:59:28,547 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-3) MSC000001: Failed to start service org.wildfly.network.interface.management: org.jboss.msc.service.StartException in service 

org.wildfly.network.interface.management: WFLYSRV0082: failed to resolve interface management
        at org.jboss.as.server.services.net.NetworkInterfaceService.start(NetworkInterfaceService.java:96) [wildfly-server-3.0.8.Final.jar:3.0.8.Final]
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:2032) [jboss-msc-1.2.7.SP1.jar:1.2.7.SP1]
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1955) [jboss-msc-1.2.7.SP1.jar:1.2.7.SP1]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [rt.jar:1.8.0_161]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [rt.jar:1.8.0_161]
       at java.lang.Thread.run(Thread.java:748) [rt.jar:1.8.0_161]
```


IPが割りあてられてないような気がする。

いろいろ確認し辛いので1から入れてみる。

# dockerのdebianイメージにkeacloakいれて設定かえて動かしてみる


docker+gvisorでDebian入れる
```
yasuo@kohei:~/gvisor$ sudo docker run --runtime=runsc -it debian /bin/bash
```

普通にkeycloakインストール
jdkインストール
```
root@ea30d21c1301:/# apt install openjdk-8-jdk
```
wgetもないのでインストール
```
root@ea30d21c1301:/# apt install wget
```
keycloakをダウンロード
```
root@ea30d21c1301:/# wget https://downloads.jboss.org/keycloak/4.1.0.Final/keycloak-4.1.0.Final.tar.gz
```
keycloakの解答
```
root@ea30d21c1301:/# tar xvfz keycloak-4.1.0.Final.tar.gz 
```
keycloakの配置
```
root@ea30d21c1301:/# mv keycloak-4.1.0.Final /opt/keycloak
```

いざ起動
```
root@ea30d21c1301:/# cd /opt/keycloak/    
root@ea30d21c1301:/opt/keycloak# ./bin/standalone.sh 
```

やっぱエラーが出る
```
14:52:01,263 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-6) MSC000001: Failed to start

 service org.wildfly.network.interface.management: org.jboss.msc.service.StartException in service 

org.wildfly.network.interface.management: WFLYSRV0082: failed to resolve interface management
        at org.jboss.as.server.services.net.NetworkInterfaceService.start(NetworkInterfaceService.j

ava:96) [wildfly-server-3.0.8.Final.jar:3.0.8.Final]
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:2032) [jboss-msc-1.2.7.SP1.jar:1.2.7.SP1]
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1955) [jboss-msc-1.2.7.SP1.jar:1.2.7.SP1]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [rt.jar:1.8.0_171]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [rt.jar:1.8.0_171]
        at java.lang.Thread.run(Thread.java:748) [rt.jar:1.8.0_171]
```

ネットワークまわりっぽいのでデフォルトの127.0.0.1から実際に割りあてられてるアドレスに変更してみる。

NAMESを確認して、、、
```
$ sudo docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
ea30d21c1301        debian              "/bin/bash"         3 hours ago         Up 9 minutes                           admiring_bardeen
```

IPアドレスを確認する
```
$ sudo docker inspect -format="{{ .NetworkSettings.IPAddress }}" admiring_bardeenormat=172.17.0.2
```

これをjboss.bind.address.managementの箇所に投入してみる

```
root@ea30d21c1301:/opt/keycloak/standalone/configuration# diff -u standalone.xml~ standalone.xml
--- standalone.xml~     2018-07-12 16:52:50.134945210 +0000
+++ standalone.xml      2018-07-12 16:54:18.970861521 +0000
@@ -552,10 +552,10 @@
     </profile>
     <interfaces>
         <interface name="management">
-            <inet-address value="${jboss.bind.address.management:127.0.0.1}"/>
+            <inet-address value="${jboss.bind.address.management:172.17.0.2}"/>
         </interface>
         <interface name="public">
-            <inet-address value="${jboss.bind.address:127.0.0.1}"/>
+            <inet-address value="${jboss.bind.address:172.17.0.2}"/>
         </interface>
     </interfaces>
     <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
root@ea30d21c1301:/opt/keycloak# ./bin/standalone.sh 
```

動いた。
ホストのブラウザから
http://172.17.0.2:8080/auth/
とかしたらとりあえずログイン画面は見えた。

気が向いたら続く

gvisorでテスト済みとされてるアプリケーションとかがどんなテストしたのか情報が欲しい。。。