6.24.2014

Docker: How to Run 'nsinit' in the boot2docker VM

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 の利用をお勧めします。

参考: RHEL/CentOS 6で Docker に nsinit/nsenter する - Qiita

 

コンテナアタッチ用 便利シェルの作成

以下の内容で /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.

 

 

References

0 件のコメント:

コメントを投稿