Dockerとは?
自分のPCの中にもう一つの小さなPC(コンテナ型仮想化環境)を構築してアプリケーションを動かす仕組みです。
コンテナの中には、アプリケーションを動かすために必要なプログラム、サーバー、データベースを入れて、アプリケーションを動かすことができます。
Dockerの特徴
Dockerの特徴はホストOSのカーネルを使用してコンテナを動かすところにあります。
ホスト型仮想化と比較すると図のように異なります。
ホスト型仮想化はホストOSとは別に、仮想化環境にゲストOSを用意して動作させています。
比べてコンテナ型仮想化はコンテナ内でホストPCのOSカーネルを使用することで軽量かつオーバーヘッド(追加のリソースや時間)が少なく動作させることができます。
カーネルとは?
OSの中心的な役割で、ハードウェアとソフトウェアの間を仲介しメモリ管理、プロセス管理(プログラムの実行管理)を行います。
Dockerを使うメリット
-
開発環境の素早い立ち上げ!
- ホストPCのカーネルを使用していることから軽量に動作するため、コンテナを起動させることですぐにプログラムを実行確認することが出来ます。
-
開発環境の共有が簡単!
- コンテナを構築する仕様書であるdockerfileを共有することで開発チームメンバーと環境を揃えて開発を進めていくことができます。これにより、チーム1人のPCでは動作するけど、他メンバーでは動かない!そんなトラブルを減らすことが出来ます。またアプリケーションを本番環境にリリースする際にも役立ちます。本サーバーにリリースする際にも同じコンテナイメージを使用することで簡単にアプリをリリースすることが出来ます。
-
コンテナごと環境の分離
- コンテナごと環境は隔離されるため、同じPCでコンテナごと異なるバージョンやライブラリを使用しても、問題なく動作します。
Dockerを動かすために知っておきたいこと
ここからはdockerを使用するために知っておきたいことをご紹介します!
Dockerfile
Dockerイメージを作るための指示書になります。
アプリケーションを動かすために必要な環境を記載しているため、
別のPCでも同じDockerfileを使用することで同じ環境を再現できるのです。
Dockerイメージ
Dockerイメージとはコンテナを動かすためのテンプレートようなもので、
Dockerfileに記載するベースイメージをもとに作成されます。
例えばpythonアプリケーションを動かすためには、以下が必要になります。
- pythonそのもの
- 設定ファイル
- 依存関係:動作するための必要なライブラリ等
アプリケーションを動かすために必要なものをまとめたものがDockerイメージになります。
Dockerコンテナ
テンプレートであるDockerイメージを基に動くアプリケーションの仮想化環境です。
さて実際にdockerを使ってコンテナを起動させる流れを見ていきたいと思います。
コンテナを作って動かす流れ
- Dockerfileを作成
- Dockerfileを基にイメージを作成(build)される
- Dockerイメージを実行(run)してコンテナが起動する
1.Dockerfileを作成
# ベースイメージとしてPython 3.8を使用
FROM python:3.8-slim
# 作業ディレクトリを設定。コンテナの中でどこで作業する指示する
WORKDIR /app
# 自分のPCにあるファイルをコンテナの中にもコピーします。
# 今回の例だとローカルのhogeファイルを/appにコピーしています
COPY /hoge
# Pythonスクリプトを直接Dockerfile内に書き込む
RUN echo 'print("Hello, World from Docker!")' > /hello.py
# コンテナ起動時に実行するコマンドを指定
CMD ["python", "/hello.py"]
こちらのDockerfileはPythonのベースイメージを使用して、コンテナを動かした場合にHello, World from Docker!
と出力するものになります。
2.イメージの作成
docker build -t hello_world
dockerfileからhello_world
という名前のイメージを作成します。
3.コンテナ起動
docker run hello_world
ビルドされたイメージを使って実際にコンテナを起動しHello, World from Docker!
が出力されます。
まとめ
ご覧いただきありがとうございました!
実務でもdockerの環境構築を行うのでまとめてみました。
個人的にはいつもイメージとコンテナの違いが分からなくなってしまうことが多く
イメージはbuildしてコンテナはrunする!これで覚えたいと思います!
何か気になる点や、おかしな点ありましたらお気軽にコメントください!