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の場合
docker run -dit --name <コンテナ名> -p <ローカル側ポート:コンテナ側ポート> --mount type=bind,source=<ローカル側マウント元のパス>, target=<コンテナ側パス>
## 下記のようにtargetという名前をつけてファイル管理することが多いらしい
source="$(pwd)"/target
## pwdはPrint Working Directorの略。
## 現在の作業ディレクトリを表示するコマンドLinuxのコマンドで、相対パス指定したいときに使う
## MacOSXやUbuntuなどでは、環境変数$PWDで置き換え可能
## $()は中身を実行するshellのコマンド
volumeの場合
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:ボリュームの定義
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 事始め
- Cmd+Shift+x で拡張機能の検索画面を開き remote containers で検索
- Remote Containers (拡張機能の id は ms-vscode-remote.remote-containers)をインストール
- Dockerfile が置かれたディレクトリを VS Code で開き左下の緑のボタンをクリック
- Reopen in Container をクリック
- 参考:VSCode Remote Containerが良い
- 個人的には応用編な内容なのでまだサラッと読んだだけ