Docker コンテナに SSH サーバを立てるのをやめた話
今まではコンソールを使用したい場合に SSH サーバを supervisord
で起動したりするのですが、そうするとコンテナの数だけ SSH サーバを起動することになり、リソースが非常にもったいないです。(一番はポートの管理がめんどい)
そこで、 Docker ホスト上から直接シェルをコンテナ内に作成してコンソールを使用できるようにする方法をまとめます。
必要なコマンドのインストール
今回行う方法では、 nsenter
というコマンドを利用します。
nsenter
は util-linux
というパッケージに入っていますが、 apt-get
で取得できるものはバージョンが古いため nsenter
コマンドが入っていませんでした。
そこで、ソースから最新版をインストールするようにします。( ./configure
でパッケージが足りないとか言われたら、適当に入れます)
curl -LO https://www.kernel.org/pub/linux/utils/util-linux/v2.25/util-linux-2.25.tar.gz tar zxvf util-linux-2.25.tar.gz cd util-linux-2.25 ./configure make sudo make install
これで nsenter
がインストールされました。
nsenter -V nsenter from util-linux 2.25
試してみる
早速、インストールした nsenter
コマンドを試してみます。
まずは、起動しているコンテナのIDを確認します。
docker ps
確認したコンテナIDを nsenter
コマンドに指定します。
nsenter --mount --uts --ipc --net --pid --target <コンテナID>
root@<コンテナID>:/# ping www.google.co.jp PING www.google.co.jp (173.194.38.207) 56(84) bytes of data. 64 bytes from nrt13s01-in-f15.1e100.net (173.194.38.207): icmp_seq=1 ttl=127 time=26.6 ms 64 bytes from nrt13s01-in-f15.1e100.net (173.194.38.207): icmp_seq=2 ttl=127 time=22.2 ms 64 bytes from nrt13s01-in-f15.1e100.net (173.194.38.207): icmp_seq=3 ttl=127 time=24.8 ms
無事コンソールを利用できる状態になりました。
しかし、root権限では何かと問題があるかもしれないので、 Dockerfile
でユーザを作成している場合は、 su <ユーザ名>
しておきましょう。
手順のコマンド化
コンソールを利用できるようにはなりましたが、手順が煩雑です。(引数も多いですし)
そこで、以下のルーチンを ~/.bashrc
などに定義して簡略化しましょう。
docker_enter() { declare container_id=$1 if [ -z "$container_id" ]; then echo "usage: $0 <container_id>" >&2 return 1 fi sudo nsenter --mount --uts --ipc --net --pid --target $(docker inspect --format '{{.State.Pid}}' $container_id) } alias docker-enter='docker_enter'
これで、 docker-enter <コンテナID>
とするだけでコンソールが利用できるようになりました。
docker-enter <コンテナID> [sudo] password for <ユーザ>: root@<コンテナID>:/#
ねっ、簡単でしょ?