⛴️
そもそもコンテナとかimageって何だっけ?
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コマンド
コンテナの起動時に実行される。
以下記事がわかりやすい。
コンテナとは
- 実行可能なimageの実体(imageは概念的なもので一つのファイルではない)
- コンテナの実行はimageに書かれたプログラムを実行すること
ホスト上にある複数のディレクトリやファイルを1つにファイルシステム内にマウントして見えるようにし、そのファイルシステム内にあるプログラムを特別な状態(名前空間の分離など)で起動するもの。
Discussion