コンテナの起動とログインについて調べてみたメモ

##はじめに
前回は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
```

####う・ご・か・な・い！！
動かない:pray_tone1:
なぜでしょうか。

##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の違い](#https://qiita.com/RyoMa_0923/items/9b5d2c4a97205692a560)

#####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は同じログインでも挙動が全く別物
+ コンテナはデフォルトではデーモンを動かすことができない。

以上です。調べながらもやや不明な点があったりもしたので間違ってるところなどあったらご指摘いただけると幸いです。