概要
nsenter
かdocker-enter
コマンドを使う事で、コンテナ(namespace)にSSHを使わず入ることができまる。ここでは、セットアップの仕方と使い方を紹介。
課題
Dockerfile 等でENTRYPOINTをデーモンに指定すると、サーバの操作ができず、SSHログインすることが出来ない。CentOS6 の Docker コンテナであれば sshd を起動させておけるが、CentOS7 では環境によって systemd で sshd を起動させることが出来ないだけでなく、本来のコンテナの使い方としては推奨されていない。
また、docker attach
を使う場合は Ctrl+P
キーが無効のため、emacs等のキーバインドに支障がでる。
nsenter
nsenterとは?
Dockerで作った名前空間(ネームペース;namespace)に入るためのコマンドライン・ツール。nsenter の由来は「enter
into n
ames
paces」=「ネームスペースに入る」。
セットアップするには?
パッケージ 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-enter
はnsenter
のラッパーであり、次の内容と同じ処理。
$ PID=$(docker inspect --format {{.State.Pid}} <コンテナ名かID>)
$ nsenter --target $PID --mount --uts --ipc --net --pid