【備忘録】Dockerで使う基本的なコマンドなど

# コンテナの作成・起動

docker container run --name コンテナ名 -p ホスト側ポート番号:コンテナ側ポート番号 -d イメージ

```
docker container run --name test_apache -p 8080:80 -d httpd
```

上記で作成・起動すると、ブラウザでlocalhost:8080にアクセスすると起動しているのがわかる。

# 起動中のコンテナに入る
docker container exec -it コンテナ名 /bin/bash
```
docker container exec -it test_apache /bin/bash
```

# コンテナを削除
docker container rm コンテナ名

# コンテナ一覧を取得
起動中のコンテナ一覧取得
```
docker container ls
```
停止中も含めて全てのコンテナを取得
```
docker container ls -a
```

# コマンド一覧を見る
ヘルプを参照すれば、だいたいやりたいことはできそう
```
docker container --help
```

# Docker Compose
複数のコンテナを作成・起動できる機能。
`docker container run`で作成・起動するのは、コマンドが長くなったり、複数起動する際、必要回数分実行しないといけないので、Docker Composeを使うのが良い。

実行は簡単で、以下のコマンドを実行するだけ。
`-d`はバックグラウンドで実行するという意味で、こちらを指定しないと同じターミナルのWindowで他のコマンドを実行できなくなる。新しくWindowを開けば問題ないが、基本つけておくのが良さそう。
```
docker compose up -d
```

停止は下記。
```
docker compose stop
```

停止・削除は下記
```
docker compose down
```

## Docker Composeファイル
`docker compose up -d`のコマンドは、コマンドを実行したディレクトリにあるDocker Composeファイルからコンテナを作成・起動する。
Docker Composeファイルの命名は以下が有効らしい。
- compose.yaml
- compose.yml
- docker-compose.yaml
- docker-compose.yml

以前は`docker-compose`という名称だったみたいだが、`compose`という名称が推奨されるようになったらしい。

https://scrapbox.io/dojineko/Docker_Compose%E3%81%AE%E5%AE%9A%E7%BE%A9%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%81%AFcompose.yaml

書き方は下記。
```yaml
services:
  # サービス名
  web:
    # イメージ
    image: httpd
    # コンテナ名
    container_name: test_apache
    # ポート番号
    ports:
     - "8080:80"
```

# コピー
ホストのPCからコンテナにファイルをコピーする
containerとcomposeで少し違いがある。

docker container cp コンテナ名:/usr/local/apache2/htdocs/index.html ./index.html
docker compose cp サービス名:/usr/local/apache2/htdocs/index.html ./index.html

```docker
docker compose cp web:/usr/local/apache2/htdocs/index.html ./index.html
docker container cp test_apache:/usr/local/apache2/htdocs/index.html ./index.html
```

# データの永続化
Container内のデータはContainerを削除すると消える。
永続化したい場合は三つの手段がある
- 消す前に、Container内からホストにコピーしておく
- ボリュームを使う
- バインドマウントを使用する

この中でよく使われている（個人的によく見かける）のはボリュームを使う方法。

## ボリュームについて
Dockerが管理する記憶領域にデータを永続化する

ボリュームの定義は以下のように二箇所で行う。
```yaml
services:
  db:
    image: postgres
    environment:
      POSTGRES_USER: root
      POSTGRES_PASSWORD: password
    ports:
      - 5432:5432
    volumes:
      - db_volumes:/var/lib/postgresql/data
volumes:
  db_volumes:
```

`services`と同じ階層の`volumes`には作成するボリューム名を記載する。
個別のservise（上記で言うと`db`）のvolumesには、上記で定義したボリューム名とcontainer内のパスを指定する。

### Container内のパス指定について
なぜ、Container内のパスを指定するのか最初わからなかったが、
ボリュームの実態（ホストPC上の保存領域）と、Container内のフォルダを結びつけるようなイメージみたい
つまり、Container内で指定したパスを参照すると、ホストPC上の保存領域を参照できる
また、パスの指定はイメージごとに決まっているみたい（変えることは可能みたいですが、デフォルト値ではなくなるため、設定変更が必要みたいです）
DockerHubでイメージの公式ページを調べる必要がある


### ボリュームの実態の場所
以下が参考になりました。

https://note.com/w0o0ps/n/n9bc1bcd9fa59

## バインドマウント
ホストOSのフォルダやファイルをマウントする
ホストOS上で、マウントしたファイルを直接変更すると、コンテナ内でも変更が反映される
service内のvolumesにホストOSのパス:コンテナ内のパスで指定する

ホストPC上のフォルダ構成を下記とする。
```
dir ─ compose.yaml
    └ htdocs
        └ index.html
```

下記のように、ホストのPCのhtdocsに、Container内の`/usr/local/apache2/htdocs`を定義する。
```yaml:compose.yaml
services:
  web:
    image: httpd
    container_name: test_apache
    ports:
     - "8080:80"
    volumes:
     - ./htdocs:/usr/local/apache2/htdocs
```

すると、ホストPC上のhtdocs/index.htmlを編集すると、Container内でも変更が反映され、Apacheの表示が変わる。

# エラー確認
Containerの作成が完了したが、ブラウザなどでアクセスしても表示されない場合は内部でエラーになっている可能性がある。
その場合、`docker compose logs コンテナ名`でログが確認可能
```
docker compose logs web
```

# ビルド
docker compose upでは、イメージがすでにある場合、既存のイメージを使用する。
したがって、再度イメージをビルドしたい場合は下記のコマンドを使う
```
docker compose build
```

再ビルドと実行を行う場合は下記
```
docker compose up -d --build
```

反映されない時は以下を試す。
```
docker compose build --no-cache
```