おおくまねこ

職業プログラマーです。興味のある話題を書いています。

AWS EC2 インスタンス上で tcp 接続できる Docker を構築する

はじめに

リモートのサーバー上で起動する Docker にローカル環境のIDEなどから接続できる環境が欲しく、

AWS ec2 インスタンス上で作ってしまおうというのが事の発端です。

正確には、リモートで接続できる環境を作るためのIDEからの接続確認できる環境をつくりたかったのが、AWSを使った理由です。

 

普段はPCのローカル上に、Docker for Windows、Docker for Mac などの上で Docker コンテナを起動させて、

その中でコードの開発とか、動作環境の構築をしているのですが、

ローカルでDocker 使えないケースとか、共有のDocker動作環境が必要というニーズが色々あって発生してしまいました。

 

他の Linux サーバーやWindows, Mac PC があればそちらを使った方がいいのかもしれないのですが、

自分の身近にはなかったので、「じゃあAWSでいいかな」というのが採用理由です。

 

本当は「 IDEIntelliJ)から ec2 上の Docker に接続するまで」とか、「VScode から接続する方法」まで書こうかと思ったのですが、

一旦接続先のコンテナ環境つくるまででひとつにしておこうかと思ったので、

EC2 上での Docker 環境の構築までになっております。

 

やったこと

やったことを書いていくのですが、

一部中身が薄いので、(特にすでに作成済みのサービス設定など)

後日追記できればしていこうと思います。

AWS のアカウントについて

自分の場合はアカウントはすでに持ってました。

アカウント自体はずいぶん前に作ってしまっていたので、手順の記憶がないのですが、

前職の中小企業で作った時も自分用に作った時も公式を参考にした記憶があります。

 

AWS アカウント作成の流れ | AWS

 

EC2 インスタンスの作成

EC2インスタンスを作成・起動します。

Docker サービスを動かすために使います。

 

作成画面へ

AWSマネジメントコンソール」画面から、

「ソリューションの構築」にある「仮想マシンの起動」を選択します。

 

OS の選択

EC2を起動するときに使うOSを選択します。

今回は Amazon Linux でいいんじゃ?という感じなので Amazon Linux2 の x86 を選択します。

 

インスタンスタイプの選択

インスタンスの性能などが決まる、インスタンスタイプの選択をします。

無料利用枠の t2.micro 使いたかったので、それを選んでいます。

 

選択した状態で「次のステップ:インスタンスの詳細の設定」ボタンを押して、次にすすみんでいきます。

 

インスタンスの詳細の設定~タグの追加まで

「次のステップ:インスタンスの詳細の設定」を押すと、インスタンスの詳細設定、ストレージの設定、およびタグの設定が待っていますが、

一旦ここはカスタマイズ不要なので、「次のステップ」を押して進んでいきます。

ステップ6 の セキュリティグループの設定まで進みます。

 

セキュリティグループの設定

セキュリティグループグループを変更します。

なぜかというと、セキュリティグループで通信可能なポートや接続元のIP・ポートを指定できるのですが、

これで必要な設定がされていないと、後で接続する際に通信レベルで弾かれてしまうからです。

 

今回用の設定がある場合は「セキュリティグループの割り当て」で「既存のセキュリティグループを選択する」を使っても大丈夫です。

が、こんな変な設定を持っていることはないでしょうから、作る場合を想定して書いています。

今回作った設定で作った内容と説明は以下になります。

  • カスタムTCPルールでポート2375 を許可
    Docker の tcp 接続用のポートです。
  • HTTP
    あとでHTTPサーバーとしてのDockerを動かす想定であればあったほうがいい?
    不要だったら無くてもいいです
  • HTTPS
    あとでHTTPSサーバーとしてのDockerを動かす想定であればあったほうがいい?
    不要だったら無くてもいいです

※接続元のIPなどは、範囲が限定できるなら絞った方が、余計なリクエストを受けなくていいので設定が必要です。自分はいつも使ってないときは止めてるのと、動作確認主体だったのでポート全開放してますが、やらない方が絶対にいいです。

 

これができたら「確認と作成」を押して、確認画面へ

 

インスタンス作成の確認

いままで設定したものが確認画面に表示されます。

問題なかったら「起動」を押してください。

 

キーペアの選択

EC2インスタンスへの SSH 接続時に使用する認証鍵ペアを、どれを使うか選択します。

すでに持っているのであれば、既存のキーペアを使うで良いと思います。

キーペアをまだ作ってないとか、認証鍵を無くした()という場合は、「新しいキーペアの作成」から認証鍵を取得します。

適当なキーペアを決めたら、「キーペアのダウンロード」を選択して、「<キーペア名>.pem」をダウンロードしてPCの安全な場所に保存してください。

 

EC2インスタンスへの接続確認

つくったEC2インスタンスSSH接続します。

 

SSHクライアントの準備

SSHログインするためのSSHクライアントを準備しましょう。

MacとかLinux だと ssh コマンドでもいいと思います。

作った時は WIndows から接続する必要があったので、TeraTermをインストールして使いました。

TeraTermを選んだ理由は、pem 形式のファイルをそのまま使えるからです(他のソフトだと鍵ファイルの形式を変換する必要があるものがあるため)。

 

接続先情報の確認

接続先のIP、またはHost名を確認しにいきましょう

AWSのコンソールにもどりまして、「サービス」の中からEC2を選ぶか、

もしかしたら「最近アクセスしたサービス」の中にEC2があるかもしれないので、

それを選択します。

移動先のページから、「インスタンス(実行中)」を選んで、インスタンス確認画面に移動します。

 

そうすると、さきほど作ったインスタンスがあるので、以下の情報を確認します。

  • パブリック IPv4 DNS
  • パブリック IPv4 アドレス

起動時にAWS側で自動でグローバルIPと、それに関連づくドメイン名をつけてくれます。

このどちらかで接続できるようになるので確認し、後から使えるようにメモなどをしておきます。

(どちらでもつながりますが、DNS名の方を後ほど使います)

 

接続

SSH接続します。

 

WindowsTeraTerm を使う場合は、TeraTerm起動して、

ファイル -> 新しい接続 を選択、

ホストにインスタンスDNS名をいれて、サービスはSSHを選択し、OKをボタンをクリックします。

 

SSH認証ダイアログ」で以下設定

  • ユーザー名:ec2-user
  • パスワード:(空のまま)
  • 認証方式:「RSA/DSA ...」を選択し、右にある「...」を押して秘密鍵を選択。
    秘密鍵は先ほどダウンロードしたキーペアの pem ファイルを選択します。

MacLinux の場合は、~/.ssh/config に以下の設定を書いて、SSHコマンドを実行すればつながるはず。

 

Host <EC2 instance host name>
User ec2-user
IdentityFile <path/to/save/directory>/key_pear.pem

 ※Hostの値や、IdentityFile のパス名は環境に応じて変更してください。

 

Dockerの設定

EC2インスタンス上で、Dockerを動作させるための準備を進めていきます。

Docker のインストール

EC2条に Docker をインストールします。

インストールするには、(Amazon Linux の場合は)以下のコマンドから

sudo amazon-linux-extras install docker

 

外部からの Docker 接続用の設定

リモートで Docker コンテナに接続したり、Dockerを起動させるため、

Docker動作用の TCP ポートを開放します。

 

手順は以下を参考にしました。

matsuand.github.io

 

主に「daemon.json」の設定を変更する方法、「service 設定を書き換える」方法があると思うのですが、

service 設定を書き換える方法を選択しました。

以下のコマンドから、docker の service 設定を編集、

nano を使って設定を後述の用に追記します。

 

sudo systemctl edit docker.service

 

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://<自身のIPアドレス>:2375

 

設定変更が完了したら、設定の読み込みを実行し、service を再起動します。

sudo systemctl daemon-reload

sudo systemctl restart docker.service

 

EC2インスタンスの使用ポートを確認後、設定した 2375 が解放されているか確認します。

解放されていれば設定は完了です。

 

最後に

Dockerの起動する EC2 インスタンスの作成が完了しました。

後のIDEなどからの接続方法や、追記はまたのちほどします。