Dockerfile → Dockerイメージ→ Dockerコンテナの理解!
この記事の目的
Dockerfile → Dockerイメージ → Dockerコンテナの流れを理解して誰かに説明できるようにすること
Dockerfileについて
Dockerfileとは、Dockerイメージを作るための設計図のようなものでdocker image build
というコマンドを使うことでイメージを作成することができる。
また、常に1からDockerfileを作成するわけではなく、dockerHubという各イメージのベースが記述されているDockerのGitHubのようなものがあり、基本はここからベースを引っ張ってくるようになる。
そのため、このDockerfileではベースにさらに乗せたいライブラリなどをインストールする設定を記述したりする作業が主になる。
Dockerfileの基本命令句
・FROM ベースイメージの指定(FROM ruby:3.2.2/FROM ubuntu:20.04など)
・RUN 任意のコマンドを実行する(RUN bundle installなど)
・COPY ホストマシンのファイルをイメージに追加する(COPY Gemfile.lock /app/Gemfile.lockなど)
・CMD デフォルト命令の指定
→普段目にするDockerfileにはRUN apt update && apt install -y software-properties-common && LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php &&
のように一つのRUNで複数のLinuxコマンドを連続して実行する。これは、「RUNがコマンドの結果をレイヤーとして確定する」という特徴を持っているのと「確定されたレイヤーはキャッシュされる」という二つの特徴があるから。
Dockerイメージについて
Dockerイメージとはコンテナの実行に必要なパッケージでファイルやメタ情報を集めたもの。docker container run
というコマンドを実行することでイメージからコンテナを作成することができる。
このイメージというものを理解するには、「イメージが複数のレイヤーからなっている」ことを理解しなければならない。このレイヤーというのは、「コンテナのベースは何か? → Ubuntu」「何をインストールするのか? → PHP」「環境変数はどのような設定か、、、」などの情報の層のことを表す。
Dockerコンテナについて
Dockerコンテナとは特定の機能を持ったホストマシン上の隔離された領域のことでコンテナの実体は、「LinuxのNameSpaceという機能によって他と分離された一プロセス」のこと。つまり、コンテナはあくまでLinuxをベースとしたホストマシンの一プロセスなので、仮想サーバーや仮想Railsアプリなどではない。
コンテナのことを理解する上で重要になるのが「コンテナは一つのメインプロセスを実行するために起動する」ということである。そのため、「phpとMySQL」が必要なアプリがあったら、その場合は二つのコンテナが必要になるということ。
さらに、コンテンの停止には「コンテナを停止する」か「メインプロセス(PID=1)が終了する」かの二パターンある。これもコンテナは一つのメインプロセスを実行するために起動するということを理解すると納得がいく。
Discussion