コンテナとは
OSの中に別のOSを作成する技術の一つ。
似たような概念として仮想化があげられる。
仮想化とコンテナの違い
仮想化ではホストOS上で仮想化ソフトを起動し、その上に立てられたゲストOSの中でプロセスが起動する。
この際、ライブラリ・コマンド・カーネルなどは全てゲストOS上に専用のものが作成され、プロセスからはそちらが参照される。
一方コンテナにおいてはライブラリやコマンドは都度作成されるものの、カーネルに関してはホストOSのものが参照される。
仮想化とコンテナを比較すると前者はホストOS>仮想化マシン>ゲストOS>プロセス
という4段階になっているのに対し、後者ではホストOS>ライブラリやコマンド>プロセス
という3段階となっている。
すなわち仮想化マシンを挟まないために処理が早くなるという特徴がある。
ライブラリ・コマンド・カーネルとは
コマンドとはls
やcd
などのターミナルコマンドのことを指す。
ライブラリはプロセスが起動するためのライブラリ群で、MacであればLibrary
ディレクトリに格納されている。
カーネルはコンピュータの基本的な操作を行うための機能を格納したライブラリ群であり(システムコールと呼ばれる)、コマンドに応じて呼び出され処理を行う。
つまり、プロセスが起動した際にはまずコマンドやライブラリが呼び出され、最終的にはシステムコールが実行されることになる。
Dockerとは
コンテナを簡単に作成するための機能の一つ。
通常であればコンテナの作成のためにはそのコンテナで使用されるコマンドやライブラリを定義・作成する必要がある。
Dockerと呼ばれるツールをインストールしDockerコマンドを使うことで、コンテナの作成に必要なコマンド・ライブラリの導入を簡単に行うことができる。
DockerHubとは
コンテナを作成するのに必要なコマンドやライブラリのセット(OSイメージ)が保管されているリポジトリのこと。
例えばLinuxOSであればCentOSやDebianなどのディストリビューションごとにOSイメージが用意されている。
Dockerfileとは
DockerHubから取り寄せたDockerイメージに追加の情報を付与するためのファイル。
例えばDocker上でCenstOSのコンテナを作りその中でphpアプリを走らせることを考えた場合、本来であれば以下の作業が必要になる。
- CentOSのDockerイメージをもとにコンテナを作成する
- コンテナの中に入る
- サーバー(apacheなど)をインストールする
- phpをインストールする
- サーバーを起動する
- 適当なphpファイルを作ってコンテナ上にコピーする
- 8080番ポートにアクセスして動作確認をする
つまり、Dockerイメージにはコンテナの情報しかないため、実際の開発の際には追加で様々なプログラムが必要になりその都度ターミナルを走らせることになる。
Dockerファイルはこれらの一連のコマンドをファイルに記録したものであり、これをイメージ化してそれをもとにコンテナを作成することで必要な手順が全て自動で実行されるようになる。
詳細は以下。
Dockerコマンド達
% docker pull centos7:centos7
% docker run -it --name centos7 centos:centos7
# M1Macで実行するときには以下のようにプラットフォームの指定が必要
% docker run -it -d --platform=linux/amd64 --name centos7 centos:centos7
# 必要なdockerイメージがpullされていなければ自動ダウンロードが入る
# --name centosは省略可能(コンテナ名をつけているだけ)
# -dはコンテナをデーモン(バックグラウンド)で起動するためのオプション(省略可能)
# 公式は docker run [オプション] --name コンテナ名 [イメージ名][タグ名] [コンテナ起動後に実行するコマンド]
% docker exec -it centos7 /bin/bash
# 成功するとプロンプトが以下のように変化する
[root@8d8ca2646e59 /]#
# @以下はコンテナID "/"はディレクトリ、"#"がプロンプト
% docker ps
# 結果
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8d8ca2646e59 centos:centos7 "/bin/bash" 50 minutes ago Up 50 minutes centos7
# -aオプションをつけることで停止中のコンテナも確認できるようになる
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8d8ca2646e59 centos:centos7 "/bin/bash" 54 minutes ago Exited (137) 19 seconds ago centos7
% docker stop コンテナ名またはID
% docker start コンテナ名またはID
% docker commit コンテナ名 イメージ名
>> sha256:33fd144ef6171206b545f23cafe6bb7c877df2386618c53e2e6011e0214b6284
% docker images
>>
REPOSITORY TAG IMAGE ID CREATED SIZE
test1 latest 33fd144ef617 11 seconds ago 204MB
% docker rm コンテナ名もしくはID
# DockerfileというファイルからDockerファイルが作られる
% docker build -t dockerイメージ名 dockerイメージのパス
# イメージの削除
% docker rmi イメージ名