1. Dockerの存在意義と使う意味
そもそもコンテナとは何かから理解することが重要です。
コンテナとは
例えると、あなたとあなたの姉はボイストレーナーだとします。レコーディング専用の家(サーバー)を買ったとします。いえ全部を防音施工するにはコストがかかりすぎる。
あなたは目一杯声を出しても近所迷惑しないために防音室(コンテナ)を一つ作りました。これで近所迷惑しません。ある日姉も練習したいと言いましたが、流石に同じ防音室だとお互いやってること違うしうるさいだろう。そしたらもう一個姉用の家を買って防音室作るか〜と思ったら金欠でした。そこで既に作った防音室の隣に新しい防音室を作りました。
この二つの防音室とも収納、音響設備、トイレ完備で全部それってます。弟に「スピーカーかして〜」などという必要は全くないのです。
もちろん、家自身にも収納、必要な設備、トイレは完備されています。最高です。
コンテナとは、お互い影響、干渉しない隔離された実行環境
を提供する技術であり、その一つとしてDockerがある。
Dockerとは?
Dockerは、このコンテナ技術を誰でも簡単に利用できるようにした、現在最も広く使われているプラットフォームです。コンテナの作成、起動、停止、共有などを簡単に行うためのツールやサービスを提供します。dockerの他にも、Podmanなどがあります。
Dockerの利点
🔺開発者がアプリケーションとその依存関係をシステムから切り離して、コードを一貫性を持って実行できるようにするものです。
✅ あるサーバー上に複数のコンテナを立てた時、互いに干渉せず、self-containedな軽量な実行環境を用意できる
もし共通の楽譜とか使ってたら、姉と弟ではキーが違うから困る、ということが起きない。
2. Dockerを構成する要素
大前提として、DockerはLinux上で動作するソフトです。よって実際の本番環境などはEC2とかでOSがLinuxのインスタンス(サーバー)を用意する必要があります。
用意ができたらその上にDocker engineをインストールすればコンテナを実行できるようになります。
Docker engineをインストールしたコンピューターをDockerホストという。
3. Dockerイメージとコンテナの関係性
Dockerでは、イメージとコンテナは2つの主要な概念です。
Dockerイメージは、コンテナを実行するために必要なすべての情報を含む静的なスナップショットです。具体的には、コンテナで実行するアプリケーションとその依存関係、環境変数、ファイルシステムなどを含みます。Dockerイメージは、Dockerfile
というテキストファイルを元に作成されます。
Dockerコンテナは、Dockerイメージから生成され、実際にアプリケーションを実行するためのランタイム環境です。イメージは読み取り専用で、コンテナはそのイメージの実行可能なインスタンスで、書き込み可能な層を持ちます。
Dockerイメージとコンテナの関係は、クラスとインスタンスの関係に似ています。イメージはクラスのように、どのような状態や振る舞いを持つべきかを定義しています。一方、コンテナはそのイメージ(クラス)から生成され、実際にその定義に従って動作するインスタンスです。
4. Dockerの活用例
本番環境で、複数のサーバーで構成されたクラスター
上でコンテナ群を管理するには、Kubernetes
のようなオーケストレーションツールがよく使われます。
AWSでこれを実現する場合、マネージドKubernetes
であるEKS
や、AWS独自のECS
といったサービスが主に活用されています。
5. Dockerのコマンドの意味を理解し、使いこなせる
ここでは基本的なDockerコマンドについて説明します:
-
docker container run
: 新しいコンテナを作成して実行します。docker container run <image>
でイメージ名を指定します。
ここでは、docker container run hello-world
をterminalで叩いてみましょう。その前に必ずDocker desktop をインストールし、サインアップ(任意)して、立ち上げておいてください。
そうすると下のようなものが出てきます。
Hello from Docker
とありますね。
-
docker image pull ubuntu
を実行して、Ubuntuのイメージをpullしてみましょう。
docker image ls
で確認しよう。
-
docker rm
: このコマンドを使ってさきほどpullしたUbuntoを削除します。docker rm <container id>
でコンテナIDを指定します。
-
docker ps
: 現在稼働中のコンテナのリストを表示します。-a
オプションを使うと、稼働中でないコンテナも表示されます。 -
docker stop
: 稼働中のコンテナを停止します。docker stop <container id>
でコンテナIDを指定します。 -
docker images
: ローカルに保存されているイメージのリストを表示します。 -
docker container rm <image id>
: イメージを削除します。`でイメージIDを指定します。 -
docker image pull
: Docker Hubからイメージをダウンロードします。docker image pull
でイメージ名を指定します。 -
docker image build
: Dockerfileからイメージをビルドします。docker image build -t <tag> .
でタグ名を指定し、.
はDockerfileがあるディレクトリを指定します。
3. Docker composeで複数のコンテナを効率的に扱える
Docker Composeは、複数のDockerコンテナを一括で管理するためのツールです。YAMLファイルでアプリケーションのサービスを定義し、一つのコマンドでこれらのサービスを一緒に作成、開始、停止することができます。
docker-compose.yml
ファイルは以下のような形式で記述します:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
この例では、2つのサービス、webとredisを定義しています。webサービスは現在のディレクトリのDockerfileからビルドし、ポート5000を外部に公開します。redisサービスはDocker Hubのredis:alpine
イメージを使用します。
主なDocker Composeのコマンドは以下のとおりです:
-
docker-compose up
: Docker Composeファイルに定義されたすべてのサービスを起動します。 -
docker-compose down
: Docker Composeファイルに定義されたすべてのサービスを停止し、ネットワークとボリュームも削除します。 -
docker-compose ps
: Docker Composeで管理されている現在稼働中のサービスを一覧表示します。 -
docker-compose build
: Docker Composeファイルに定義されたすべてのサービスをビルドします。