明日にはでっかい太陽が昇るかもしれません。

「覚悟」とは!! 暗闇の荒野に!!進むべき道を切り開く事だッ!

Docker コンテナに SSH サーバを立てるのをやめた話

今まではコンソールを使用したい場合に SSH サーバを supervisord で起動したりするのですが、そうするとコンテナの数だけ SSH サーバを起動することになり、リソースが非常にもったいないです。(一番はポートの管理がめんどい)

そこで、 Docker ホスト上から直接シェルをコンテナ内に作成してコンソールを使用できるようにする方法をまとめます。


必要なコマンドのインストール

今回行う方法では、 nsenter というコマンドを利用します。

nsenterutil-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>:/#

ねっ、簡単でしょ?