ポートフォリオ

【初心者】つまりDockerとは何なのか?インストール〜チュートリアル解説まで

つまりDockerとは?

こんにちは!今回はDockerの解説記事です。
 

エンジニアとしてフリーランスや副業で案件獲得をしたい時、レバテックなどのITエージェントを利用します。いざエージェントで案件を検索すると、必須スキルや歓迎スキルの中に「Docker」というワードがよく見受けられます。
 
 
僕自身、目にする度にググって調べてみましたが、抽象的な事しか書いていない記事が多く具体的なイメージがずっと持てていませんでした。
 
 
そこで、初心者にとにかく分かりやすいよう、Dockerの基礎知識と、インストール方法、チュートリアルまでを、忘備録がてら解説していきたいと思います!

Dockerとは

Docker社が開発した、コンテナ技術を使った開発プラットフォームのことです。
 
  
DockerはOSS(オープンソースソフトウェア)なので、誰でも自由に利用することができます。

コンテナとは?

コンテナとは、仮想化技術の一種です。仮想化とは、PCの中に別PCを仮想的に構築することです
  
  
仮想化技術にも種類があり、ホスト型、ハイパーバイザ型、そしてコンテナ型があります。
  
 
通常は、1つのハードウェアに対して1つのOSがインストールされます。身近な例を考えると、WindowsでMacソフト(Final Cut Pro、Logic Proなど)を使いたくても、起動することができません。

非仮想化

非仮想化例

そこで、仮想化技術を使い、Windowsの中にMacPCを仮想構築すれば、Macソフトを起動することができます。以下ホスト型とハイパーバイザ型の構成例です。

仮想化例

仮想化例

ホスト型ソフトウェア

Oracle VM VirtualBox

VMware Workstation Player

ハイパーバイザ型ソフトウェア

VMware ESXi

Kernel-based Virtual Machine(KVM)

Hyper-V

しかし、ホスト型とハイパーバイザ型は、ゲストOSが必要であるため、オーバーヘッド(負荷)が高い、リソース消費量が多い、などのデメリットがあります。
 
 
一方で、コンテナ型はゲストOSが不要な構成です。

コンテナ例

コンテナ例

※Docker上にWindowsとMacを載せるケースはないと思いますが、あくまでイメージなのでご了承ください。また、Dockerを使うには、ホストOSはLinuxでなければなりません。
  
 
上の図のように、動作環境毎にコンテナを用意し、そのコンテナをDockerエンジン上に配置します。公式ロゴの通り、船にコンテナを積むイメージです。

Dockerロゴ

Dockerが注目されている4つの理由

そんなDockerですが、特に注目されている4つの理由を紹介します。

理由その1

動作環境を統一できる

理由その2

Docker hubであらゆるコンテナ(イメージ)が公開されている

理由その3

環境構築にかかる工数が少ない

理由その4

環境の管理、バージョンの管理が楽

動作環境を統一できる

Dockerを使えば、全く同じ動作環境を用意することができます。
 
 
すなわち、「開発環境では動くけど本番環境で動かない」現象が起きないということです。
 
 
例えば、Webサイトを新しく作る場合、一般的に使用するサーバはLinuxになります。しかし、実際に開発を行う環境はWindows、またはMacのノートパソコンのケースが多いでしょう。
 
 
OSが違ければ、インストールされているミドルウェアやライブラリも異なります。
 
  
また、開発時にメンバー各々が手順書に沿って環境構築すると、手順の僅かな違いによって設定内容が異なったり、構築時期によってバージョンのバラツキが出てしまいます。
 
 
開発メンバーが他部署、他会社にまで展開されると、環境の統一はほぼ不可能です
  
  
Dockerを使う場合、DockerエンジンがハードウェアとホストOSの違いを吸収してくれます。そして、コンテナには使用するソフトウェアバージョン情報初期設定が記録されています。
 
 
このコンテナをDockerエンジンが搭載されている別PCに移植するだけで、同動作環境の完成です。

Docker hubであらゆるコンテナ(イメージ)が公開されている

Docker hubとは、Dockerイメージをクラウド上で管理、公開するためのレジストリサービスです。
 
 
Dockerイメージとは、コンテナを起動するための実行ファイル一式のことです。コンテナを移植すると言いましたが、具体的にはDockerイメージを物理的に共有します。
 
 
イメージは、Windows、CentOS、ubuntu、MySQL、PHP、Go、のように、OSやミドルウェア単位で提供されたり、Dockerファイルを用いて独自に実装した形式(複数のイメージや設定を組み合わせる)でも提供されます。
 
 
オブジェクト指向を例にすると、Dockerファイルがソースコード、イメージがクラス、コンテナがインスタンスのイメージです。
  
  
世の中で使われている主要なOS・ミドルウェアのDockerイメージは、全てDocker hub上で公開されています
 
 
例えば、Docker hub公式サイトで「Go」と検索すると、Go言語のイメージが公開されています。

Goイメージ

なんと「docker pull golang」コマンドと打つだけで、Go言語のイメージが使用できます。

Goイメージ2

環境構築にかかる工数が少ない

このように、あらゆる開発プラットフォームがDocker hubにイメージとして保管されています。そして、それらのイメージを1コマンド打つだけで利用できるので、環境構築にかかる時間は圧倒的に短縮できます。
  
  
そしてさらに、docker-composeを使えば、より時間を短縮することができます。
 
 
例えばWebサービスを新規開発する場合、Webコンテナ、APPコンテナ、DBコンテナ、・・・と複数のコンテナが必要です。
 
 
通常は、Dockerファイルからイメージの作成、またはDocker hubからイメージを取得し、実行コマンド(docker run)でコンテナの起動を行います。
 
 
コンテナが複数ある場合は、同じ手順を回数分行う必要がありますが、docker-composeを使用すれば、複数コンテナを一度に起動することができます。
 
  
以下、MySQLとAdminerをdocker-composeを使って実装する場合の例です。

参考:dockerhub mysql

このように、使用するイメージと初期設定を設定ファイル(docker-compose.yml)に記述してあげれば、あとは実行コマンド(docker-compose up -d)を1発打つだけで完了です

環境の管理、バージョンの管理が楽

最後に、Dockerはとにかく管理が楽です。解説した通り、イメージの管理はDocker hub上で管理することができます。
 
 
また、同ソフトウェアの複数バージョンを扱う場合の管理も非常に楽です。例えば、既存でMySQL最新versionの環境があり、別案件で古いversionが必要なケースです。
 
 
このケースの場合、別versionを指定したDockerファイルを用意し、ビルドしてイメージを作成するだけでOKです。
 
 
ソフトウェアによっては、バージョンの切替が複雑であったり、単一バージョンしか扱えない場合もあるかもしれません。Dockerはそんな悩みも解決してくれるのです。

インストール方法(M1)

こちらの公式サイトより、「Docker Desktop」のインストールを行います。これ以降は、Mac M1を例に説明します。公式サイトに移動したら、Docker Desktopの「Download for Mac - Apple Chip」を選択します。

Download For Mac Apple Chip

Downloadしたdmgファイルを起動、そして「Docker」をアプリケーションフォルダに移動し、起動します。パスワードが必要とのことなので、「OK」を選択し、アプリインストール用のパスワードを入力します。

Docker your Password

規約を確認したらチェックし、「Accept」を選択します。

Docker 規約同意

自動でインストールが行われ、↓のような画面が表示されればインストール完了です。「Start」を選択すると、チュートリアルが開始されます。

GetStarted

チュートリアル解説

チュートリアルですが、予想時間2分とある通り、ボタンを押し続けるだけでささっと終わってしまいます。何となしにチュートリアルをしても勿体ないので、どういう事を行なっているかを簡単に解説したいと思います。
 
 
また、チュートリアルをスキップしてしまった場合は、画面上部にあるDockerアイコンをクリックし、「Quick Start Guide」を選択すると、チュートリアルが再度開始されます。

Dockerチュートリアルを再度行う

First, clone a repository

最初のフェーズでは、GithubリポジトリからDockerホスト(ローカル)にチュートリアル用のプロジェクトをクローンします。

First, clone a repository

「docker run --name ・・・・」をクリックすると、自動で2つのコマンドが画面右のターミナル上で実行されます。

コマンド解説

docker run
dockerイメージからコンテナを作成&起動します。
 
--name repo
nameオプションを使って、コンテナ名を指定しています。この場合は「repo」がコンテナ名です。
 
alpine/git
使用するイメージ名を指定します。Dockerホストに「alpine/git」イメージが存在しないので、中で「decker pull」が実行されています。「alpine/git」イメージはdockerhub上で公開されています。これでgitコマンドが使えるようになります。
 
clone https://github.com/docker/getting-started.git
「getting-started」リポジトリをコンテナにクローンします。
 
docker cp
コンテナとDockerホスト間でファイルのコピーを行います。
 
repo:/git/getting-started/ .
コピー元とコピー先を指定しています。ここでは、コンテナ名repoに存在する「getting-started」をホストのカレントディレクトリにコピーします。
 
 
処理が完了すると、「getting-started」プロジェクトの一式が、PCにダウンロードされています。「Next Step」を選択します。

Now, build the image

次に、ダウンロードしたDockerファイルからイメージを作成します。

Now, build the image

「cd getting-started ・・・」をクリックすると、自動で2つのコマンドが実行されます。

コマンド解説

cd getting-started
カレントディレクトリを「getting-started」に変更します。

docker build 
DockerファイルからDockerイメージを作成します。

-t docker101tutorial 
tオプションでイメージ名を指定します。この場合は「docker101tutorial」がイメージ名です。

.

カレントディレクトリを指定しています。
  
  
成功すると「Use 'docker scan'・・・」と表示されます。「Next Step」を選択します。

ちなみに、こんなエラーが

こちらの情報によると、alpineが3.12にバージョンアップした時の影響で、Pythonのバージョンを明記すれば解消されるとのこと。
 
 
Dockerファイル内でバージョン指定してみるものの、エラー解消されず困り果ててましたが、dmgのインストールからやり直すと無事成功
  
 
インストールしたタイミングが悪かったのか?と納得することに。同じエラーが発生した場合は、少し期間を置いてインストールからやり直してみてください。

Run your first container

次に、ビルドしたイメージからコンテナを作成&起動します。

「docker run -d ・・・」をクリックすると、自動でコマンドが実行されます。

コマンド解説

docker run
dockerイメージからコンテナを作成&起動します。
 
-d
-dオプションを付けると、コンテナがバックグラウンドで起動されます。
 
-p 80:80
-pオプションでポートのマッピングを行います。今回は、ホストのポート80番とコンテナのポート80番が紐づいています。
 
--name docker-tutorial
nameオプションを使って、コンテナ名を指定しています。この場合は「docker-tutorial」がコンテナ名です。
 
docker101tutorial
使用するイメージ名です。

Now save and share your image

最後に、作成したイメージをdocker hubにアップロードして完了です。まだサインインしていない場合は、サインインを行います。

アカウント登録していない場合は、「hub.docker.com」をクリックし、アカウントの登録を行います。

Docker Sign In

DockerID、メールアドレス、パスワードを任意で入力し、チェック項目にチェックをして「Sign Up」をクリックします。登録したアドレスにメールが届くので、認証を行えば登録完了です。

Docker Sign Up

サインインが完了すると、コマンドが選択可能になります。「docker tag docker ・・・」をクリックすると、自動で2つのコマンドが実行されます。

Run your first container

コマンド解説

docker tag docker101tutorial [userName]/docker101tutorial
docker tagでイメージに別名を付けます。userNameの部分にDockerIDが反映されています。
  
docker push [userName]/docker101tutorial
イメージをdocker hubにプッシュします。

最後に

いかがだったでしょうか?少しはDockerがどういうものかを具体的にイメージできたのではと思います。
 
 
そして、未経験からエンジニアを目指している人でポートフォリオ作成を考えている人は、Dockerを使わない手はありません!今後、Dockerを使ったポートフォリオを紹介していこうと思います。
 
 
おすすめポートフォリオの記事はこちら

【第1回】Go言語でゲーム作成してみた
参考【第1回】Go言語(ゲームエンジン:engo)でゲームを作成してみた

こんにちは!近年、多くのプログラミング言語の中で「稼げる言語」として人気が爆発しているのは、Googleが開発したGo言語です。本記事では、2Dゲームエンジンのengoを使用してゲームを作成していきます。プログラミング初心者の方でも分かりやすいように、ソースコードの説明もしっかり行いたいと思います。

続きを見る

-ポートフォリオ
-

© 2022 まいふぁんず