はじめに
Docker を少しだけ使ったことがあるけど、用語はほとんど知らなかったので今更ながら調べました。
初心者の勉強の記録です。
Docker とは
コンテナ型の仮想環境を作成したり利用したりできるソフトウェアです。
仮想化には他にホストOS型やハイパーバイザー型があります。これらと比べてコンテナ型は以下の特徴があります。
- OS を実行しない
- 最低限必要なファイルだけで構成する
そのため CPU やメモリ、ディスクといったシステムのリソース利用量が少なくて済み、仮想環境を軽量に扱うことができます。大勢で開発を行うような場合に、全員が同様の仮想環境を迅速に構築できます。
ただしホスト側のカーネルに依存するため、たとえば Windows 上で直接 Docker コンテナを利用することはできません。
Docker コンテナ
Docker で利用できるコンテナ型の仮想環境です。
これを作成することで、仮想環境を利用したいろいろな処理ができるようになります。
Docker コンテナは、次に記載している Docker イメージを元に作成します。
また以下のコマンドで作成済みの Docker コンテナから Docker イメージを作成することができます。
docker commit ~~
Docker イメージ
利用したい Docker コンテナの構成(どんなファイル、アプリを入れるか、等)をまとめて保持しているものです。Docker で仮想環境を利用するには、このイメージからコンテナを作成する必要があります。
イメージは Docker Hub 等で公開されているものを利用するのが良いと思います。
公開されているイメージをそのまま利用することもできるし、自分なりに設定を追加した独自のイメージを作成することもできます。
Explore Docker's Container Image Repository | Docker Hub
Dockerfile
Docker Hub 等から入手した Docker イメージをもとに、自分なりに必要な機能や設定を追加したイメージにするには、一つ一つコマンドを叩くなどの手順を踏みます。
これはなかなか手間がかかり、手順を間違う恐れもあります。
そこで Dockerfile
という名前のテキストファイルにイメージに設定する内容を記述しておくと、イメージいじりが自動化できます。
COPY
を使わずに複数行のファイルを作れないかなと調べたところ、オープンソースのコードで以下のような書き方ができることを知りました。
下記はファイルの新規作成ですが、追記したい場合は >
を >>
にすればいけます。
RUN { \
echo 'export LANG=ja_JP.UTF-8'; \
echo 'autoload -Uz compinit && compinit'; \
echo 'bindkey -e'; \
} > .zshrc
export LANG=ja_JP.UTF-8
autoload -Uz compinit && compinit
bindkey -e
イメージとコンテナ
イメージとコンテナについて、自分は
- イメージ
- オブジェクト指向での クラス
- コンテナ
- オブジェクト指向での インスタンス
のような感じかなと理解しました。
コンテナで扱うデータの管理
コンテナで作成されたデータはそのコンテナで保持されますが、コンテナが削除されると一緒に消えてしまいます。また複数のコンテナ同士でデータを共有することもできません。
これを解決するために、コンテナで扱うデータをホスト側で保持し、それをコンテナ側にマウントする という方法が用いられます。
以下のような方法がありますが、公式リファレンスではなるべく ボリューム を使用すべきとされています。
ボリューム
ホスト側の /var/lib/docker/volumes/
以下にコンテナで扱うデータ領域を作成し、それをコンテナでマウントして利用します。
以下のコマンドでボリュームを作成できます。コンテナを破棄した後も残ります。
docker volume create [volume_name]
バインドマウント
ホスト側のディレクトリをコンテナ内のディレクトリにマウントすることでデータを同期します。
tmpfs
ボリュームやバインドマウントとは異なり、ホスト側のメモリ上に保存します。コンテナが停止されると tmpfs マウントは削除され、保存したファイルは消滅してしまいます。
永続化したくない(例えば個人情報などを一時的に保存したい)場合に有用です。
参考