nsenter・docker-enterでコンテナに入る方法

  • 40
    Like
  • 0
    Comment
More than 1 year has passed since last update.

概要

nsenterdocker-enterコマンドを使う事で、コンテナ(namespace)にSSHを使わず入ることができまる。ここでは、セットアップの仕方と使い方を紹介。

課題

Dockerfile 等でENTRYPOINTをデーモンに指定すると、サーバの操作ができず、SSHログインすることが出来ない。CentOS6 の Docker コンテナであれば sshd を起動させておけるが、CentOS7 では環境によって systemd で sshd を起動させることが出来ないだけでなく、本来のコンテナの使い方としては推奨されていない
また、docker attach を使う場合は Ctrl+Pキーが無効のため、emacs等のキーバインドに支障がでる。

nsenter

nsenterとは?

Dockerで作った名前空間(ネームペース;namespace)に入るためのコマンドライン・ツール。nsenter の由来は「enter into namespaces」=「ネームスペースに入る」。

セットアップするには?

パッケージ util-linux のバージョン 2.23 以降に同梱(RHEL7等)。

パッケージが提供されない場合、docker を使ってセットアップする方法が簡単。

docker run --rm -v /usr/local/bin:/target jpetazzo/nsenter

/usr/local/bin/ 以下にファイルが置かれる。

コンテナに入るには?

docker ps等でコンテナIDを確認するか、あるいはコンテナ名を引数にする。

書式:docker-enter <コンテナIDかコンテナ名>

例:daemon モードで実行する

# docker ps -l
CONTAINER ID        IMAGE                    COMMAND                CREATED             STATUS              PORTS               NAMES
88b0b089b522        zembutsu/centos6:httpd   /usr/sbin/httpd -D F   3 minutes ago       Up 3 minutes        80/tcp              focused_nobel

# docker-enter 88b0b089b522
bash-4.1# pwd ←ここからコンテナ操作
/
bash-4.1# exit ←終了
exit

なお、docker-enternsenterのラッパーであり、次の内容と同じ処理。

$ PID=$(docker inspect --format {{.State.Pid}} <コンテナ名かID>)
$ nsenter --target $PID --mount --uts --ipc --net --pid

参考