docker-machineでEC2たてて、SSH接続した話

# はじめに
インスタンス上で開発したいけど、やり方がわからなかった自分のために作りました。
環境は`macOS Mojave 10.14.6`

## 追記
追記1:
おそらく固定IPにしていないと、閉じた時に設定が使えなくなってしまうので、そこにも対応しました。
追記2:
docker-composerがbuildできるversionをインストールするように変更しました。
追記3:
AMIを追記しました。

## やること
1.DockerからEC2を作る
2.ssh接続してDockerが使えるかの確認
3.コマンド

##### 1.DockerからEC2を作る
まずはじめに`docker-machine`機能を使ってインスタンスを作りましょう。
自分のAWSアカウントのアクセスキーとシークレットキーを準備してください。また`AWS-Cli`で`configure`の設定が済んでいて、使うアカウントが`default`に設定されている場合、やらなくても済むかもしれません。

```
# 使うプロファイルの確認
$ cat ~/.aws/credentials

export AWS_ACCESS_KEY_ID=この中に自分のアクセスキー
export AWS_SECRET_ACCESS_KEY=この中に自分のシークレットキー

# うまくいっているかの確認は
$ aws configure list
```

一応以下のコマンドでもできるらしいですが、自分はうまくいかなかったので保証はしません。

```
$ export AWS_DEFAULT_PROFILE=任意のプロファイル名
$ aws configure list # ここでプロファイル名で適応されているか確認してください。
```

そうしたらインスタンスをたてていきます。

```
# Macで逆スラッシュは option + ¥ です
$ docker-machine create \
  --driver amazonec2 \
  --amazonec2-ami "" \
  --amazonec2-instance-type "t2.micro" \ # これはデフォルトの場合です
  --amazonec2-root-size "16" \ # docker-machineのデフォルトのサイズ
  --amazonec2-region 好みのregion \
  --amazonec2-vpc-id カスタムするVPCのID \ # デフォルトの人はいらないかもしれません
  --amazonec2-subnet-id カスタムするsubnetのID \ # 同上
  --amazonec2-security-group カスタムするセキュリティグループの名 \ # 同上
  インスタンス名
```
---
##### 追記

ここで固定IPを設定します。
Elastic　IPで`新しいアドレスの割り当て`を行なった後、作ったインスタンスに対して`アクション`から`関連付け`を行なってください。
そうすると`docker-machine ls`を行うとわかるのですが、IPが変わったことによってERRORが発生しています。ですので以下のコマンドで修正します。

```
$ docker-machine regenerate-certs ホスト名
```

`docker-machine ls`のコマンドで確認すると`URL`のところが`Elastic IP`で設定したものに変っていると思います。

---

続き
AWSの秘密鍵は作られているのですが、私はどこにあるかわからないので、わかる人がいたらコメントお願いします。なのでDockerでSSH接続していきます。そのためにまず環境変数を用意します。

```
$ docker-machien ls # これで使うホストの名前を確認
$ docker-machine env ホスト名
set -gx DOCKER_TLS_VERIFY "x";
set -gx DOCKER_HOST "tcp://xxxxxxxxxxxxx";
set -gx DOCKER_CERT_PATH "/Users/xxx/xxxxx";
set -gx DOCKER_MACHINE_NAME "ホスト名";
# Run this command to configure your shell:
# eval (docker-machine env ホスト名)
$ eval (docker-machine env ホスト名) # 出てきたものをコピペすれば良いと思います
```

`ACTIVE`のところが`*`になっていれば大丈夫です。

```
$ docker-machine ls
NAME         ACTIVE   DRIVER      STATE     URL                     SWARM   DOCKER     ERRORS
ホスト名　　   *        amazonec2   Running   tcp://xxxxxxxxxx:xxxx           v19.03.7
```

そしたら、以下の通りにしてください。

```
$ docker-machine inspect ホスト名
{
    "ConfigVersion": 3,
    "Driver": {
        "IPAddress": "ホストのIP",
        "MachineName": "ホスト名",
        "SSHUser": "ubuntu",
        "SSHPort": 22,
        "SSHKeyPath": "/Users/xxxx/.docker/machine/machines/docker-env/id_rsa",
        :
        :
}
# SSHKeyPathのとこをコピペして使ってます
$ chmod 400 /Users/xxxx/.docker/machine/machines/docker-env/id_rsa
$ chmod 700 ~/.ssh
$ vi ~/.ssh/config

# --- ホスト名 -------------
Host ホスト名
  HostName ホストのIP(Elastic IPを使う人はElasticの方のアドレスを使う)
  User ubuntu
  IdentityFile /Users/xxxx/.docker/machine/machines/docker-env/id_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes
# -------------------------

```

最後に以下のコマンドでSSH接続できれば、下準備は完了です。

##### 2.ssh接続してDockerが使えるかの確認

```
$ ssh ホスト名
```

dockerがインストールされてるか確認してみてください。

```
$ docker --version
Docker version 19.03.7, build xxxxxxx
$ docker-compose --version
The program 'docker-compose' is currently not installed. You can install it by typing:
sudo apt install docker-compose
```

`docker-compose`はインストールされていないですね。コマンドも出ているのでその通りにインストールしましょう。
最新バージョンは[ここ](https://docs.docker.com/compose/install/)を確認してください

```
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ export PATH=$PATH:/usr/local/bin/
$ source ~/.bashrc
```

最後にもうひと手間やっちゃいましょう。
今のままでは`docker`に関連するコマンドを打つたびに、先頭に`sudo`をつけなくてはなりません。
なのでそうしなくて済むように設定しましょう。

```
# dockerグループは作られていると思いますがもしなかったら打ち込んでください
sudo groupadd docker

# 現行ユーザをdockerグループに所属させる
sudo gpasswd -a $USER docker

# sudoもめんどくさいので追加しておく
sudo gpasswd -a $USER sudo

# dockerデーモンを再起動する (CentOS7の場合)
sudo systemctl restart docker

# 再ログインが必要なので一旦exitして入り直してください
exit
```

##### 3.コマンド

止める時は以下のコマンドを叩けば大丈夫です。あと環境変数は戻しておきましょう。

```
$ docker-machine stop ホスト名
# 強制で止める時はkill 始める時はstart 再起はrestart
$ docker-machine env --unset
set -e DOCKER_TLS_VERIFY;
set -e DOCKER_HOST;
set -e DOCKER_CERT_PATH;
set -e DOCKER_MACHINE_NAME;
# Run this command to configure your shell:
# eval (docker-machine env --unset)
$ eval (docker-machine env --unset)
```

### おわりに
SSH接続ができると色々と便利ですね。

### 参考
[MacのTerminalで「 ssh 接続名」で SSH 接続](https://qiita.com/HonwakaDeveloper/items/d31e5c19751644129efc)
[docker-machineコマンド](https://qiita.com/maemori/items/e7318b088b9e4bf22310)
[Dockerコマンドをsudoなしで実行する方法
](https://qiita.com/DQNEO/items/da5df074c48b012152ee)[Ubuntu18.04.1でDockerとdocker-composeをインストールする方法](https://awesome-linus.com/2019/03/22/ubuntu-docker-docker-compose-install/#toc_id_6)