初心者がまとめる初心者のためのDocker入門
Dockerとは何か
- データやプログラムを隔離することができる仕組み
(≒一つの物理サーバーに機能としてのサーバーを複数同居することができる) - この隔離する単位のことをコンテナという
- コンテナを操作する仕組みを Docker Engine という
Dockerのメリット
- ライブラリやソフトウェアのアップデートによる影響範囲を隔離されたコンテナ内で収めることができる
- コマンドや設定ファイルのみで簡単に環境作成や削除ができる
- 軽量である
Dockerが軽量である理由
- 前提として Docker Engine はlinux環境でのみ動作する(=物理マシン上にlinuxがインストールされている必要があり、そのlinux上で Docker Engine は動作する)
- 作成したコンテナ内にはlinuxがインストールされているがOSが丸々インストールされているわけではなく、ディストリビューションに当たる機能(IO機能など)のみがインストールされている
- コンテナ内でプログラムが動作する際、コンテナは物理マシン上のlinuxのカーネルを借りている、そのため余分なカーネルをコンテナ内にインストールする必要がないため動作か軽量になる
イメージとコンテナ
イメージとは
- コンテナのもととなる設計図(ISOファイルのようなアーカイブファイルみたいなもの)
- コンテナからもイメージファイルを作ることができる
ボリュームとマウント
ボリュームとは
- ストレージの1領域を区切ったもの(パーティションとは少し定義が違う)
ディスク、パーティション、ドライブ、ボリュームの違い | Windows Server 実践ガイド
マウントとは
- ストレージや機器(マウスやキーボードなど)をOSやソフトウェアに認識させること
- Dockerの文脈では、コンテナにボリュームを認識させて操作できるようにすること
Dockerにおける二つのボリュームのマウント方法
ボリュームマウント
- Docker Engineが管理する領域内にボリュームを作成して、ディスクとしてコンテナにマウントさせる方法
- コンテナを介して操作することが主なので、直接操作しづらい、滅多に触らないけど消してはいけないファイルなどに利用する
バインドマウント
コンテナをイメージ化する方法
docker commit によるイメージ書き出し
- コンテナをイメージとして書き出す方法
Dockerfileによるイメージ書き出し
- Dockerfileに元となるイメージや実行コマンドを書き、それをビルドしてイメージを書き出す方法
コンテナへの操作
- docker exec コマンドでlinuxコマンドを使用することができる
- docker run 時にコマンドを付与することもできるがbash等のソフトウェアを動かすよう指定すると、コンテナで元々起動する予定だったソフトウェアが起動しなくなる
- ただ、起動しているコンテナに対してbash起動しても動く
Docker Compose
Docker Composeとは
- コンテナ作成やボリュームのマウント、ネットワークの設定を一つのyamlファイルで管理することで一括で複数のコンテナを作成できるソフトウェア
Dockerfile と Docker Compose は何が違うのか
- Dockerfileは「イメージ」のみを作成することができる、コンテナ自体やネットワーク、ボリュームのマウントなどはできない
- Docker Composeはコンテナ、ボリュームマウント、ネットワークの設定などを一挙に行うことができる
【DB関連】用語まとめ【備忘録】
個人用まとめ。覚えた用語などを追記していく。
【Docker】docker-compose.yml 各項目の記述方法【備忘録】
TL;DR
久しぶりにVSCodeのremote container拡張機能を使って開発していた時に、docker-compose.ymlの書き方をかなり忘れていたので備忘録としてまとめておく。 適宜更新予定。
ファイル例
version: '3' services: web: build: . ports: - "11324:1324" volumes: - .:/go/src/go_test/ working_dir: /go/src/ restart: always command: sleep infinity container_name: go_test_container
各要素の説明
version
使用するdocker-composeのバージョン番号を記述する。
services
サービス(動作させるアプリケーション)の設定を名前を付与して設定・追加する。
例のyamlファイルだとweb
がサービス名にあたる。
build
ビルドするDockerfileをyamlから見た相対パスで記述する。
ports
ホストマシンのポートとコンテナのポートを下記の通りに紐づける。
ports: - "HOST_PORT:CONTAINER_PORT"
例のyamlファイルだと、port番号1324でリクエストの待ち受けをした場合、ホストマシンではport番号11324にアクセスすることでリクエストを送ることができる。
volumes
ホストマシンのディレクトリをコンテナのディレクトリに下記の通りにマウントする。
例のyamlファイルだとyamlファイルがあるディレクトリの内容をコンテナの/go/src/go_test/
ディレクトリにマウントして、コンテナ側でも利用できるようになる。
volumes: - HOST_DIR:CONTAINER_DIR
working_dir
コンテナ起動時の初期位置となるディレクトリを記述する。
restart
コンテナが停止した際の再起動やコンテナの開始に関連する設定を記述する。
常に起動しておいて欲しいWebアプリケーションサーバーなどはalwaysでいいのかな、という感じ。
設定値は下記の通り。
設定値 | 説明 |
---|---|
no |
コンテナを自動的に再起動しない。デフォルト値。 |
on-failure |
プロセスが0以外のステータスで終了した時のみ、再起動を行う。 |
always |
停止時には必ず再起動を行う。 |
unless-stopped |
always と似ているが、Docker daemonが再起動してもステータスが終了状態なら再起動はしない。 |
ここの理解は公式リファレンスと別の方の記事を参考にさせていただきました。
command
コンテナ起動時に実行するコマンドを記述する。
container_name
コンテナの名前を記述する。
参考
Start containers automatically | Docker Documentation