Docker Network Jumpbox　コンテナへのゼロトラスト・ネットワーク・アクセスを自動化する

# はじめに
2023年6月1日、remote.itより[Remote.It、Docker Network Jumpboxがリリースされています。:tada:

https://ja.remote.it/resources/remote-it-zero-trust-docker-network-jumpbox

本記事では、上記プレスリリース記事を踏まえて、**Docker Network Jumpbox**（以下、Docker Jumpbox）の使用方法について記載しています。

Docker Jumpboxを使用するためには、remote.itの環境が必要です。
remote.itを知らない場合は、以前書いた[「remote.itを使ってベアメタルに接続する」](https://qiita.com/Brutus/items/81b950119800cfd9599b)をご参照ください。

## Docker Jumpbox
プレスリリース記事の内容を踏まえて、以下の機能が利用できます。

> - 既存のDocker環境内にRemote.It Jumpboxコンテナを展開することができる。
> - Remote.Itアカウントへのコンテナサービスの動的なプロビジョニングとデプロビジョニング（すべてのDockerネットワークにまたがる）
> - 自社環境で稼働するDockerコンテナへのサービスを自動的に作成する
> - Remote.It組織機能（タグ、ネットワーク、ロール）でDockerサービスを共有する。
> - Dockerネットワークにポートを公開することなく、ローカルのDockerサービスをホストデバイスと共有することができます。

remote.itを知らない方の場合、わかりにくいので絵にしてみました。
Docker Jumpboxを利用することで、インターネットを介した接続先の環境におけるDocker　ネットワークで稼働している全てのサービスにアクセスできます。

![Docker Network Jumpbox-ページ1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/e8fa9db5-1d2b-d44a-f4b8-f9019516a198.png)


また、リリースに伴い、Webinarも行われました。YouTubeから参照できます。
Webinarでは、Docker JumpboxのDemoと、AWSのECSのクラスターを用いたDemoが紹介されています。

https://youtu.be/HpRlz8LbcOE

::: note
Docker Jumpboxを利用することで、クローズドな環境で実行しているDockerコンテナに対して、グローバルIPアドレスや、VPN等を使用せずにリモートアクセスを行うことができます。
:::

### 準備作業
Docker Jumpboxを利用するためには、事前に以下の準備が必要です。

- [x] Docker Desktop 4.10以降のインストール
- [x] Remote.Itのアカウント登録

::: note
古いDocker Desktopを使用している場合は、アップグレードを行いましょう。
:::

### セットアップ
実際に触ってみることで、このテクノロジーの凄さが分かると思います。

では、試していきましょう。

本記事の環境として接続元となるPCは、macOSを使用しています。
Docker Desktopと、remote.itのアプリケーションは事前に起動している状態とし、以下にセットアップ手順を記載します。

Dockerと、remote.itのアプリケーションを両方使用しながらの作業になります。

#### Docker Desktopの拡張機能インストール
Docker Jumpboxを利用するために、Docker Desktopの拡張機能をインストールします。

ブラウザを起動後、docker hubから[Remote.It](https://hub.docker.com/extensions/remoteit/docker-extension)のURLを開き「Open in Docker Desktop」を押します。

![スクリーンショット 2023-06-21 19.51.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/c5188afb-2a8b-6a5b-b042-f5761e43d2b3.png)

Dockerのアプリケーションを開くと、Docker Desktopの拡張機能として、remote.itの画面に遷移するため、「Install」を押します。

![スクリーンショット 2023-06-19 19.21.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/b147a0e6-0d88-679c-7f49-9dc812a0e841.png)

Installが始まります。

![スクリーンショット 2023-06-19 19.22.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/797a6258-2b68-b63c-26f5-80c9b9ee2cd5.png)

Install完了後、「Open」を押します。

![スクリーンショット 2023-06-19 19.23.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/d23e7443-0da7-aa57-6447-ea8dfab3f135.png)

Docker Desktopの拡張機能として、remote.itがインストールされたことが確認できます。
続けて「Get Registration Code」を押します。

![スクリーンショット 2023-06-19 19.23.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/96e076de-55ba-8002-7b93-33711a209546.png)

:::note
[remoteit/docker-extension](https://hub.docker.com/r/remoteit/docker-extension)のイメージが公開されているため、Dockerコンテナとしてもインストールすることができます。
:::

#### remote.itのDevices登録
Docker Desktopの拡張機能インストール完了後、remote.itのアプリケーションを確認します。
以下のような画面に遷移するので**Registration Code**が発行されたことを確認します。確認後、Dockerのアプリケーションを開きます。

![スクリーンショット 2023-06-19 20.17.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/d6c5b1cb-4154-5e5b-cf73-cb1feb6d82a0.png)

Dockerのアプリケーションに戻ります。
Registration Codeが入力されていることを確認し、「Register」を押します。

![スクリーンショット 2023-06-19 20.17.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/cf26ee5c-3d0b-aa8c-7f48-70e9aa0d8e9f.png)

remote.itのDevices登録は完了です。
続けてJumpboxのコンテナをデプロイするため、「Copy」を押します、

![スクリーンショット 2023-06-19 20.18.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/d182b79e-6784-d518-f087-1393950abe4c.png)

接続したい環境のDocker ネットワークが稼働するホスト上で、コピーしたコマンドを実行します。

`$ docker run -d -e R3_REGISTRATION_CODE="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -v /var/run/docker.sock:/var/run/docker.sock --restart unless-stopped --name remoteit_docker_jumpbox remoteit/docker-extension:latest`

Docker Desktopまたは、CLIの`docker ps`コマンドなどを実行して、Jumpboxのコンテナが起動していることを確認します。

![スクリーンショット 2023-06-21 20.03.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/ea0b2173-e3f6-0e17-f9dc-8bd955319786.png)

### 動作確認
実際にDocker Jumpboxを用いて、Docker ネットワークにアクセスしてみます。

※最初の動作確認では、Docker ネットワークの接続先として、ローカル環境におけるNGINXのコンテナと、FastAPIのコンテナにアクセスしています。

#### ローカル環境
remote.itのアプリケーションを開き「Devices」を確認すると、Docker Jumpboxが作成されているのでDocker Jumpboxを選択します。

![スクリーンショット 2023-06-20 22.32.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/e0b31bf4-b464-d37c-ced3-c7e8b57f0206.png)

接続先の環境におけるDocker ネットワークで稼働してるコンテナ群が「SERVICE」として登録されていることが確認できます。

SERVICEにアクセスするためには、任意のSERVICEを選択した状態で「START」を押してコネクションを作成します。SERVICEの下の右向三角のアイコンを押しても大丈夫です。

![スクリーンショット 2023-06-21 20.18.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/a65087d4-3fd0-2ee7-0228-d6ce1a0a6915.png)

Connetionに**Local Peer to Peer**と表示されれば、成功です。

![スクリーンショット 2023-06-21 20.49.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/d035de4a-0579-6c21-6eb6-087fe6bc1e50.png)

「COPY」または、「LAUNCH」を押すと、作成したSERVICEにアクセスできます。

![スクリーンショット 2023-06-21 21.06.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/711105ab-46cd-123c-2a8b-c71816e6f01b.png)

「LAUNCH」を押してブラウザを確認すると、FastAPIのコンテナにアクセスできました。

![スクリーンショット 2023-06-21 20.55.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/d06307c3-ae3e-a581-e407-1993a7e04639.png)

同じようにNGINXのSERVICEも「START」を押して、Connectionを作成します。

![スクリーンショット 2023-06-21 20.49.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/bd0ebf9e-d09f-094b-d82d-656d90ba935c.png)

NGINXのコンテナもアクセスできました。

![スクリーンショット 2023-06-21 20.55.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/c89b0e2b-f2d2-73e6-7f44-a04db6b44945.png)

Connetionを切断する場合は、逆の動作を行います。
「DISCONNECT」などを押してコネクションを切断します。

![スクリーンショット 2023-06-21 21.18.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/6ed516f4-7bd6-1237-5475-389122480dde.png)

コネクションの切断が確認できました。

![スクリーンショット 2023-06-21 21.19.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/0058bae3-4f1b-6734-8479-371f5f653240.png)

::: note
Nginxコンテナは、`docker run --name nginx -d -p 80:80 nginx`を実行しています。
:::

#### 外部のネットワーク環境
ローカル環境ではまだ実感が湧かないため、別のネットワークから、クローズドな別のDocker ネットワークにアクセスできるか検証します。

※以下の例では、スマートフォンの回線でテザリングを行い、Docker ネットワークの接続先として、自宅のRaspberry Pi上で稼働するNGINXのコンテナにアクセスしています。

![Docker Network Jumpbox-ページ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/9c46a866-76d0-a765-04e4-d3cb8a119264.png)


Raspberry PiでJumpboxのコンテナをデプロイするため、同じコマンドを実行します。

`$ docker run -d -e R3_REGISTRATION_CODE="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -v /var/run/docker.sock:/var/run/docker.sock --restart unless-stopped --name remoteit_docker_jumpbox remoteit/docker-extension:latest`

新しいDocker Jumpboxが作成されているため、新規に作成されたDocker Jumpboxを選択します。

![スクリーンショット 2023-06-22 21.01.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/f45556ac-3ed5-bde4-b5e6-acbe1d393b5d.png)

同じようにNGINXのSERVICEの「START」を押して、Connectionを作成します。

![スクリーンショット 2023-06-22 21.28.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/cfc7c963-f90b-db69-c1d5-a80438e6647d.png)

作成したSERVICEのURLを開くと、NGINXのコンテナにアクセスできました。

![スクリーンショット 2023-06-22 21.31.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/79025d2d-31d4-5b09-408a-ed1dc4f93a0c.png)

これで、外から自宅のRaspberry Piで稼働している、コンテナにアクセスができるということが改めて確認できました。

# おわりに
今は生成系AIがトレンドですが、このようなインフラに関わる新しいテクノロジーも面白いですね。

技術は日進月歩とよく言われますが、仏教で言う[**諸行無常**](https://ja.wikipedia.org/wiki/%E8%AB%B8%E8%A1%8C%E7%84%A1%E5%B8%B8)の世界に近いと思います。

こうして新しい技術もどんどん生まれてくるので積極的に試していきましょう。