Dockerコンテナ間でSSH通信を行う

# はじめに
実務で依存関係の調査があり、
server_1 から server_2 にSSH通信し、シェルスクリプトを起動する確認を行った。
手っ取り早く環境を用意するためにDokerコンテナ間でSSH通信を試みたが、少し手間取ってしまったため、備忘のため記事を作成した。

# 環境
Windows10, macOS

# 対象
Docker初心者、サーバ間通信がわからない人

# 手順
### 1. Dockerイメージ作成
任意のディレクトリ作成し、移動
```:bash or powershell
$ mkdir docker_ssh_communication
$ cd docker_ssh_communication
```

vimでDockerfile作成。下記のDockerコマンドをコピペする。
```:bash or powershell
$ vim Dockerfile

FROM ubuntu:20.04

RUN \
    apt update && apt-get install -y \
    vim \
    openssh-server openssh-client \
    && mkdir ~/.ssh \
    && touch ~/.ssh/authorized_keys \
    && chmod 600 ~/.ssh/authorized_keys \
    && apt clean \
    && rm -rf /var/lib/apt/lists/*

CMD ["/sbin/init"]
```
- コマンドの説明
  - `FROM ubuntu:20.04`のOSベースにDockerイメージを構築
  - `apt update && apt-get install -y`コマンドを使用して、
  `vim`と`openssh-server``openssh-client`をインストール
  - `mkdir ~/.ssh``touch ~/.ssh/authorized_keys``chmod 600 ~/.ssh/authorized_keys`はSSH認証するための前準備
  - `apt clean``rm -rf /var/lib/apt/lists/*`は不要なファイル削除
  - `CMD ["/sbin/init"]`デーモンプロセス初期化


### 2. コンテナ起動
ターミナルを2つ立ち上げ、それぞれコマンドを実行する。
```:server_1
$ docker run --privileged -d -it --rm --name server_1 -p 18080:80 -p 2222:22 server_1
```
```:server_2
$ docker run --privileged -d -it --rm --name server_2 -p 18090:80 -p 2223:22 --link server_1:server_1 server_2
```

### 3. コンテナ内シェル起動
```:server_1
$ docker exec -u 0 -it server_1 bash
※ windowsの場合、winpty docker exec -u 0 -it server_1 bash
```
```:server_2
$ docker exec -u 0 -it server_2 bash
※ windowsの場合、winpty docker exec -u 0 -it server_2 bash
```

### 4. sshディレクトリに移動する
```:server_1 / server_2
cd ~/.ssh
```

### 5. server_1の方で秘密鍵&公開鍵作成、登録
```:server_1
$ ssh-keygen
```
Enterを押し続ける(空入力でOK)
```
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:j1vNi+kIkT7iMDA9IYlYagDAD3S+WgCUoEJxEX+Z3aQ root@fcfa22e352cb
The key's randomart image is:
+---[RSA 3072]----+
|&=+=o      .     |
|BB+ .   + +      |
|Oo+. . + E .     |
|oo.o. ..         |
|o oo  o S        |
| oo. . . o o     |
| .o . + . o o    |
|   + . o + o .   |
|    .   o.+ .    |
+----[SHA256]-----+
```

公開鍵の内容を確認し、コピーしておく
```:server_1
$ vim id_rsa.pub
```

server_2`(authorized_keys)`でserver_1の公開鍵`(id_rsa.pub)`を登録する(ペースト)
```:server_2
$ vim authorized_keys
```

### 6. server_1からserver_2にSSH通信するためにポートを解放する
```:server_2
$ cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org → 元ファイルは残しておく
$ vim /etc/ssh/sshd_config
```
Port番号のコメントをけして、`2222`に設定する
```
#Port 22 → Port 2222
```

### 7. サービス再起動
sshd設定を再読み込み、sshdを再起動する
```:server_2
$ sshd -t
$ systemctl restart sshd.service
```

server_2のIPアドレスを確認する
```:server_2
$ hostname -i
172.17.0.3
```

### 8. SSH接続
serve_1からSSHコマンドで接続できるか確認する
```: server_2
ssh -p 2222 root@172.17.0.3
```
下記が返ってきた場合は、`yes`を入力
```
The authenticity of host '[172.17.0.3]:2222 ([172.17.0.3]:2222)' can't be established.
ECDSA key fingerprint is SHA256:a39angxaghzFYEoxh+00UOiSJOYF0tNdR1vQtvuMCtQ.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
```

ログイン確認
```
Welcome to Ubuntu 20.04.5 LTS (GNU/Linux 5.10.124-linuxkit aarch64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

To restore this content, you can run the 'unminimize' command.
Last login: Fri Mar 31 05:13:52 2023 from 172.17.0.2
root@34653c25d172:~# 
```

### まとめ
これにより`scp`コマンド使用してファイル転送などが行える。
実務で以外に使用回数が多かったので今回記事の作成を行った。