【初学者向け】Dockerとは？初心者のための用語解説

ジョブカン事業部のアドベントカレンダー17日目です。

https://qiita.com/advent-calendar/2023/jobcan

# はじめに
ジョブカン開発でインターンをしています @yagiyanagi です。
アドカレも後半戦に入ってきました。
先輩方の魅力的な記事が並んでいますが今回は箸休め程度に思って読んでいただけたらなと思います。

この記事ではDONUTSでインターンを初めてちょうど1か月たった私が、躓いたこと学んだことを共有できたらなと思いキーボードをペチペチ叩いております。

今回のテーマはずばり**Docker**です。
VS Code, Gitに並ぶプログラミング三種の神器ことDockerですが、私お恥ずかしながら弊社に入社するまでDockerの存在を知りませんでした。
また、調べても調べても知らない単語に出くわす始末。
そんな私と同じ状況に陥っている初学者に向けて、そして備忘録としてキホンのキのみを解説していこうと思います。

:::note info
この記事でわかること
* Dockerとは何か
* Docker周辺の用語
* Dockerを使うメリット
:::

:::note alert
この記事でわからないこと
* Dockerの細かい仕組み
* Dockerを使った具体的な環境構築手順
:::

# そもそもDockerって何？
<div align="center">
<img width=25%><img width=50% alt="docker_official_logo_icon_169250.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630128/3e569e1a-96e2-4ed9-847a-e818bc06814e.png">
</div>


まずDockerとは一言でいうと**Docker社(クジラのロゴが可愛い)の提供する、<font color="blue">仮想環境</font>内でのソフトウェア開発を<font color="blue">コンテナ</font>という単位の中で行うことを実現するプラットフォーム**です。

ざわざわしないでください。わかります。この一言の中にも知らない用語がいっぱい出てきますよね。
私も最初は知らないことだらけで絶望しました。でも安心してください。
次のセクションでは仮想環境、コンテナ、そしてこれらに付随する用語の解説もしていきます。
# 仮想環境とは？
仮想環境は割と名前の通りなのですがハードウェアの中に仮想的に作り出した環境という意味です。
**自身のPCの中にもう一つ仮想のPCを作る**というとわかりやすいでしょうか。
![仮想環境資料.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630128/057b2dfd-339c-4b28-6797-5e4763093240.jpeg)
仮想環境を作る技術にも様々な種類がありますがDockerは**コンテナ型仮想化技術**という手法を使っています。
# コンテナとは？
コンテナ型仮想環境というのはたった今説明した仮想環境を作る技術の一つです。
コンテナと聞いて皆さんがまず思い浮かべるのはやはり物流業界でのコンテナでしょうか。
## 物流業界のコンテナ
<img width=25%><img width=50% alt="container_kontenasen.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630128/a2b6341c-fcc0-84a4-f110-68f38af6caed.png">
物流業界におけるコンテナとは規格化された大きな箱(世界で共通のサイズ)のことです。
コンテナが物流業界にもたらした恩恵は計り知れません。

:::note info
コンテナ輸送のメリット
* 荷役(荷物の上げ下ろし)の効率アップ
* 途中でコンテナを開けないので安全性アップ
* 荷物一つ一つの梱包が不要に
* 天候を問わず作業ができる(環境に影響を受けない)
* 海上輸送から陸上輸送への受け渡しがスムーズに
:::

これらのことから物流業界でのコンテナの発明は「20世紀最大の発明のひとつ」と言われています。
## エンジニアにとってのコンテナ
エンジニアにとってのコンテナも基本的に物流業界の考え方と同じです。
規格化された箱の中で実行環境を作成し、その中でアプリケーションを動かします。
![コンテナ型仮想化説明画像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630128/f115add4-c7db-e29a-d5ed-010aabf5ea76.jpeg)
コンテナ型仮想化のメリットは以下の通りです。

:::note info
コンテナ型仮想化のメリット
* ハードウェアの環境に左右されない
* 必要なものをローカル環境に一つ一つインストールしなくていい
* 起動・処理が速い
* 環境の移転・共有が楽
:::

### ハードウェアの環境に左右されない
チームで開発をする際、ソースコードの共有はGitなどのバージョン管理ツールにより簡単に行えます。
しかし環境を構築するうえで各々の物理環境の違いから予期しない挙動、エラーにつながることがよくあります。
ただそれは仕方がないことでOSの違いはもちろん、インストールしているアプリや各種設定、バージョンなど全く同じ状態のPCなど存在しないからです。

しかしコンテナの中で環境を構築する場合その心配はありません。
まっさらな状態から始められるため余計なエラーに頭を悩ますことがないのです。
### 必要なものをローカル環境に一つ一つインストールしなくていい
物理環境にそのまま環境構築をする際、必要なミドルウェアやアプリケーションを一つ一つインストールしなくてはいけません。
インストーラーを探してダウンロードして設定をする。
大きいプロジェクトでは使用するツールも多くそれだけで一苦労です。

また、複数のプロジェクトをこなしている場合、それぞれのプロジェクトで使っているミドルウェアのバージョンが異なることも度々あります。
ミドルウェアのバージョンを切り替える便利なツールもありますが毎回毎回切り替える必要があったり、切り替え忘れることがあったりと面倒ごとが尽きません。

そこで登場コンテナです。
コンテナ型仮想環境ではプロジェクトごとに完全に分離された環境を用意できるためバージョンを切り替えるという作業がそもそも存在しないのです。
### 起動・処理が速い
従来の仮想環境では物理環境のOSとは別のゲストOSを使用します。
そのため一度起動するために物理環境のOS(ホストOS)とゲストOSの2つを立ち上げなくてはならずその分時間がかかります。

一方コンテナ型では物理環境で使っているOSを共有して使用します。
それによりアプリケーションの起動・処理にあたってOSを起動する必要がないため素早く動くことができるのです。

CPUやメモリもゲストOSに割かないのでリソースに余裕ができます。

![ホスト型コンテナ型比較資料.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630128/8d969937-3021-1aba-501b-909c46c2928f.jpeg)

### 環境の移転・共有が楽
コンテナは<font color="blue">**イメージ**</font>からいくらでも同じコンテナを起動することができます。
したがって本番環境で障害が発生した際の代替環境への移行や、チーム内での環境の共有が簡単に行えるのです。
![イメージからコンテナ起動.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630128/9535d280-837c-cee1-3139-82639f3d5302.jpeg)

またイメージという知らない用語が出てきましたね。
# イメージとは？
イメージはコンテナを起動する際に必要な設定ファイルです。
**コンテナがクッキーだとしたらクッキーを作る型にあたります。**

そしてDockerではこのイメージをDockerHubと呼ばれるクラウド上のサービスから持ってきて使うこともできますし、Dockerfileから作ることもできます。
**DockerHubは雑貨屋さんでクッキーの型を買ってきてクッキーを作るイメージ、Dockerfileはオリジナルのクッキーの型を自分で作るイメージに近いです。**

このDockerfileはGitリポジトリに含めることができ、このことが共有の容易さにつながっています。

# Dockerで環境構築するメリット
これらコンテナ型の仮想環境のメリットをまとめると、Dockerを使用した環境構築の最大のメリットは**ソフトウェアの実行環境をどのような環境でも簡単に共有・管理できる**という点にあるのです。
# 最後に
いかがでしたでしょうか、エンジニアとして避けては通れないDockerについて解説しました。
あくまでこれは導入です。
なのでこの記事に書かれた知識だけで実際に環境構築をすることは難しいと思います。
ただ、皆様が少しでもDockerの全体像を掴めたなら光栄です。
Dockerを使ったノンストレスな環境でバリバリ開発を進めましょう！

#
# お知らせ
DONUTSでは新卒中途問わず積極的に採用活動を行っています。
詳細はこちらをご確認ください。

https://www.donuts.ne.jp/recruit/