【Docker】docker run及びdocker startコマンドを実行してもコンテナが立ち上がらない時の解決策

まだまだ初学者なものでDockerの仕組みはだいたい分かったものの、`docker run`コマンドや`docker start`コマンドを実行してもコンテナが立ち上がらない問題に衝突しました。ここではいろいろ試行錯誤した話や問題の解決法に関して記述していきたいと思います。

# 作業環境
OS: Windows 10 Home 22H2
Docker: ver.24.0.6
Windows PowerShell: ver.5.1.19041.3031

# 前提知識
Dockerを扱う上での前提として、個人的にはこの記事が図解も含めて一番分かりやすかったです。

Dockerとは一体何なんだ？【初心者向け】 - RAKUS Developers Blog | ラクス エンジニアブログ
https://tech-blog.rakus.co.jp/entry/20221007/docker

Dockerに関してよく分からない方は上記を参照すると良いでしょう。

# 発生事例
上記の前提を踏まえた上で、`docker run`コマンドや`docker start`コマンドを実行すれば、うまくコンテナが立ち上がるはず…（と思っていたんです）。
まぁ、ものは試し。早速試してみましょう。まずは`docker run`コマンドから。
```:Windows PowerShel
> docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
// この段階ではイメージが全くないことが分かります。

> docker run centos:centos7
Unable to find image 'centos:centos7' locally
centos7: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
Status: Downloaded newer image for centos:centos7

> docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
centos       centos7   eeb6ee3f44bd   2 years ago   204MB
// docker runコマンドを実行したことでCentOSのイメージが入ったことが確認できます。

// それでは、Dockerコンテナの状態がどうなっているか見てみましょう。
> docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
// おや？起動中のコンテナが表示されるはずなのに、起動中のコンテナが全くないことが分かります。

// 一応、停止中も含めたすべてのコンテナを見てみることにしましょう。
> docker ps -a
CONTAINER ID   IMAGE            COMMAND       CREATED          STATUS                      PORTS     NAMES
8c4eb34decc1   centos:centos7   "/bin/bash"   11 minutes ago   Exited (0) 11 minutes ago             ecstatic_jemison
// コンテナはしっかり作成できていますがExited(0)となっており、停止中になっていることが分かりました。なぜ？
```
次に`docker start`コマンドを試してみましょう。
```:Windows PowerShel
> docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
// この段階ではイメージが全くないことが分かります。
// 先ほど入れたイメージは一旦削除しました

> docker pull centos:centos7
centos7: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
Status: Downloaded newer image for centos:centos7
docker.io/library/centos:centos7
What's Next?
  View a summary of image vulnerabilities and recommendations → docker scout quickview centos:centos7

> docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
centos       centos7   eeb6ee3f44bd   2 years ago   204MB
// docker pullコマンドを実行したことでCentOSのイメージが入ったことが確認できます。
// しかし、コンテナ自体はまだ作成されていません。

// 一応、確認しておきましょう。
> docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
// やはりコンテナはまだ何も作成されていません。

// それでは、コンテナを作ってみましょう。
> docker create centos:centos7
42412a08dbb1c2e8b81651e11120fa544e7bbc64ecd9612e2a889ca48af7df08

// docker createコマンドを実行したことでコンテナが作成されたはずです。確認してみましょう。
> docker ps -a
CONTAINER ID   IMAGE            COMMAND       CREATED         STATUS    PORTS     NAMES
42412a08dbb1   centos:centos7   "/bin/bash"   3 minutes ago   Created             blissful_joliot
// コンテナがしっかり作成されていることが分かります。
// 当たり前ですが、この時点ではまだコンテナは起動していません。

// それでは、コンテナを起動させてみましょう
> docker start blissful_joliot
blissful_joliot

// コンテナを起動できたでしょうか？確認してみましょう。
> docker ps -a
CONTAINER ID   IMAGE            COMMAND       CREATED          STATUS                          PORTS     NAMES
42412a08dbb1   centos:centos7   "/bin/bash"   11 minutes ago   Exited (0) About a minute ago             blissful_joliot
// やはりExited(0)となっており、コンテナを起動できていません。なぜ？
```

# コンテナを起動するまでの流れをおさらい
`docker run`コマンドも`docker start`コマンドもやろうとしていることは同じです。

### ①docker runコマンド
`docker run`コマンドは以下の3つの操作をまとめて実行するコマンドです。
・Dockerイメージの取得(`docker pull`)
・DockerイメージからDockerコンテナを作成(`docker create`)
・作成したDockerコンテナを起動(`docker start`)←ここで問題発生？

### ②docker startコマンド
１．`docker pull`コマンドを実行し、Dockerイメージを取得する
２．`docker create`コマンドを実行し、DockerイメージからDockerコンテナを作成する
３．`docker start`コマンドを実行し、作成したDockerコンテナを起動する←ここで問題発生？

# 解決策
𝕏（旧Twitter）にて解決策が分からなくて困っている旨を投稿した際に、とある有志の方が解決策を教えてくださいました。参考サイトも提示していただきました。ありがとうございます。

### ①docker runコマンド
Dockerコンテナをずっと起動しておく - WEB開発ノート
https://utouto97.hatenablog.com/entry/2022/03/15/092924

上記URLによると、`docker run`コマンドにオプションコマンドが必要とのこと。具体的には以下のように実行すればいいようです。

`docker run -itd （コンテナ名）`

実際に実行してみましょう。
```:Windows PowerShell
> docker run -itd centos:centos7
Unable to find image 'centos:centos7' locally
centos7: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
Status: Downloaded newer image for centos:centos7
38c774868e5809cc276d3312b8f0ca786fdce7768b304ac779f4014a0f336378
// さて、ホントにDockerコンテナを起動できているのでしょうか？

// まずは、Dockerイメージの確認をします。
> docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
centos       centos7   eeb6ee3f44bd   2 years ago   204MB
// 上手く入ってますね。

// 次に、起動中のDockerコンテナのみを表示させてみましょう。
> docker ps
CONTAINER ID   IMAGE            COMMAND       CREATED         STATUS         PORTS     NAMES
38c774868e58   centos:centos7   "/bin/bash"   4 minutes ago   Up 4 minutes             interesting_lalande
//上手く起動できているようです。成功ですね！！
```
`-itd`がオプションにあたります。それぞれのオプション`-i`と`-t`と`-d`を合体させて`-itd`です。
公式リファレンスでオプションの詳細を読むことはできますが、私にはチンプンカンプンだったのでとりあえずすっ飛ばします。（一応、公式リファレンスのURLだけ貼っておきます。PowerShellで`docker run --help`を実行しても、オプションに関して閲覧することができます。）

Docker run リファレンス
https://docs.docker.jp/engine/reference/run.html

### ②docker startコマンド（失敗）
私は最初、`docker start`コマンドに問題があるのではないかと思って、`docker start`コマンドにオプションをつけてみました。しかし、調べてみると分かることなのですが、`docker start`コマンドに`-i`オプションはあるものの、`-t`と`-d`のオプションはないことが分かりました。（一応、`docker start`コマンドの公式リファレンスのURLも貼っておきます。PowerShellで`docker start --help`を実行しても、オプションに関して閲覧することができます。）

Docker start リファレンス
https://docs.docker.jp/engine/reference/commandline/start.html

では、オプション`-i`だけなら？結論を言うと、コンテナを起動させることはできません。

### ③docker createコマンド
`docker start`コマンドではDockerコンテナを起動させることはできない…。ではどうすれば？
いろいろ調べていると以下の記事を見つけました。

docker startコマンドの使い方（実例で解説）
https://www.memotansu.jp/docker/609/

上記の記事をもとに`docker create`コマンドにオプションをつけてみたら上手くいくのでは？という予測に思い至りました。結論を言えばこれが正解です。あとはどのオプションをつければよいか？
`docker create`コマンドはたくさんありますが。`-d`オプションはありません。つけるべきオプションは`-it`ですね。なので以下のようなコマンドを実行すればよいです。

`docker create -it （イメージ名）`

一応、`docker create`コマンドの公式リファレンスのURLも貼っておきます。PowerShellで`docker create --help`を実行しても、オプションに関して閲覧することができます。

Docker create リファレンス
https://docs.docker.jp/engine/reference/commandline/create.html#id13

それでは実演してみましょう。（Dockerイメージが全くない状態から始めます。）
```:Windows PowerShell
// まずはいつも通りDockerイメージを入れます。
> docker pull centos:centos7
centos7: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
Status: Downloaded newer image for centos:centos7
docker.io/library/centos:centos7
What's Next?
  View a summary of image vulnerabilities and recommendations → docker scout quickview centos:centos7

// 次に上述したオプションを組み入れたコマンドを使って、Dockerコンテナを作成します。
> docker create -it centos:centos7
5cb97bf23cc4e3382ed72aebb0b328d4579e963582b8a95f7b1177e308f70861

> docker ps -a
CONTAINER ID   IMAGE            COMMAND       CREATED         STATUS    PORTS     NAMES
5cb97bf23cc4   centos:centos7   "/bin/bash"   3 minutes ago   Created             youthful_poitras
// これでDockerコンテナが作成されていることが分かりました。

// 最後に作成したDockerコンテナを起動します。ホントに起動できるでしょうか？
> docker start youthful_poitras
youthful_poitras

// 確認します。
> docker ps -a
CONTAINER ID   IMAGE            COMMAND       CREATED         STATUS              PORTS     NAMES
5cb97bf23cc4   centos:centos7   "/bin/bash"   8 minutes ago   Up About a minute             youthful_poitras
// STATUSがUpになっているので起動できています。成功です！
```

# 終わりに
たぶん、今回私が記述したことはDockerの基礎だと思うので、多くの方には需要のない記事かもしれませんが、私はまだまだ初学者なので…。同じような問題でもしも困っている方がいたら、その方に届けばいいなぁと思っています。それではそれでは～！Goodbye!!!

# 参考
Dockerとは一体何なんだ？【初心者向け】 - RAKUS Developers Blog | ラクス エンジニアブログ
https://tech-blog.rakus.co.jp/entry/20221007/docker

Dockerコンテナをずっと起動しておく - WEB開発ノート
https://utouto97.hatenablog.com/entry/2022/03/15/092924

Docker run リファレンス
https://docs.docker.jp/engine/reference/run.html

Docker start リファレンス
https://docs.docker.jp/engine/reference/commandline/start.html

docker startコマンドの使い方（実例で解説）
https://www.memotansu.jp/docker/609/

Docker create リファレンス
https://docs.docker.jp/engine/reference/commandline/create.html#id13