はじめに
少しdockerを触っていると、どこからか小学校4年生らしき声が聞こえてくると思います。
どうやってdockerのコンテナに入ればいいですか?
これにざっくり答えてみたいと思います。
##SSHは使ってはいけないらしい
仮想OSと同じように、SSHで接続すればいいんでしょ?
そう思ってたけど違うみたいです。
ざっくり言うと、
- コンテナ内には必要なもの(例: phpとかmysqlとか)だけを入れたい。接続するためだけにSSHは入れたくない。
という考えみたいです。
詳しくをこれを読んでください。
Dockerコンテナ内でSSHDを実行してはいけない理由
##ではどうすればいいの?
ぐぐる。 nsinit
か nsenter
のどちらかを使えばいいと分かる。
なるほど!
##nsinitとかnsenterって何?
今回はやりません(=よく分かっていない)。良い説明の記事とかあったら誰か教えてくれると助かります。
##nsinitもしくはnsenterの入れ方
-
既にどちらかが入っているOSを使う!
-
それ以外は下記の記事を見てがんばって入れる。(結構面倒くさいと思います。)
RHEL/CentOS 6で Docker に nsinit/nsenter する
Dockerコンテナに入るなら SSH より nsinit が良さそう
##コンテナに入ってみよう!
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