サーバー、データベース、インフラに関するトピックス
■第5話:Dockerの全体像
(最終更新日:2022.07.25)

(絵が小さい場合はスマホを横に)
Webエンジニアであれば、避けては通れないのがDocker。
ワシの記憶が正しければ「Docker、Docker」と話題になったのが2014年頃から。
今までの仮想化技術と異なり、Dockerは非常に画期的な方法であった。
Dockerが他の仮想化技術よりも優れているのは、OSは仮想化せずホストを間借りして、
その上でUbuntuなりApacheなりを構築できるということにある。OSが要らない分、効率的である。
この点については、他でも解説されている資料が多々あるので、ググって調べてほしい。
今回はシンプルにDockerを使うと何が嬉しいか、どのように使うのかを説明する。
[目次]
Dockerとは
Dockerとは、一言で言えば「コンテナ仮想化技術」のことである。
仮想化技術とは本体のOSとは別に分離された動作環境を構築するもので、コンテナはその仮想環境の小ささ、構成の小ささを表している。
それだけだと何を言っているか分からないので、従来の仮想化技術と比較して説明する。
従来の仮想化技術(下記左)は、ホストOS上にゲストOSを構築し、別の環境を構築するものであった。Mac上で動かすWindowsなどが例として分かりやすいだろう。
一方、Dockerはカーネル部分はOSのものを間借りして、他のミドルウェア、アプリケーションをコンテナ単位で隔離して動かすことができる技術である。
これにより、使用するリソースが少なく効率的に仮想環境を動かせるということが画期的である。
要はアプリケーション単位で環境の分離ができる技術である。
基本1つのDockerイメージは1つのプロセスで構成する。そのため変更や細かい修正がしやすいというのも特徴だ。この点も従来の技術に比べた魅力の1つである。
従来の仮想化技術(左)とDocker(右)
Dockerの意義
次にDockerの意義をおさえよう。意義として大きいのは以下の4点である。
- 同じ動作を実現できる。
- コード管理により同じ環境を使いまわせる。本番と同じ開発環境を簡単に構築できる。
- すぐ作れ、すぐ消せる。
- CI/CDツール等を組み合わせて自動化できる。
まずは、1点目の環境構築の品質向上について説明する。 クラウドにせよオンプレにせよ、ディストリビューション(例えばCentOS)やインストール済みのソフトウェア(例えばApacheやPython)の微妙なバージョンの違いによって、動きが異なることはある。 そうした時にDockerを用いれば、必要なソフトウェアのバージョンを揃えられ、それらの差異を無くすことができる。 この点においては、旧来の仮想環境と同様である。Python使いであれば、pyenvでバージョンを合わせるといったことをやるので、このメリットは分かりやすいだろう。 隔離された領域の中で、指定したバージョンの環境構築ができるというのは非常に便利である。確実に同じ動作を実現できる。
2. コード管理により同じ環境を使いまわせる。本番と同じ開発環境を簡単に構築できる。
Dockerで環境構築する際は、Dockerfileとdocker-compose.ymlファイルにインストール内容、ポート等の構築内容を記述する。
DockerfileはApacheなり、Pythonなりの各々のソフトウェアにおける構築内容を示し、
docker-compose.ymlファイルはDockerfileで生成した各image、コンテナを取りまとめるといった役割である。
最初は「コードでLinuxの環境を構築できるんだな」程度の理解で良いと思う。
ただし、その効能は非常に大きい。コード化した環境構築ツールを使うことで、しかもそれがWindows、Mac、Linux問わず動くことで
「メンバーの開発環境を簡単に統一できる」、「テスト環境と本番環境の差異を無くせる」と言ったメリットが生まれる。
Dockerを使わず「あれ、何故か上手く動かない」「バージョンが違う?」「インストールの順番が違う?」という確認にかかるロスは非常に大きい。
誰かが作った確実に動くDocker環境があれば、安心して開発環境、本番環境を共有できるのである。
Docker Composeのイメージ
Docker Composeという全体を管理するタコが、各々のDocker Imageを(コードで)管理しているイメージ。 Docker ImageはDockerfileというコードから生成できる。Docker ComposeはDocker image、Dockerfile、どちらの状態でも管理できる。
当たり前すぎて言及している文章をあまり見ないが、すぐ作れ、直ぐ消せるというのも大きなメリットである。 隔離されたコンテナイメージならではである。「docker rm」コマンドを使えば、簡単に作成したイメージを削除することができる。 Docker自体、不要になったり修正が必要になったら消して新たに作る。そういう性質のものだと思ってくれればいい。
4. CI/CDツールと組み合わせて自動化できる。ここでは、あまり深く説明しない。コード化してるDockerだからこそ、Jenkins等のCI/CDと組み合わせて自動で環境構築を行うことができる。 現段階ではあまりイメージは掴めないと思う。はじめにメリットを実感できるのは前述の3つだろう。
トータルとしてのメリットと留意点これらによって受けられる恩恵は、「提供するサービスの品質向上(確実に同じ動作をする)」「開発時間の短縮」「コスト削減」である。 Web開発においてDockerが欠かせない理由が分かるだろう。 ただし、最初にDockerで環境構築する際はそれなりに時間を要する。確実に動く環境構築方法をコード化する必要があるからだ。この点は留意してほしい。
Dockerの使い方
現在Dockerは、個人の環境ではDocker Desktopを使うことが推奨されている。
(Docker Desktopは250人以上の企業だと有償になるので、この点だけは注意しよう。)
推奨環境はあるが、Windows、Mac、Linux、いずれにおいても使うことができる。
Windowsはここで、
Macはここからインストールして始めてみよう。
インストール後は、チュートリアルに従って進めば、下記のような画面に行きつく。これでDockerを使う準備はできた。
ちなみに、チュートリアルで作ったDockerは既に動いており、80番ポートで接続できる。
試しにブラウザのURLに「localhost」と打てばDockerのチュートリアル画面が出るはずだ。
Docker Desktopの画面
Dockerの一番簡単な使い方としては、Docker Hubから必要なコンテナをダウンロードして使うという方法だ。 WindowsであればPowerShellを開き、「docker pull python:3.10」とコマンドを打ってみよう。 pythonのコンテナがダウンロードされるはずだ。 その後、上記でも示しているpythonコンテナの起動ボタンを押して、青四角で囲んだTerminalボタンを押すか、 powershellのコマンドで「docker exec -it --name (コンテナ名 or コンテナID) python:3.10 bash」と入力してみよう。 コンテナの中に入り、コマンド操作が可能になるはずだ。 ここで「apt-get update」→「apt-get install vim」→「vi 〇〇.py」と打って適当にpythonファイルを作り、 「python 〇〇.py」とpythonファイルを実行すれば、pythonが動作することを確認できる。 これだけで、python3.10が動く仮想環境が作れてしまった。実に簡単である。 下記はpython(上記の一番下の)コンテナに入り、あらかじめ作成したtest.pyファイルを実行した例である。 print("test")が実行されている。
Dockerでpythonを動かす
▼参考図書、サイト
「AWSでDockerを本番運用!AmazonECSを使って低コストでコンテナを運用する実践コース」 Udemy(打田裕馬)
「仕組みと使い方がわかる Docker&Kubernetesのきほんのきほん」 小笠原 種高 マイナビ