Featured image of post DockerのEC2コンテナにSSH接続する方法【ローカル環境】

DockerのEC2コンテナにSSH接続する方法【ローカル環境】

ローカルのDockerで動かしているAmazon LinuxのEC2コンテナにSSH接続できるようにする手順。SSH認証鍵の準備、sudoやcurlなどを入れるDockerfileの作成、イメージのビルド、コンテナ起動、SSH接続と確認まで♪

1572文字

EC2インスタンスを使いやすくセットアップ

以前、AWS公式EC2インスタンスのDockerイメージを利用して、ローカルマシンにコンテナを起動する手順を紹介しました。

関連記事 【これは便利】EC2のDockerイメージを利用してローカルのDockerにEC2を構築しよう 2018/03/22 1043文字 約3分で読めます IT Amazon AWS Docker Mac

しかし、初期の構成だと最低限の情報しか含まれていないので、sudoコマンドcurlコマンドlessコマンドなどのよく使うコマンドがインストールされていない状態です。

command
bash-4.2# less /etc/passwd
bash: less: command not found

よりEC2インスタンスの環境に近づけるには、ある程度自分でモジュールを整えないと行けなそうですね。

なので、今回はDockerfileを作成し、最低限必要なモジュールをインストールし、かつSSH接続出来るようにするまでの手順を紹介致します。

手順

[adsense]

前提

Point
  • 公式EC2インスタンスのDockerイメージpull済み

参考

関連記事 Dockerfileに設定を記述して実行する方法 2018/01/22 1429文字 約3分で読めます IT Docker Mac パソコン プログラミング

Docker 初心者 | ssh で接続できるサーバーを立てる

Amazon LinuxのDockerコンテナを動かす

ディレクトリ構成

最終的には以下のようなディレクトリ構成になります。

tree
.
├── Dockerfile
├── authorized_keys
└── keys
    ├── id_rsa
    └── id_rsa.pub

SSH認証鍵の準備

まずは、SSH接続で利用する鍵を作成し、所定のディレクトリに配置します。
以下のコマンドを実行してください。

command
mkdir keys
ssh-keygen
cp keys/id_rsa.pub authorized_keys

Dockerfileの作成

前回はコマンドでAmazonLinuxを起動して確認したので、今回はDockerfileを作成して起動しましょう。

Dockerfileの要点としては、以下を定義します。

Point
  • 公式EC2インスタンスのDockerイメージを指定
  • yumのパフォーマンス改善(4~5行目)
  • yumのインストール(8~11行目)
  • ユーザーの作成(14~16行目)
  • sudo権限の付与(19行目)
  • SSHの設定(22~25行目)
  • sshdの設定設定(28~30行目)
  • sshdの起動(32行目)
  • ポートの解放(34行目)
  • コンテナの起動(35行目)

Dockerfile
FROM 137112412989.dkr.ecr.us-west-2.amazonaws.com/amazonlinux

# set yum repository mirror for jp
RUN yum -y install yum-plugin-fastestmirror
RUN sed -ri 's/#include_only=.nl,.de,.uk,.ie/include_only=.jp/g' /etc/yum/pluginconf.d/fastestmirror.conf

# install packages
RUN yum -y update
RUN yum -y install vim
RUN yum -y install passwd openssh openssh-server openssh-clients sudo iproute
RUN yum -y install wget curl

# create users
ENV USER {ユーザー名}
RUN useradd $USER
RUN passwd -f -u $USER

# setup sudoers
RUN echo "$USER ALL=(ALL) ALL" >> /etc/sudoers.d/$USER

# setup SSH
RUN mkdir -p /home/$USER/.ssh; chown $USER /home/$USER/.ssh; chmod 700 /home/$USER/.ssh
ADD authorized_keys /home/$USER/.ssh/authorized_keys
RUN chown $USER /home/$USER/.ssh/authorized_keys
RUN chmod 600 /home/$USER/.ssh/authorized_keys

# setup sshd config
RUN sed -ri 's/#PermitRootLogin yes/PermitRootLogin yes/g' /etc/ssh/sshd_config
RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config
RUN sed -ri 's/#UsePAM no/UsePAM no/g' /etc/ssh/sshd_config

RUN /etc/init.d/sshd start

EXPOSE 22
CMD ["/sbin/init"]

イメージのビルド

では、上記Dockerfileを使ってビルドをしましょう。
以下のコマンドを実行してください。

command
docker build -t docker/amzlinux .

最終的に以下のログが表示されればビルド成功です。

log
Successfully built 45e02ef350ef
Successfully tagged docker/amzlinux:latest

コンテナの起動

では、ビルドしたイメージを使ってコンテナを起動してみましょう。
以下のコマンドを実行してください。今回はローカルマシンの10000番ポートコンテナの22番ポートに繋げています。

command
docker run -d --name {コンテナ名} -p 10000:22 docker/amzlinux

SSH接続

コンテナの起動が完了したら、sshコマンドで接続してみましょう。
以下のコマンドで作成した秘密鍵を使って接続をしてみてください。

command
ssh -i keys/id_rsa {ユーザー名}@127.0.0.1 -p 10000

正常に接続されましたね。

各種コマンドの確認

では、最後にDockerfileでインストールしたモジュール(コマンド)を確認してみましょう。
今回はとりあえず初期状態では使えなかったsudoコマンドを確認してみます。
以下のコマンドを実行してください。

command
sudo su

以下のようなログが出れば正常にコマンドが実行出来ています。

log
[{ユーザー名}@xxxxxxxxx ~]$ sudo su

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

bash-4.2#

終わりに

これで本来のEC2インスタンスに近い状態の環境に設定することが出来ました。

SSH接続各種コマンドが使えることによって、よりリアルな検証操作を行うことが可能になりますので、是非皆さんも試していてください。