Dockerとは?
Dockerは、コンテナ型仮想環境を作成するソフトウェアの一種で、
隔離された実行環境を用意することが特徴です。
https://aws.amazon.com/jp/docker/
コンテナ型仮想環境を作成するソフトウェアは、
Docker以外にも色々あり、例えばPodmanなどがあります。
ただ、そんな中でも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://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を本格的に学ぶなら下記の書籍などがおすすめです。