経緯
開発環境としてDockerコンテナを使いたいが、コンテナ内のファイルをIDEで管理したいという場合、dockerのvolume機能 + VMのファイル共有機能を使ってローカルから操作できるようにする方法と、sshfsでdocker内のディレクトリをローカルにマウントして使う方法が考えられる。
前者は後者より簡潔に実現できるという利点があるが、dockerコンテナ「が」他のファイルをマウントすることになるので、パーミッションの問題等がつきまとう。
後者はsshdを立ち上げるのが面倒、かついくつかの問題が発生するが、dockerコンテナ内のファイル「を」ローカルにマウントするため、前者の問題が発生しない(と思うけどどうでしょうか)。
今回は前者の方法を行う。
やり方
boot2dockerを使うという前提で話を進める。Vagrantの場合でもだいたい同じだと思う。
ローカル -> VMのポートフォワーディングの設定
dockerコンテナに対してsshで接続できるようにするため、予めローカルの特定のポートをdockerコンテナの特定のポートに対して転送するようにしておく。
$ # VBoxManage controlvm "boot2docker-vm" natpf1 delete ssh 既存の設定がある場合、下のコマンドで上書きすることはできないので、一度削除する
$ VBoxManage controlvm "boot2docker-vm" natpf1 "ssh,tcp,127.0.0.1,8022,,49153" # ポートフォワーディングの設定。'ssh'は任意の文字列でok
これでHostの8022がVMの49153に転送される。
コンテナのビルド
次に、dockerに接続してsshdの入ったコンテナをビルドする。DockerfileはSven Dowideitさん作の以下のものを使うと簡単。(参照元)
# sshd
#
# VERSION 0.0.2
FROM ubuntu:14.04
MAINTAINER Sven Dowideit <SvenDowideit@docker.com>
RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:screencast' | chpasswd
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
boot2docker ssh
でvmに入り、上記のDockerfileを用意したらDockerコンテナを起動する。
docker build -t develop .
docker run -d -P develop
これで恐らく、VMの49153がdockerコンテナの22にポートフォワードされる(49153とは限らんけど、とりあえずそういう前提で)。
sshfsでマウントする
これでDockerコンテナにsshを繋いだり、
ssh root@localhost -p 8022 # pass: screencast
sshfsでディレクトリをマウントすることができるようになる。
sshfs root@localhost:/ ./container -p 8022