こんにちは!今回は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が注目されている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言語のイメージが公開されています。
なんと「docker pull golang」コマンドと打つだけで、Go言語のイメージが使用できます。
環境構築にかかる工数が少ない
このように、あらゆる開発プラットフォームがDocker hubにイメージとして保管されています。そして、それらのイメージを1コマンド打つだけで利用できるので、環境構築にかかる時間は圧倒的に短縮できます。
そしてさらに、docker-composeを使えば、より時間を短縮することができます。
例えばWebサービスを新規開発する場合、Webコンテナ、APPコンテナ、DBコンテナ、・・・と複数のコンテナが必要です。
通常は、Dockerファイルからイメージの作成、またはDocker hubからイメージを取得し、実行コマンド(docker run)でコンテナの起動を行います。
コンテナが複数ある場合は、同じ手順を回数分行う必要がありますが、docker-composeを使用すれば、複数コンテナを一度に起動することができます。
以下、MySQLとAdminerをdocker-composeを使って実装する場合の例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
version: '3.1' services: db: image: mysql command: --default-authentication-plugin=mysql_native_password restart: always environment: MYSQL_ROOT_PASSWORD: example adminer: image: adminer restart: always ports: - 8080:8080 |
このように、使用するイメージと初期設定を設定ファイル(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したdmgファイルを起動、そして「Docker」をアプリケーションフォルダに移動し、起動します。パスワードが必要とのことなので、「OK」を選択し、アプリインストール用のパスワードを入力します。
規約を確認したらチェックし、「Accept」を選択します。
自動でインストールが行われ、↓のような画面が表示されればインストール完了です。「Start」を選択すると、チュートリアルが開始されます。
チュートリアル解説
チュートリアルですが、予想時間2分とある通り、ボタンを押し続けるだけでささっと終わってしまいます。何となしにチュートリアルをしても勿体ないので、どういう事を行なっているかを簡単に解説したいと思います。
また、チュートリアルをスキップしてしまった場合は、画面上部にあるDockerアイコンをクリックし、「Quick Start Guide」を選択すると、チュートリアルが再度開始されます。
First, clone a repository
最初のフェーズでは、GithubリポジトリからDockerホスト(ローカル)にチュートリアル用のプロジェクトをクローンします。
「docker run --name ・・・・」をクリックすると、自動で2つのコマンドが画面右のターミナル上で実行されます。
1 2 |
$ docker run --name repo alpine/git clone https://github.com/docker/getting-started.git $ docker cp repo:/git/getting-started/ . |
コマンド解説
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ファイルからイメージを作成します。
「cd getting-started ・・・」をクリックすると、自動で2つのコマンドが実行されます。
1 2 |
$ cd getting-started $ docker build -t docker101tutorial . |
コマンド解説
cd getting-started
カレントディレクトリを「getting-started」に変更します。
docker build
DockerファイルからDockerイメージを作成します。
-t docker101tutorial
tオプションでイメージ名を指定します。この場合は「docker101tutorial」がイメージ名です。
.
カレントディレクトリを指定しています。
成功すると「Use 'docker scan'・・・」と表示されます。「Next Step」を選択します。
ちなみに、こんなエラーが
1 2 3 4 5 6 7 8 9 10 11 12 13 |
=> ERROR [app-base 2/8] RUN apk add --no-cache python 1.3s => CACHED [base 2/4] WORKDIR /app 0.0s => CACHED [base 3/4] COPY requirements.txt . 0.0s => CANCELED [base 4/4] RUN pip install -r requirements 1.4s ------ > [app-base 2/8] RUN apk add --no-cache python g++ make: #8 0.234 fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/main/aarch64/APKINDEX.tar.gz #8 0.825 fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/community/aarch64/APKINDEX.tar.gz #8 1.299 ERROR: unable to select packages: #8 1.312 python (no such package): #8 1.312 required by: world[python] ------ executor failed running [/bin/sh -c apk add --no-cache python g++ make]: exit code: 1 |
こちらの情報によると、alpineが3.12にバージョンアップした時の影響で、Pythonのバージョンを明記すれば解消されるとのこと。
Dockerファイル内でバージョン指定してみるものの、エラー解消されず困り果ててましたが、dmgのインストールからやり直すと無事成功。
インストールしたタイミングが悪かったのか?と納得することに。同じエラーが発生した場合は、少し期間を置いてインストールからやり直してみてください。
Run your first container
次に、ビルドしたイメージからコンテナを作成&起動します。
「docker run -d ・・・」をクリックすると、自動でコマンドが実行されます。
1 |
docker run -d -p 80:80 --name docker-tutorial docker101tutorial |
コマンド解説
docker run
dockerイメージからコンテナを作成&起動します。
-d
-dオプションを付けると、コンテナがバックグラウンドで起動されます。
-p 80:80
-pオプションでポートのマッピングを行います。今回は、ホストのポート80番とコンテナのポート80番が紐づいています。
--name docker-tutorial
nameオプションを使って、コンテナ名を指定しています。この場合は「docker-tutorial」がコンテナ名です。
docker101tutorial
使用するイメージ名です。
最後に、作成したイメージをdocker hubにアップロードして完了です。まだサインインしていない場合は、サインインを行います。
アカウント登録していない場合は、「hub.docker.com」をクリックし、アカウントの登録を行います。
DockerID、メールアドレス、パスワードを任意で入力し、チェック項目にチェックをして「Sign Up」をクリックします。登録したアドレスにメールが届くので、認証を行えば登録完了です。
サインインが完了すると、コマンドが選択可能になります。「docker tag docker ・・・」をクリックすると、自動で2つのコマンドが実行されます。
1 2 |
docker tag docker101tutorial [userName]/docker101tutorial docker push [userName]/docker101tutorial |
コマンド解説
docker tag docker101tutorial [userName]/docker101tutorial
docker tagでイメージに別名を付けます。userNameの部分にDockerIDが反映されています。
docker push [userName]/docker101tutorial
イメージをdocker hubにプッシュします。
最後に
いかがだったでしょうか?少しはDockerがどういうものかを具体的にイメージできたのではと思います。
そして、未経験からエンジニアを目指している人でポートフォリオ作成を考えている人は、Dockerを使わない手はありません!今後、Dockerを使ったポートフォリオを紹介していこうと思います。
おすすめポートフォリオの記事はこちら!
-
-
参考【第1回】Go言語(ゲームエンジン:engo)でゲームを作成してみた
こんにちは!近年、多くのプログラミング言語の中で「稼げる言語」として人気が爆発しているのは、Googleが開発したGo言語です。本記事では、2Dゲームエンジンのengoを使用してゲームを作成していきます。プログラミング初心者の方でも分かりやすいように、ソースコードの説明もしっかり行いたいと思います。
続きを見る