##はじめに
前回はdockerfileを作成してイメージ作成からapacheの起動までをやってみました。
その際いろいろ調べていて、起動やコンテナへのアクセスで不明点が結構あったので詳しく調べてみた内容をまとめたいと思います。
##docker runしたのに起動しない!?
ubuntuのイメージを使ってみます。
イメージ名を指定してrunします。
$ docker run ubuntu
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
確認してみると、起動していません。
あれ?
-aオプションですべてのコンテナを確認してみます。
ありますね...
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d1d595f53e6b ubuntu "/bin/bash" 14 seconds ago Exited (0) 13 seconds ago funny_wozniak
STATUS欄がExted(0)...???
docker startしてみます。
$ docker start d1d595f53e6b
d1d595f53e6b
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
####う・ご・か・な・い!!
動かない
なぜでしょうか。
##docker run -it
いろいろ調べてみると、runするタイミングで-itオプションを付与していないのが原因らしい。
なにこれ。
$ docker run -d -it ubuntu
4af17d141f3e5f037539a49ee367785abda784d8cff501644820de7d1fdb9009
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4af17d141f3e ubuntu "/bin/bash" 4 seconds ago Up 4 seconds boring_hamilton
-i →標準入力を開いたままにする
-t →擬似ttyに接続。
-dはコンテナを作成後、コンテナプロセスの標準入出力から抜けておく感じのオプション。なのでいったん置いときます。
これをつけると問題なく起動して停止、起動も問題なくできました。
##ログイン方法で挙動が違う。attachとexec
以下の記事を参考にさせていただきました。
@RyoMa_0923さん
Dockerコンテナ内で操作 attachとexecの違い
#####docker attach
コンテナ上で起動しているPID=1の標準入出力(STDIN/STDOUT)に接続するらしい。
attachはコンテナで立ち上がってるPID=1の標準入出力に接続する。
よってexitするとコンテナもろとも停止する模様。(恐ろしいですね)
#####docker exec
docker exec はコンテナ内で新たなプロセスを実行する。
よってexitを実行してもコンテナ自体は停止しないみたいです。
いつもの癖でexitで抜ける人はexecを使うほうがいいかもしれないなって思いました。
##前回記事ではまったコンテナ起動してもapachのテストページが表示されな問題
dockerfileから作成したapacheのイメージを使用してコンテナを作成して起動します。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
apache latest b5f41134a3a1 5 minutes ago 599MB
ubuntu latest 549b9b86cb8d 3 weeks ago 64.2MB
$ docker run -d -p 80:80 apache /sbin/init
1fdab23f462e139188cf552d17ae88d8c4137f12e9ab9b4d50393264ec225ce8
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1fdab23f462e apache "/sbin/init" 9 seconds ago Up 9 seconds 0.0.0.0:80->80/tcp dazzling_pare
ちゃんと起動してますね。
実際にアクセスしてみますが、このサイトにアクセスできません。と例の悲しい表示がでます。
調べてでてきた謎のオプションを付与して再度コンテナを作成、起動します。
$ docker run --privileged -d -p 80:80 apache /sbin/init
8d83edca0037bf9a11c097084e2940a92dc3c8473d5c99c7a5e5faf1439bdbdb
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8d83edca0037 apache "/sbin/init" 6 seconds ago Up 6 seconds 0.0.0.0:80->80/tcp admiring_varahamihira
起動までは問題なくできました。
ブラウザからアクセスしてみると、テストページが表示されました!!
変わったことといえば謎の「--privileged」これなに?
調べてみました。
##docker run --privileged
dockerコンテナはデフォルトでは権限がないため、コンテナ中のデーモンを動かすことができないみたいです。
そこで使用するのが--privileged
これを使うとdockerはホスト上のすべてのデバイスに対して接続可能となるようです。
##まとめ
- docker run して起動せず、docker startもできない場合はオプション問題なのかも。
- attachとexecは同じログインでも挙動が全く別物
- コンテナはデフォルトではデーモンを動かすことができない。
以上です。調べながらもやや不明な点があったりもしたので間違ってるところなどあったらご指摘いただけると幸いです。