のどあめ

ググってもなかなか出てこなかった情報を垂れ流すブログ。

Dockerでagent forwardingが有効な開発環境の構築 (OS X)

今まではVagrant + chef or ansibleで開発環境を構築していましたが、 docker runの軽快さに惚れてDockerに乗り換えを考えています。

今回はdocker-machineを使って、Mac上で動かす開発環境構築(ubuntu)を作りました。 agent forwardingを有効にする設定で意外とハマるポイントがあったので記事にしました。

環境構築要のDockerfileとchefはこちら。 github.com

注意事項

  • ホストはMac OSを前提としています。
  • Dockerとdocker-machineがインストールされていることを前提とします。

Dockerでchefを使う

特にハマるポイントはありませんでした。
今回は以下のページを参考にしました。

Dockerでagent forwarding

Dockerでagent forwardingを有効にするのは意外と手間がかかるようです。

大別すると以下の2つに別れるのですが、両方ともハマるポイントがありました。

  1. docker buildでagent forwarding
  2. docker runでagent forwarding

docker buildでagent forwarding

dockerのイメージ作成の途中で、ホスト側の鍵を使いたい場合があります。
しかし、docker runではやりようがある(後述)のですが、docker build時には難しいようです。 Dockerfileで鍵をCOPYすれば可能かも知れませんが、鍵をイメージに置くのは気が引けます。

参考ページ

これに関しては、個人的にdocker buildssh鍵を使いたい場面が、「設定ファイル等をgit cloneするときだけ」ということに着目して、 設定ファイルの入ったリポジトリをDockerfileを管理するリポジトリのsubmoduleとすることで対処しました。

Dockerfileでは以下のようにDockerfileを管理するリポジトリごと設定ファイルをイメージにCOPYしています。

COPY . /home/docker/.docker

docker_dev/Dockerfile at master · ykicisk/docker_dev · GitHub

buildするときはこんな感じ。

$ git clone --recursive git@github.com:ykicisk/docker_dev.git
$ cd docker_dev
$ docker build -t centos:dev .

dcoker runssh-gent forwarding

dockerコンテナ内でホストのssh鍵を使う方法は2つあります。

  1. $SSH_AUTH_SOCKをコンテナにマウントする
  2. コンテナでsshdを起動してssh -Aで接続する
1. $SSH_AUTH_SOCKをコンテナにマウントする

こちらは、docker-machineを使っている場合は、 一度docker-machine sshする必要があり面倒です。

さらに、一旦exitすると$SSH_AUTH_SOCKの値が変わってしまうため(?) agent forwardingが切れてしまうことがわかりました。

$ docker-machine ssh default -A
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.10.3, build master : 625117e - Thu Mar 10 22:09:02 UTC 2016
Docker version 1.10.3, build 20f81dd

$ docker run -it -v $SSH_AUTH_SOCK:/ssh-agent -e SSH_AUTH_SOCK=/ssh-agent centos:dev /bin/zsh

docker at <container id> in ~
$ ssh-add -l
# agent forwardingが有効

# ctl-p ctl-qで抜ける

$ docker attach <container id>

docker at <container id> in ~
$ ssh-add -l
# agent forwardingが無効

ということで、こちらは諦めました。

参考ページ

2. コンテナでsshdを起動してssh -Aで接続する

基本はdocker-machineでport forwardingすれば良いのですが、 docker-machineを動かすのにvirtual boxを使用しているので、 virtual box側でもport forwardingの設定をする必要があります。

f:id:ykicisk:20160410230953p:plain

また、最初はcentos7で開発環境を作ろうと思っていましたが、systemctlを動かすところでかなりハマりました。 centosにそこまでこだわりがあったわけではなかったので、開発環境をcentosからubuntuに変更しました。
※うまくやれば使えそうなので、こだわりがある人は頑張れば良いと思います。

参考ページ

最終的な使用感

sshをするたびに、ssh -p 2222みたいな指定をするのが面倒なので、 ~/.ssh/configを以下のように書いておきます。

Host docker
    HostName localhost
    User docker
    StrictHostKeyChecking no
    Port 2222

開発環境を作るときは以下のコマンドを打てばOKです。

$ docker build -t ubuntu:dev .
$ docker run -d -p 2222:22 ubuntu:dev
$ ssh docker

docker at <container id> in ~
$ ssh-add -l
# agent forwardingが有効

今回のまとめ

  • とりあえずDockerでagent forwardingできる開発環境を構築できた。
    • docker build時: git submoduleを使うことで問題を回避
    • docker run時: コンテナにsshする。port-forwarding設定は.ssh/configに隠蔽。
  • 最近環境構築だけで満足してしまうので、その先にも手をつけられるようにしたいです。