Dockerの基本的な操作とDocker Composeの活用例

## この記事の対象者
- Dockerについてある程度知識のある方
- Dockerコマンドを確認したい方
- Dockerコマンドを忘れた方

## 開発環境
```
mac Ventura 13.4
Visual Studio Code
Docker version 20.10.22
```


## Dockerの基本的なコマンドと使用例
以下に、Dockerでよく使用される基本的なコマンドとその使用例を示します。

#### Docker image pull
このコマンドは、Docker Hubから特定のDockerイメージを取得します。例えば、次のコマンドはUbuntuの最新のイメージを取得します。

```
docker image pull ubuntu:latest
```


#### docker image build

このコマンドは、Dockerfileを元に新しいDockerイメージをビルドします。以下のコマンドは、現在のディレクトリのDockerfileを使用してmyimageという名前のイメージをビルドします。

```
docker image build -t myimage .
```

#### docker container create

このコマンドは、特定のイメージから新しいコンテナを作成します。次のコマンドは、myimageというイメージからmycontainerという名前の新しいコンテナを作成します。

```
docker container create --name mycontainer myimage
```

#### docker container start
このコマンドは、特定のコンテナを開始します。以下のコマンドは、mycontainerという名前のコンテナを開始します。

```
docker container start mycontainer
```

#### docker container stop
このコマンドは、特定のコンテナを停止します。以下のコマンドは、mycontainerという名前のコンテナを停止します。

```
docker container stop mycontainer
```

#### docker container rm
このコマンドは、特定のコンテナを削除します。以下のコマンドは、mycontainerという名前のコンテナを削除します。

```
docker container rm mycontainer
```
#### docker container run

このコマンドは、特定のイメージから新しいコンテナを作成し、それを開始します。以下のコマンドは、myimageというイメージから新しいコンテナを作成し、それを開始します。

```
docker container run --name mycontainer myimage
```

#### docker container restart
このコマンドは、特定のコンテナを再起動します。以下のコマンドは、mycontainerという名前のコンテナを再起動します。

```
docker container restart mycontainer
```

これらのコマンドを組み合わせることで、より複雑な操作を行うことができます。



## Docker Composeとdocker-compose.ymlについて

Docker Composeは、複数のコンテナを一度に管理するためのツールです。docker-compose.ymlという設定ファイルを作成することで、複数のコンテナの設定を一元管理することができます。以下に簡単なdocker-compose.ymlの例を示します。

```
version: '3'
services:
  web:
    image: 'nginx:latest'
    ports:
      - '80:80'
  db:
    image: 'mysql:latest'
    environment:
      MYSQL_ROOT_PASSWORD: password
```


この設定ファイルでは、webサービスとしてnginxのコンテナ、dbサービスとしてmysqlのコンテナを定義しています。それぞれのサービスで使用するイメージや環境変数、公開するポートなどを指定しています。


## Docker Composeのメリット
Docker Composeを使用すると、複数のコンテナの設定を一つの設定ファイルで管理できるため、手作業で各コマンドを実行するよりも簡単かつ効率的にコンテナを管理できます。また、設定ファイルをソースコードとともにバージョン管理システムで管理することで、コンテナの設定を他の開発者と共有したり、過去の設定に簡単に戻ることも可能になります。

また、Dockerのベストプラクティスとして、一つのコンテナには一つの役割を持たせるという原則があります。この原則に従うと、それぞれのコンテナが独立して動作するため、一つのサービスが問題を起こしても他のサービスに影響を及ぼさないという利点があります。Docker Composeはこの原則に従って複数のコンテナを管理するのに適したツールです。


## Docker Composeを使用した複数コンテナ操作の手順

Docker Composeでは、docker-compose.ymlに定義されたすべてのサービス（コンテナ）を一度に操作することができます。以下に主要なコマンドとその手順を説明します。

#### docker-compose build
このコマンドは、docker-compose.ymlに定義されたサービスをビルドします。以下のコマンドは、すべてのサービスをビルドします。

```
docker-compose build
```

#### docker-compose up
このコマンドは、docker-compose.ymlに定義されたすべてのサービスを起動します。以下のコマンドは、すべてのサービスを起動し、ログをターミナルに出力します。

```
docker-compose up
```


#### docker-compose stop
このコマンドは、docker-compose.ymlに定義されたすべてのサービスを停止します。以下のコマンドは、すべてのサービスを停止します。

```
docker-compose stop
```

#### docker-compose rm
このコマンドは、docker-compose.ymlに定義されたすべてのサービスのコンテナを削除します。以下のコマンドは、すべてのサービスのコンテナを削除します。


```
docker-compose rm
```

#### docker-compose restart
このコマンドは、docker-compose.ymlに定義されたすべてのサービスを再起動します。以下のコマンドは、すべてのサービスを再起動します。

```
docker-compose restart
```

#### docker-compose down
このコマンドは、docker-compose.ymlに定義されたすべてのサービスを停止し、それらのコンテナとネットワーク、ボリュームを削除します。以下のコマンドは、すべてのサービスを停止し、それらのリソースを削除します。

```
docker-compose down
```


また、Docker Composeではdocker-compose pullコマンドを頻繁に使用することは少ないです。これは、docker-compose upまたはdocker-compose buildを実行する際に、必要なイメージがローカルにない場合は自動的にDocker Hubからイメージを取得（pull）するためです。


## その他のよく使う操作について
DockerとDocker Composeには、上記の基本的な操作以外にも多くの便利なコマンドがあります。

#### docker-compose exec
このコマンドは、動作中のコンテナ内でコマンドを実行します。例えば、以下のコマンドは、動作中のwebサービスのコンテナ内でbashを起動します。

```
docker-compose exec web bash
```


#### docker-compose ps
このコマンドは、Docker Composeによって管理されているコンテナの状態を表示します。以下のコマンドは、すべてのコンテナの状態を表示します。

```
docker-compose ps
```


#### docker-compose logs
このコマンドは、コンテナのログを表示します。以下のコマンドは、webサービスのコンテナのログを表示します。

```
docker-compose logs web
```


#### docker system prune
このコマンドは、使用しなくなったDockerリソース（コンテナ、ネットワーク、イメージ）を削除します。これにより、システムのディスク領域を解放できます。ただし、使用中のリソースやタグ付きのイメージは削除されません。以下のコマンドは、未使用のリソースを削除します。

```
docker system prune
```

このコマンドを実行すると、未使用のリソースが削除されますが、一度削除されたリソースは復元できません。そのため、削除前に重要なデータが存在しないか確認してから実行することをお勧めします。

## まとめ
DockerとDocker Composeは、ソフトウェア開発の効率を大幅に向上させるツールです。Docker Composeを使用すれば、複数のコンテナを一元管理し、その設定を他の開発者と簡単に共有することができます。また、各コマンドを理解し活用することで、イメージやコンテナのライフサイクルを効果的に管理することが可能となります。これらの知識を活用し、効率的な開発環境を構築してみてください。