インフラ

Dockerとは何か?概要を完全解説 簡単なWebサーバー構築で基礎を学ぶ

reisuta

Webエンジニア | 20代中盤 | 大学時代はGmailすら知らないIT音痴でプログラミングとは無縁の生活を送る → 独学でプログラミングを学ぶ → Web系受託開発企業にエンジニアとして就職 → Web系自社サービス企業に転職 | 実務未経験の頃からVimを愛好しており、仕事でもプライベートでも開発はVimとTmuxを使っているので、VSCodeに疎いのが最近の悩み。何だかんだでやっぱりRubyが好き。

Dockerとは?

Dockerは、コンテナ型仮想環境を作成するソフトウェアの一種で、
隔離された実行環境を用意することが特徴です。

https://aws.amazon.com/jp/docker/

コンテナ型仮想環境を作成するソフトウェアは、
Docker以外にも色々あり、例えばPodmanなどがあります。

https://podman.io/

ただ、そんな中でもDockerの人気度は群を抜いており、
事実上のデファクトスタンダードになっているという感じですね。

Webの開発においても、
Dockerで環境構築することがほとんどで、
本ブログでもそのような記事をいくつか公開しています。

Dockerには、いくつかの用語が登場しますが、それぞれ解説します。

コンテナとは?

コンテナとは、独立した実行環境のことを指します。
よく日常生活でもコンテナを見かけたりすると思いますが、
わりとあのイメージと類似しており、隔離された閉じられた空間という特徴があります。

Dockerを使う際、Dockerをインストールしている、ホストOSに該当するPCとは、
異なる環境(異なるOSを入れたり)を立ち上げることができ、その環境が、
コンテナに該当します。

例えば、ホストOSがMac OSで、コンテナの中のOSがLinuxというように、
Dockerも仮想化の一種なので、コンテナという独自空間を使って、
仮想環境を構築するようなイメージです。

ホストOS、すなわち普段使用しているPCの環境とは、
別の環境をコンテナによって手軽に構築できるので、
Dockerの大きな魅力ですね。

そして、そうして構築されたDocker環境は、
基本的に他の人のPC上でも動作することが想定されています。

なぜなら、コンテナはそれ自体独立しているので、
ホストOSのアプリケーションに依存して動くということが、
基本起こらないので、どのPCで実行しても動くことが想定されているという感じです。
(まれにカーネル周りで、違いが生じると動かなかったりする場合もあるので、
そういう場合は、それぞれの依存性を確認する必要があります。)

そのため、Dockerはチーム開発での共通した環境構築をしやすいというメリットがあります。

イメージとは?

コンテナが独立した環境ということは既に紹介しましたが、
そうなると、コンテナごとに個別の環境を構築する手間が生じます。

ただ、gitやcurlのように基本的にどのような環境においても、
インストールしておきたいソフトウェアが存在するため、いちいちこれらを
インストールするのは面倒です。

そこで、予めこういった必要なソフトウェアなどをインストールしてある、
コンテナの元のようなものが存在しており、これのことをイメージといいます。
テンプレートみたいなものですね。

このイメージは、Docker Hubというサイトで見ることができます。
下記は、Rubyのイメージです。

https://hub.docker.com/_/ruby

イメージには、オフィシャルイメージとそれ以外がありますが、
可能であれば、オフィシャルイメージを使いましょう。
こちらの方が、セキュリティアップデートが行われたりと、
メンテナンスが格段にしっかりしているかと思われるので。

https://matsuand.github.io/docs.docker.jp.onthefly/docker-hub/official_images/

Docker Engine

Docker Engineとはなにかというと、
ドキュメントに次のように定義されていました。

軽量かつ強力なオープンソースによりコンテナ化(containerization)を行う技術。アプリケーションの構築とコンテナ化を行うワークフローを実現します。

https://docs.docker.jp/engine/index.html

要は、Docker Engineによって、
コンテナとかを実行できるようになるという感じで、
このDocker Engineが入っているコンピューターを
Dockerホストと言ったりします。

文字通り、エンジンのようなものと思っていただけたら問題ないかと思います。

Docker Desktop

早速、Dockerの環境構築を行います。
Dockerを使用する際、このDocker Desktopというソフトウェアを使用すると、
簡単なので、こちらを使います。
(Docker Desktopを使わずにdocker engineやcliなどをインストールする方法も
ありますが、Docker Desktopをインストールしたほうが格段に簡単なので、こちらのほうがいいかと
思います。Docker DesktopにDocker Engineやcliなども含まれています。)

https://www.docker.com/products/docker-desktop/

https://docs.docker.jp/desktop/index.html

それぞれのOSにあった、Docker Desktopをインストールしてください。
インストールできたら、Docker Desktopを起動しておいてください。

DockerでWebサーバーを構築してみる

起動

さて、長々と解説が続いたので、
そろそろハンズオンに移りたいと思います。
手始めに、Apacheのイメージを使って構築してみたいと思います。

Docker hubのイメージは、
こちらです。公式イメージです。

https://hub.docker.com/_/httpd

Dockerfileを使うやり方と使わないやり方がありますが、
今回は、Dockerfileなしの、下記のコマンドでさくっと起動してしまいます。
(実際の開発では99%Dockerfileを使うかと思うので、あくまでこれは簡易的な
デモンストレーションと思っていただければです)

docker run -dit --name my-apache-app -p 8080:80 -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4

さて、こちらを実行したら、
もう立ち上がっているかと思います。プロセスを確認するには、

docker ps

で確認できます。

STATUSがUpと表示されているので、
稼働中です。

さて、試しに
http://localhost:8080/を確認すると、
ファイルの一覧を確認できるはずです。

私がホームディレクトリに設置したコールドリーディング用の
フォルダにアクセスしてみます。(各々の環境で試す場合は、
シンプルにlocalhost:8080でホームディレクトリが確認できます)

表示されているのは、Dockerホストのカレントディレクトリですね。

さて、このままだと見栄えが悪いので、
index.htmlを作成して、そちらが表示されるようにします。

<html>
  <body>
    <p>hello docker</p>
  </body>
</html>

こちらを保存したら、
今回は、http://localhost:8080を見てみます。

index.htmlの内容が表示されていますね。

停止

さて、コンテナを起動して
index.htmlの内容を表示できたので、
ものすごく簡単ではありますが、
一応Dockerを使って、Webサーバーを構築したかと思います。

なので停止します。
停止のコマンドは、

docker stop my-apache-app

my-apache-appは、runのときの--nameオプションで指定したコンテナ名ですね。
docker stopコマンドはコンテナ名のほかに、コンテナIDでも停止することができます。

docker psコマンドを使うと、
プロセスが消えていることがわかると思います。

ただ、docker psコマンドに-aオプションを付けると、
稼働中ではないすべてのコンテナを表示するので、
残っていることが確認できます。

StatusはExitedに変わっていますね。

再開

停止したコンテナを再び動かしてみます。

docker start my-apache-app

docker psを見ると立ち上がっていることが確認できると思います。

ちなみに、コンテナのログを確認したいときは、

docker logs my-apache-app

でできます。

破棄

先程、コンテナの停止を行いましたが、
停止してもコンテナは残り続けるので、
知らないうちに容量を圧迫しかねなかったりするので、
不要なら破棄しましょう

コンテナの破棄は、

docker rm my-apache-app

です。

おっとエラーが出ました。
コンテナを削除するには、まずstopをする必要がありそうです。

docker stop my-apache-app
docker rm my-apache-app

これで削除できました。

イメージの破棄

さて、コンテナは破棄しましたが、
イメージはまだ残っております。

下記のコマンドでダウンロードしたイメージを確認できます。

docker image ls

これも知らないうちに容量を圧迫しかねないので、
不要なら削除しましょう。

docker image rm httpd:2.4
または、
docker rmi httpd:2.4

なお、Dockerを本格的に学ぶなら下記の書籍などがおすすめです。

  • この記事を書いた人
  • 最新記事

reisuta

Webエンジニア | 20代中盤 | 大学時代はGmailすら知らないIT音痴でプログラミングとは無縁の生活を送る → 独学でプログラミングを学ぶ → Web系受託開発企業にエンジニアとして就職 → Web系自社サービス企業に転職 | 実務未経験の頃からVimを愛好しており、仕事でもプライベートでも開発はVimとTmuxを使っているので、VSCodeに疎いのが最近の悩み。何だかんだでやっぱりRubyが好き。

おすすめ記事はこちら

Vim/Neovimプラグイン 1

プラグインをどれだけ入れるかは、その人の思想なども関係するので、一概にこれがいいというのはないかもしれません。 プラグインを全く入れない人もいれば、100個以上入れる人もいます。 ただそれでも、これだ ...

VimとNeovimの比較 2

本記事では、VimとNeovimの違いについて、解説します。 VimとNeovimの違いについては、普段頻繁にVimなどを使う方でなければ、正直、あまり気にしなくてもいいかなと思います。 ただ、Vim ...

Ruby変数やすべてがオブジェクトについて 3

本記事は、Rubyの基礎文法である、変数や真偽値、論理演算子に触れると同時に、「すべてがオブジェクト」というRubyの特徴的な思想についても解説します。 この思想は、Rubyの文法の根幹になっているの ...

4

エンジニアにおすすめの技術書 書籍学習は、エンジニアの嗜みみたいなところがありますが、 良書というものは、意外とそこまで多くもありません。 そこで本記事では「技術書マニアの筆者が厳選した技術書20選」 ...

5

エンジニアになるには? プログラミングは、専門性が高く自分一人で勉強するのが大変に感じることも多いですよね。 そこで本記事では「おすすめのプログラミングスクール5選」を特徴と、現役エンジニア目線で優れ ...

-インフラ