docker
DockerDay 3

どうやってdockerのコンテナに入ればいいですか?

More than 1 year has passed since last update.

はじめに

少しdockerを触っていると、どこからか小学校4年生らしき声が聞こえてくると思います。

どうやってdockerのコンテナに入ればいいですか?

これにざっくり答えてみたいと思います。

SSHは使ってはいけないらしい

仮想OSと同じように、SSHで接続すればいいんでしょ?
そう思ってたけど違うみたいです。

ざっくり言うと、

  • コンテナ内には必要なもの(例: phpとかmysqlとか)だけを入れたい。接続するためだけにSSHは入れたくない。

という考えみたいです。

詳しくをこれを読んでください。
Dockerコンテナ内でSSHDを実行してはいけない理由

ではどうすればいいの?

ぐぐる。 nsinitnsenter のどちらかを使えばいいと分かる。

なるほど!

nsinitとかnsenterって何?

今回はやりません(=よく分かっていない)。良い説明の記事とかあったら誰か教えてくれると助かります。

nsinitもしくはnsenterの入れ方

コンテナに入ってみよう!

1、 エイリアスを使って簡単にしましょう。~/.bashrc に下記のシェルスクリプト関数を記載するか、/etc/profile/ディレクトリ内にdocker.shとか適当に名前付けてファイルを置きましょう。

  • nsenterの場合

    docker-attach()
    {
      pid=$(docker inspect --format '{{.State.Pid}}' $1)
      sudo nsenter --target $pid --mount --uts --ipc --net --pid
    }
  • nsinitの場合

    docker-attach()
    {
      id=$(docker inspect --format '{{.Id}}' $1)
      root=/var/lib/docker/execdriver/native/$id
      sudo sh -c "cd $root && $GOPATH/bin/nsinit exec $2"
    }

2、 docker ps でコンテナIDを取得します。
3、 下記のいずれかの方法で、コンテナIDを引数にして実行すればOKです。

  • nsenterの場合

    docker-attach [コンテナID]
  • nsinitの場合

    docker-attach [コンテナID] /bin/bash

おわりに

Docker1.3以降の場合は下記のdocker execでコンテナに入れるので、この記事のことは全て忘れてください(号泣)
コンテナに入りたい?それ docker exec でできるよ

参考資料

docker-attachのシェル関数は下記からもらいました。
https://gist.github.com/chidakiyo/478c1f74f5097dd832c7
https://gist.github.com/yukinagae/d7368e15f135a8337171