Less is Best

rubyが好き。技術の話とスタートアップに興味があります。

MacからSSH接続可能なDockerコンテナを作る。

MacからVMを介してダイレクトにSSH接続可能なDockerコンテナを作るDockerfileを作ってみました。プラス、それを便利に管理出来るツールProxyDockerも作ってみました。

今回作るコンテナは

MAC -> Vagrant -> Docker Container

sshを2段行なわなければいけなかった問題を

MAC -> (VagrantはProxyとして無視) -> Docker Container

として、1回ssh接続をするだけでDockerContainerに接続可能にするような設定としております。 sshのProxyCommandを利用して作ってみました。

ブログ記事を色々と参照させて頂きながら作ったのですが、そのままのレシピだと動かないものが多かったので、1から作れるように手順を書いておきたいと思います。

ソースはここ(セキュリティ的に危ないものが抜けてるので完全ではありません。がこちらで解説します。) github.com:yss44/docker_ssh

まずは、レシピをば。 Dockerfile

# SSH-DOCKER
#
# VERSION       1

FROM centos

MAINTAINER yoshiso

RUN yum -y update

#Dev tools for all Docker
RUN yum -y install git vim

RUN yum -y install passwd openssh openssh-server openssh-clients sudo


# create user

RUN useradd yoshiso
RUN passwd -f -u yoshiso
RUN mkdir -p /home/yoshiso/.ssh;chown yoshiso /home/yoshiso/.ssh; chmod 700 /home/yoshiso/.ssh
ADD ./authorized_keys /home/yoshiso/.ssh/authorized_keys
RUN chown yoshiso /home/yoshiso/.ssh/authorized_keys;chmod 600 /home/yoshiso/.ssh/authorized_keys

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

# setup sshd
ADD ./sshd_config /etc/ssh/sshd_config
RUN /etc/init.d/sshd start;/etc/init.d/sshd stop

# expose for sshd
EXPOSE 2222

CMD ["/usr/sbin/sshd","-D"]

はい、このレシピを元に作っていきたいと思います。(yoshisoの部分は自分の好きな名前に変えてくださいね)

手順2

作業用ディレクトリを切ります。

mkdir ~/docker_ssh
cd ~/docker_ssh

手順2

コンテナにカギ認証sshするためのカギを発行します。参考 今回の戦略として、すべてのコンテナに同一のガキでアクセスする戦略を取りたいと思います。理由としては、2つあります。1つはローカルですし、セキュリティそんなに気にしなくても良いこと。2つ目はいちいちコンテナ立ち上げる度にキーを発行しているのはめちゃくちゃ面倒くさく、コンテナ作って楽しようとしているのに反すること。

mkdir ~/.ssh/docker
ssh-keygen -t rsa -C "メールアドレス"

キーの保存先を指定する

Enter file in which to save the key (/Users/your_user_directory/.ssh/id_rsa):/Users/your_user_directory/.ssh/docker/docker_rsa

パスワードは無しでエンター(セキュリティ最悪ですが、ローカルなので省略.本番環境の際は要設定)。これで、以下のようにキーが生成されたはずです。

プライベートキー :~/.ssh/docker/docker_rsa パブリックキー  :~/.ssh/docker/docker_rsa.pub

ここで、公開鍵をDockerコンテナに入れておきたいので、後で移動させるために作業用ディレクトリの中に移しておきます。(これは完全にBad Practiceですが、VM側で確認するため、秘密鍵も転送しておいても良いかもしれません。)

cp ~/.ssh/docker/docker_rsa.pub ~/docker_ssh/authorized_keys
cp ~/ssh/docker/docker_rsa ~/docker_ssh/docker_rsa

手順3

sshdの設定を自動で行なうために、設定ファイルを作成しておく必要があります。 今回は自分が作成したものがあるので、こちらを使ってみましょう。

vim ~/docker_ssh/sshd_config
Port 2222
Protocol 2
SyslogFacility AUTHPRIV
PermitRootLogin no
PasswordAuthentication no

# Change to no to disable s/key passwords
ChallengeResponseAuthentication no

# GSSAPI options
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes

#set this to 'yes' to enable PAM authentication
UsePAM no

# Accept locale-related environment variables
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS

X11Forwarding yes

とりあえず、Portの2222番でssh接続を受け付けるようにします。 これで事前準備完了。あとは、このファイルをVagrantの共有フォルダ機能を使用してVMに転送しておきます。

手順4

Vagrant側に行き、作成したsshコンテナをビルドします。

vagrant ssh
cd /vagrant/docker_ssh
docker build -t "yourname/docker_sshd" .

これで、ssh接続可能なコンテナが生成されたはずです。

手順5

作成したコンテナの確認をして行きます。 まずはコンテナの起動

docker run -d -p 2222 yourname/docker_sshd

コンテナのIPアドレスを確認して行きます。 docker ps #IDを確認 docker inspect -format="{{ .NetworkSettings.IPAddress }}" ID > 172.17.0.1

でコンテナのipアドレスを取得します 試しにVM側からコンテナへssh接続を試みてみます。

ssh -p 2222 -i /vagrant/docker_ssh/docker_rsa yoshiso@172.17.0.1

これで、接続が確認されるはずです。 続いてMacから直接コンテナにssh接続して行きます。

ssh -oProxyCommand='ssh -t -t -W %h:%p -i ~/.vagrant.d/insecure_private_key vagrant@192.168.33.10'\
    -t -t -i ~/.ssh/docker/docker_rsa -p 2222 yoshiso@172.17.0.1

はい、これでMacから直接ssh接続可能なコンテナを生成することが出来ましたね! コンテナを生成して、破棄してを繰り返すのがもっともっと楽しくなりますね!

…とこのコマンドめちゃくちゃ長いですよね。。。 sshconfigに買いても良いんですが、コンテナのIPは動的に変化して行くため、管理がめちゃくちゃ大変になると思います。そこで、MacからDockerコンテナに直接ssh接続するためのツールProxyDockerを作りました!

使い方は詳しくは後で記事を書こうかと思っていますが、軽く説明。proxydocker setupを行なって、VMの設定をしておきます。あとはVagrantを起動している状態でMacから、

proxydocker ssh <CONTAINER_IP> <CONTAINER_PORT>

とすれば、VMの部分を自動解決してコンテナにssh接続が可能になります!

proxydocker remote list

で、コンテナのIP一覧を取得することも可能です。こちらはまだ開発中ですが、もっと便利にして行きたいなと考え中です。

インストール方法はProxyDockerに書いてありますので、そちらを参考にインストールしてみてください!