Dockerの基本的な利用法-(1)Dockerコマンド覚えるうえでの注意事項


## 前書き：記事を書こうと思ったきっかけ

日常的によく使用している Docker ですが、あまり使い方を理解しないままソフトウェア開発をしていました。  
誰かが作ったイメージの定義を、これまた誰かに作ってもらった readme に記載されたコマンド(`docker compose up ~`とかそういうやつ)を打ち込んで使用すれば、とりあえず仕事はできていたので、あまり Docker の細かい仕組みについて理解しようとしてこなかったのです。が、このままだと Docker わかる人に頼り切りになってしまうので良くないぞ！自分で Dockerfile を修正したり、自分が必要とする環境のコンテナを１から作れるようにならないと……！と思い立ち、Docker について基礎から勉強し直して記事を書くことにしました

:::note info
正しく理解を深めたいので、記事の内容に間違いがあればご指摘・編集リクエストは歓迎します。
:::

## 対象読者

- Docker は触ったことあるけど仕組みはよく分かってない
- コマンドの意味が頭に入っているわけではなく、”おまじない”的に決められたコマンドを打って使っているだけ。
- Dockerfile や compose.yaml は他人が書いたものをそのまま使っており、自分で１から作成することはできない

みたいな自分と同じようなエンジニアを想定しています。  
※ Docker とかコンテナって何？という完全初心者の人向けの説明はしません（そういう方は、他の記事を探していただくよう、お願いいたします）

第１回目の今回は、まず docker のコマンドの構造や、以前のバージョンのコマンドに関する注意点など、個々のコマンドを習得する前に覚えておきたい事柄を紹介します。

## Docker コマンドの構造

```sh
$ docker 上位コマンド 副コマンド [オプション] [対象] [引数]
```

例えば、httpd(Apache のイメージ名)を指定して コンテナを作成する`docker container create`コマンドを実行する場合、下記のようになる

```sh
$ docker container create -p 8080:80 httpd
```

|            |              |
| ---------- | ------------ |
| container  | 上位コマンド |
| create     | 副コマンド   |
| -p 8080:80 | オプション   |
| httpd      | 対象         |

※ この場合、引数はなし。引数が必要になる状況はそんなに多くない。

### 上位コマンドと副コマンド

実は、上位コマンドの container は省略してもよく、副コマンド create だけで先程のコマンドと同じ動作をする

```sh
$ docker create -p 8080:80 httpd
```

これは、もともとは上位コマンドの`container`というのは無く、後から追加されたものであるためである。  
最初の頃はコマンドの数が少なかったので、上位コマンドがなくても問題なく使えていたが、機能が増えるに従ってコマンドの種類も増えて複雑化したので、コマンドを整理するためにどういうカテゴリに属するコマンドなのかを示すために上位コマンドが追加された、という経緯らしい

このコマンド整理は Docker のバージョン 1.13 で行われた。  
↓ の"CLI restructured"を参照

https://www.docker.com/blog/whats-new-in-docker-1-13/

多くのコマンドでは上位コマンドを省略して副コマンドを入力するだけで、そのまま動作するが、中には省略形が副コマンドと一致しないコマンドや、省略形が存在しないコマンド、上位コマンドが存在しないコマンド等もあるので注意が必要(下記はそのようなコマンドの一例)

| 上位コマンド+副コマンド | 省略形        | コマンドの意味                          |
| ----------------------- | ------------- | --------------------------------------- |
| docker container ls     | docker ps     | 実行中のコンテナを一覧で表示            |
| docker image ls         | docker images | Docker が持っているイメージを一覧で表示 |
| docker network connect  | (なし)        | 動作中のコンテナをネットワークに接続    |
| (なし)                  | docker login  | Docker レジストリへログインする         |

### docker-compose と docker compose

複数のコンテナを連携させて使用する際に使うコマンドとして`docker compose`というものがあります。  
一方、古い書籍やサイトだと`docker-compose`(ハイフンつき)というツールを使って説明しているものもあります。  
両者の違いは下記の通りです。

|                               |                                                                                                                                                 |
| ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| docker-compose (ハイフンあり) | Docker Engine には含まれていない、外部のソフトウェアである。現在は非推奨                                                                        |
| docker compose (ハイフンなし) | Docker Engine に含まれている。基本的には docker-composer の機能は、一通り使えると思って良い。**現在はこちらの方を利用するのが推奨されている。** |

基本的にはハイフン無しを使う（参考コードでハイフンありを使っていたらハイフン無しに読み替える）ようにすれば問題なさそうです。

## おわりに

これでコマンドの基本的な見方は分かったので、次回からよく使われるコマンドについて解説していきます.

## 参考リンク

https://docs.docker.jp/index.html

https://docs.docker.com/reference/

https://qiita.com/kotobuki5991/items/e2af78c11b4571f904e5

## 参考書籍

https://book.mynavi.jp/ec/products/detail/id=120304