docker(VS Code Remote Containers)の環境構築のコマンドについての個人メモ

## dockerの基礎知識
### Docker Image
- 必要なファイルを全て固めたアーカイブパッケージ
- コンテナの元となるファイル

### Docker File
- ベースとなるイメージとそのイメージに対してどのような操作をするのかを記したファイル
- Docker FileをbuildするとDocker Imageができる

### docker compose
- 予めコンテナの起動方法やボリューム、ネットワーク構成などを書いた定義ファイル(docker-compose.yml)「Composeファイル」を用意する
- docker-composeというツールでComposeファイルを読み込ませて実行すると、ボリュームやネットワークが構築され、まとめてコンテナが起動する
- docker-compose ツールでまとめて停止や削除もできる

## dockerの起動の主なオプション

## -dit
- -dit
    - コンテナをバックグラウンドで実行させる(デタッチモード)。デタッチ中のログはdocker
- -it
    - 標準入出力をコンテナに結びつける(キー入力する場合)。
- -t
    - 標準入出力をコンテナに結びつける(キー入力しない場合)。


## --mount
### bindの場合

```shell
docker run -dit --name <コンテナ名> -p <ローカル側ポート:コンテナ側ポート> --mount type=bind,source=<ローカル側マウント元のパス>, target=<コンテナ側パス>
```

```shell
## 下記のようにtargetという名前をつけてファイル管理することが多いらしい
source="$(pwd)"/target
## pwdはPrint Working Directorの略。
## 現在の作業ディレクトリを表示するコマンドLinuxのコマンドで、相対パス指定したいときに使う
## MacOSXやUbuntuなどでは、環境変数$PWDで置き換え可能
## $()は中身を実行するshellのコマンド
```

### volumeの場合

```shell
docker run -dit --name <コンテナ名> -p <ローカル側ポート:コンテナ側ポート> --mount type=volume,source=<volume名>,dst=<コンテナ側パス>
```

### bindとvolume　の使い分け
- 汎用性で言えばボリュームマウントが推奨
    - また、ブラックボックス化しても問題なく永続化したい、データベースを構成するコンテナ等におすすめ
- バインドマウントの方がいい場面
    - 設定ファイルの受け渡し(ホスト上に設定ファイルを用意したい)が必要な場合
    - 作業ディレクトリの変更を即座にDockerコンテナから参照したい時
        - ローカルのファイルの変更により即座に更新されるため、個人開発とかでお試ししたい場合などはこっちがお勧め

## --net
- コンテナ間でコンテナ名で通信したい場合に利用する
    - 利用しない場合は、'docker network inspect' や 'docer container inspect'でIPアドレスを確認して、指定する必要がある
    - これは起動時に設定される値であり可変なので、コンテナ間で通信する場合は必ずネットワークを作る必要があるっぽい
- 何も指定しない場合はデフォルトで存在する'bridge ネットワーク'に属することになる。前述の通りここではコンテナ名での通信が行えないので、コンテナ間の通信は考慮されていない

## docker composeの基礎知識
- docker-compose.ymlの記載について
    - version, service, network, volumesの3つの枠組みに分かれている
    - version:Compose ファイルの書式のバージョン
    - service:1つ一つのコンテナを定義する
    - network:ネットワーク定義
    - volumes:ボリュームの定義

```yml
version:3

services:
  image: xxxxxx
  networks:
    - hogehoge
  volumes:
    - volume_name:マウント先
  restert: always
  
  ...

  depends_on 
  image: xxxxx2
  networks:
    - hogehoge
  ports:
    - xxxx:xxxx
  restart: always

  ...
  
  app:
    build:
      context: .                    # 相対パスがややこしいのでcontextには自ファイルを指定
      dockerfile: ./app/DockerFile  # 自ファイルを指定したのち、dockerfileの場所を明示的に設定する
    tty: true # 起動したままにする

  ・・・

networks:
  hogehoge:

volumes:
  volume_name:
```

- docker-composeではComposeファイルに記述したservice名を指定して個別にコンテナを操作可能

## docker compose使う時のフォルダ構成

```
├── README.md
├── docker-compose.yml
├── app
│   ├── Dockerfile
│   └── dist
├── api
│   ├── Dockerfile         # <- API 実行環境
│   └── source             # <- API のソースコード
├── proxy
│   └── Dockerfile         # <- Web サーバ
└── mysql/
    ├── Dockerfile         # <- MySQL (公式の MySQL イメージでいいかも)
    └── data              # MySQL のデータディレクトリ
```    

## VS Code Remote Containers の環境構築

- 参考：[VSCode Remote Containers 事始め](https://zenn.dev/hkdord/articles/remote-containers)
    - Cmd+Shift+x で拡張機能の検索画面を開き remote containers で検索
    - Remote Containers (拡張機能の id は ms-vscode-remote.remote-containers)をインストール
    - Dockerfile が置かれたディレクトリを VS Code で開き左下の緑のボタンをクリック
    - Reopen in Container をクリック
- 参考：[VSCode Remote Containerが良い](https://qiita.com/d0ne1s/items/d2649801c6f804019db7)
    - 個人的には応用編な内容なのでまだサラッと読んだだけ