⛴️

そもそもコンテナとかimageって何だっけ?

2022/06/12に公開

dockerを勉強し直していた時に、imageとかコンテナとか、割と適当に理解して開発していたので、ここでもう一度勉強し直してまとめる。

imageとは

  • コンテナ起動のための設定をまとめたもの
  • このimageを共有し、それぞれが手元の環境で共有されたimageからコンテナを起動することで、コンテナのメリットである「複数人で同様の環境を用意できる」を活かすことができる
  • Dockerfileに記述した内容からbuildしたり、Docker Hubからimageをpullしたりすることで、手元にimageが用意できる

imageの詳細

imageの構成要素

docker imageを構成するのはイメージレイヤーと呼ばれる「層」の集まり。Dockerfileでimageの内容を記述できるが、このimageを構築するためのDockerfileの一つ一つの命令(コマンド)が、レイヤー。Dockerfileではアプリケーションを実行するために必要なデフォルトのコマンドや引数を指定したレイヤー、外部に公開するポートを指定したレイヤー、永続化のためのボリュームを指定したレイヤーなど様々な記述ができる。レイヤーごとにホストのディレクトリに情報が保存され、build時にこれらのイメージレイヤーの情報が統合され、一つのimageとなる。

imageを手元環境で作成するには?

  • dockerhubなどからpullする方法
  • Dockerfileでコマンドなど色々指定してbuildする方法

主にこの2通りがある。

dockerhubなどからpullする方法

以下のようにイメージ名を指定してpullコマンドを実行することで、imageをpullしてくることができる

$ docker pull イメージ名:タグ名

上記コマンドではタグ名を省略することができる。この場合、自動的にlatestのタグが付与される。

dockerhubからpullしてくるimageは正確にはイメージ名:タグ名のイメージレイヤー。

Dockerfileからbuildする方法

まず、Dockerfileを記述する。以下コマンドでbuild

$ docker build

大まかなDockerfileの書き方

  • Dockerfileはdocker imageの設計図
  • dockerfileの命令ごとにレイヤーがどんどん上に積み重なっていくいく感じ
  • docker buildコマンドでdockerfileからimageを作成できる
  • 複雑さ、依存関係、ファイル容量、build時間を減らすために不要なパッケージはインストールしない
FROM ruby:3.0.2-alpine # docker hubにあるrubyのイメージをダウンロード。ベースイメージ

ENV LANG C.UTF-8 # 環境変数を指定。実行されたコンテナまで維持される
ENV TZ Asia/Tokyo # 環境変数を指定

RUN apk add --update --no-cache \ # キャッシュを使わずにコンテナ内で必要なコマンドを使えるようにインストールする
    tzdata \
    less \
    mysql-client \
    mysql-dev \
    build-base \
    git \
    gcompat

WORKDIR /usr/src/app # このコマンド以降に続くコマンドの作業場所(working directory)を示す。存在しなければ作成される。

COPY . /usr/src/app # hostのカレントディレクトリをコンテナ内の/usr/src/appにコピー
RUN bundle install # imageのbuild時に/usr/src/appでbundle installを行う

(番外編)RUNコマンドとCMDコマンドの違いは?

RUNコマンド

imageのbuild時に実行される

CMDコマンド

コンテナの起動時に実行される。

以下記事がわかりやすい。

https://qiita.com/YumaInaura/items/ce40a792da308a068310

コンテナとは

  • 実行可能なimageの実体(imageは概念的なもので一つのファイルではない)
  • コンテナの実行はimageに書かれたプログラムを実行すること

ホスト上にある複数のディレクトリやファイルを1つにファイルシステム内にマウントして見えるようにし、そのファイルシステム内にあるプログラムを特別な状態(名前空間の分離など)で起動するもの。

Discussion