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に書いてありますので、そちらを参考にインストールしてみてください!