7.02.2014

Docker: How to Dive Into a Container on the boot2docker VM, Improved

Docker: boot2docker VM で起動中のコンテナの中に入ってシェルを立ち上げる方法, 改良版

 

boot2docker 上で起動したコンテナに入ってシェル操作を行う方法。

nsinit を使う よりも、nsenter の方が少ない手順とコストで実現できた。

 

環境

  • OS: Mac OS X 10.9 (Mavericks)
  • boot2docker: v1.0.1

 

リポジトリ

 

事前準備

  • VirtualBox のインストール
  • boot2docker 最新版のインストール (OS X インストーラ の利用を推奨: 詳細手順)
    • インストール前に VirtualBox の全ての VM、GUI を停止すること
    • 既に boot2docker VM が存在している場合は以下のコマンドを実行 (元の環境は削除される)
      $ boot2docker halt
      $ boot2docker delete
      $ boot2docker download

 

セットアップ

 

1. boot2docker VM の作成・ログイン
Mac$ boot2docker init
Mac$ boot2docker up
Mac$ boot2docker ssh

以下の手順は boot2docker VM 上で実行。

 

2. util-linux 拡張機能のダウンロード
docker@boot2docker:~$ tce-load -w util-linux
ncurses.tcz.dep OK
Downloading: udev-lib.tcz
Connecting to repo.tinycorelinux.net (89.22.99.37:80)
udev-lib.tcz         100% |*********************************************************************************************| 45056   0:00:00 ETA
udev-lib.tcz: OK
Downloading: ncurses-common.tcz
Connecting to repo.tinycorelinux.net (89.22.99.37:80)
ncurses-common.tcz   100% |*********************************************************************************************| 12288   0:00:00 ETA
ncurses-common.tcz: OK
Downloading: ncurses.tcz
Connecting to repo.tinycorelinux.net (89.22.99.37:80)
ncurses.tcz          100% |*********************************************************************************************|   148k  0:00:00 ETA
ncurses.tcz: OK
Downloading: util-linux.tcz
Connecting to repo.tinycorelinux.net (89.22.99.37:80)
util-linux.tcz       100% |*********************************************************************************************|   992k  0:00:00 ETA
util-linux.tcz: OK

/tmp/tce/optional (/mnt/sda1/tmp/tce/optional) 配下にファイルがダウンロードされる。

 

3. util-linux 拡張機能 ファイルの永続化

先ほどダウンロードしたファイル群のある optional ディレクトリごと、永続ディスクである /var/lib/boot2docker 配下に移動する。

docker@boot2docker:~$ sudo mv /tmp/tce/optional /var/lib/boot2docker/

 

4. docker-attach スクリプトのダウンロード

コンテナにアタッチするための便利シェル、docker-attach を /var/lib/boot2docker/bin 配下にダウンロードする。

docker@boot2docker:~$ sudo mkdir -p /var/lib/boot2docker/bin
docker@boot2docker:~$ sudo curl -o /var/lib/boot2docker/bin/docker-attach \
https://raw.githubusercontent.com/mogproject/docker-attach/master/docker-attach
docker@boot2docker:~$ sudo chmod +x /var/lib/boot2docker/bin/docker-attach
  • スクリプトの中身は、コマンドライン引数として渡されたコンテナIDからプロセスIDを検索して
    そこにオプション付きの nsenter を実行しているのが主処理。
    CONTAINER_ID=$1
    PID=$(docker inspect --format '{{.State.Pid}}' $CONTAINER_ID)
    sudo nsenter --mount --uts --ipc --net --pid --target $PID

 

5. bootlocal.sh スクリプトのダウンロードと実行

boot2docker VM は起動時に /var/lib/boot2docker/bootlocal.sh が存在すれば、それを実行する。

このシェルの中で util-linux のインストールとコマンドのリンクを行い、boot2docker 再起動後も元の状態を復元できるようにしている。

docker@boot2docker:~$ sudo curl -o /var/lib/boot2docker/bootlocal.sh \
https://raw.githubusercontent.com/mogproject/docker-attach/master/bootlocal.sh
docker@boot2docker:~$ sudo chmod +x /var/lib/boot2docker/bootlocal.sh
docker@boot2docker:~$ sudo /var/lib/boot2docker/bootlocal.sh
boot2docker: 1.0.1
             master : cad5ece - Fri Jun 20 02:03:40 UTC 2014
udev-lib.tcz: OK
ncurses-common.tcz: OK
ncurses.tcz: OK
util-linux.tcz: OK

 

実行例

  • 適当なコンテナを起動し、コンテナIDを確認 (boot2docker上でも、Macからでも可)
    $ docker run -d -t centos /bin/sleep 1000
    $ docker run -d -t centos /bin/sleep 1000
    $ docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    f8c149734c7a        centos:latest       /bin/sleep 1000     5 minutes ago       Up 2 minutes                            naughty_sinoussi
    701810969c35        centos:latest       /bin/sleep 1000     5 minutes ago       Up 2 minutes                            sleepy_bell
    
  • boot2docker上で docker-attach を実行してコンテナにアタッチ
    docker@boot2docker:~$ docker-attach 701810969c35
    root@701810969c35:/# cat /etc/redhat-release
    CentOS release 6.5 (Final)
    root@701810969c35:/# exit
    logout
    docker@boot2docker:~$ 
    
  • Macからも、同じ docker-attach スクリプトを使って直接アタッチ可能
    Mac$ sudo curl -o /usr/local/bin/docker-attach \
    https://raw.githubusercontent.com/mogproject/docker-attach/master/docker-attach
    Mac$ sudo chmod +x /usr/local/bin/docker-attach
    Mac$ docker-attach f8c149734c7a
    -sh-4.1# cat /etc/redhat-release
    CentOS release 6.5 (Final)
    -sh-4.1# exit
    logout
    Mac$
    

 

ワンライナーでのセットアップ

セットアップ用のシェルも作った。

docker-attach/setup_boot2docker.sh at master · mogproject/docker-attach

  • boot2docker上で
    $ curl https://raw.githubusercontent.com/mogproject/docker-attach/master/setup_boot2docker.sh | /bin/sh
    
  • または、Mac上で
    $ boot2docker ssh '/bin/sh -c "curl https://raw.githubusercontent.com/mogproject/docker-attach/master/setup_boot2docker.sh | /bin/sh"'
    

 

References

0 件のコメント:

コメントを投稿