tjinjin's blog

インフラ要素多めの個人メモ

boot2docker上のコンテナにIP指定でログインする

他の作業をやっていたときにふと思い立ちうまく行ったのでメモしておきます。

MacOSX -> boot2docker -> docker containerという構成で作業しているわけですが、今まではDocker起動時にポートをフォワーディングして起動させ、Macからアクセスする際にはIPとポートを指定してログインしていました。

$ docker run -d -p 40022:22 --name test krossblack777/dockerhub-test
$ cat ~/.ssh/config 
Host ci
  HostName 192.168.59.103
  User docker
  Port 40022
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile ~/.ssh/id_rsa.docker
  IdentitiesOnly yes
  LogLevel FATAL
$ ssh ci
Last login: Tue Feb 24 14:36:00 2015 from 192.168.59.3 # 192.168.59.3経由でアクセス
[docker@7563e5769c9b ~]$ 

要はMacから直接コンテナのIP指定ができなかったので、boot2docker上のポートに対しアクセスして、ポートフォワーディングさせてコンテナにアクセスしていたわけです。正直不便だなと思っていたわけですが、多段SSHの設定をすることで回避できるみたいです。

$ cat ~/.ssh/config
Host boot2docker
  User docker
  HostName 192.168.59.103
  IdentityFile ~/.ssh/id_boot2docker

Host 172.17.0.*
  User docker
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile ~/.ssh/id_rsa.docker
  IdentitiesOnly yes
  LogLevel FATAL
  ProxyCommand ssh -CW %h:%p boot2docker

boot2dockerというのが踏み台サーバですね。次の172から始まるIPはDockerのコンテナです。複数書くのが面倒なので*にしています。この中でもProxyCommandがミソです。実際にアクセスしてみると

$ ssh 172.17.0.8
Last login: Tue Feb 24 14:14:47 2015 from 172.17.42.1 # 172.17.42.1経由でアクセス
[docker@0861c771aebf ~]$

という形でさっきとは別経路からアクセスできていますね。これでMacからコンテナに対しAnsible実行ができるようになりました。

2015/02/27追記

ルーティングテーブルをいじればssh以外もIP指定できるようになるみたいです。

docker の VM に向けてルーティング追加すればポートフォワード要らないってのにようやく気がついたメモ - Qiita

参考

多段SSHの設定を.ssh/configにまとめる - Qiita