Docker: boot2docker VM の中で nsinit を実行する方法
2014-07-02 追記:
nsinit ではなく nsenter を使えば、同じことをよりシンプルに実現できました。参考: docker - nsinit が上手く行かなくて困っていたら nsenter があまりにもあっさりだった件 - Qiita
環境
- OS: Mac OS X 10.9 (Mavericks) (boot2docker が動作すれば他の環境でも手順は同じはず)
- boot2docker: v1.0.1
事前準備
- VirtualBox のインストール
- boot2docker 最新版のインストール (OS X インストーラ の利用を推奨: 詳細手順)
- インストール前に VirtualBox の全ての VM、GUI を停止すること
- 既に boot2docker VM が存在している場合は以下のコマンドを実行 (元の環境は削除される)
$ boot2docker halt $ boot2docker delete $ boot2docker download
作業手順
boot2docker VM の作成・ログイン
Mac$ boot2docker init Mac$ boot2docker up Mac$ boot2docker ssh
GCC + golang コンパイル環境の準備
docker@boot2docker:~$ tce-load -wil compiletc go
nsinit のビルド
docker@boot2docker:~$ sudo GOPATH=$HOME/go go get github.com/docker/libcontainer/nsinit docker@boot2docker:~$ sudo cp -f $HOME/go/bin/nsinit /usr/local/bin/
これで /usr/local/bin/nsinit が作成される。
2014-07-02 追記
nsinit リポジトリの状況によって、ここでハマるケースがいくつか報告されています。やはり nsenter の利用をお勧めします。
コンテナアタッチ用 便利シェルの作成
以下の内容で /usr/local/bin/docker-attach というシェルを書き、実行権限を付ける。
#!/bin/sh [[ -n "$1" ]] || { echo "Usage: `basename $0` <partial container ID or name>"; exit 0 ; } FULL_ID=$(docker inspect --format='{{.Id}}' $1) sudo /bin/sh -c "cd /var/lib/docker/execdriver/native/$FULL_ID && nsinit exec bash"
コマンドの永続化
このままだと、nsinit, docker-attach は boot2docker VM を停止すれば消滅してしまう。
永続化されるディスクの /var/lib/boot2docker の中にコマンドを移動し、bootlocal.sh を使って起動時に再配備されるようにする。
docker@boot2docker:~$ sudo mkdir /var/lib/boot2docker/bin docker@boot2docker:~$ sudo mv -i /usr/local/bin/nsinit /usr/local/bin/docker-attach /var/lib/boot2docker/bin/
/var/lib/boot2docker/bootlocal.sh を以下の内容で作成し、実行権限を付与。
#!/bin/sh ln -s /var/lib/boot2docker/bin/nsinit /usr/local/bin/nsinit ln -s /var/lib/boot2docker/bin/docker-attach /usr/local/bin/docker-attach
シェルを実行してリンクを張り直す。
docker@boot2docker:~$ sudo /var/lib/boot2docker/bootlocal.sh
稼働中の Docker コンテナの中に入る例
適当なコンテナの起動
任意のコンテナをデーモンモードで起動し、コンテナIDを確認
docker@boot2docker:~$ docker run -d -t centos /bin/sleep 1000 af1ebb57b1cbd0c1f3e02e3f164deb30d2b2ead95f5291545c757c5d33ac6ef7 docker@boot2docker:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES af1ebb57b1cb centos:latest /bin/sleep 1000 3 seconds ago Up 3 seconds jolly_poincare
コンテナにアタッチして bash で操作
docker@boot2docker:~$ docker-attach af1e bash-4.1# cat /etc/redhat-release CentOS release 6.5 (Final) bash-4.1# exit exit
sshd なしで、稼働中のコンテナで bash を扱うことができた。
ワンライナーでセットアップする
コピペも面倒、という人向け(自分も含む)にセットアップ用のシェルを書いた。
実行例
docker@boot2docker:~$ curl https://raw.githubusercontent.com/mogproject/docker-attach/scripts-for-nsinit/setup_boot2docker.sh |/bin/sh % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 2552 100 2552 0 0 7973 0 --:--:-- --:--:-- --:--:-- 9522 2014-06-24 15:59:05 [INFO] Script started. 2014-06-24 15:59:05 [INFO] Creating directory /var/lib/boot2docker/bin 2014-06-24 15:59:05 [INFO] Installing compilers gcc.tcz.dep OK gcc_libs-dev.tcz.dep OK cloog.tcz.dep OK (中略) Downloading: compiletc.tcz Connecting to repo.tinycorelinux.net (89.22.99.37:80) compiletc.tcz 100% |*********************************************************************************************| 4096 0:00:00 ETA compiletc.tcz: OK Downloading: go.tcz Connecting to repo.tinycorelinux.net (89.22.99.37:80) go.tcz 100% |*********************************************************************************************| 36288k 0:00:00 ETA go.tcz: OK 2014-06-24 16:02:15 [INFO] Building /var/lib/boot2docker/bin/nsinit 2014-06-24 16:03:19 [INFO] Downloading /var/lib/boot2docker/bin/docker-attach 2014-06-24 16:03:19 [INFO] Downloading /var/lib/boot2docker/bootlocal.sh 2014-06-24 16:03:20 [INFO] Linking commands in /usr/local/bin 2014-06-24 16:03:20 [INFO] Script ended successfully.