[コンテナ入門編]-Dockerで動かしながら学ぶコンテナの基礎
目的
コンテナとは何か、、ChatGPTなどに聞いて
コンテナとは、アプリケーションをその依存関係とともにパッケージ化し、分離された環境で一貫して実行できるようにする技術である
という説明されたとして、コンテナの概要が理解できるでしょうか。。
自分はコンテナがただ言葉で理解しようとしてもよく分かりませんでした。
自分で試さないことにはよく分かりません。
そのため今回は手を動かしながらコンテナとは何かを学ぼうというのが目的です。

Dockerで試すためにインストールしよう!
最初にDockerとは
「コンテナ」を作ったり動かしたり管理するための プラットフォーム/ツール です。
単純に私たちが今回コンテナを理解するために使える道具です。
今回はこのDockerのDesktopを使っていきます。

こちらでお使いのOSに合わせてインストールしておきましょう。
インストールできたら、以下のコマンドをターミナルで実行してバージョンの表示を確認しましょう。
docker --version
バージョンが表示されたらOKです。
DockerでHello worldを行ってみよう!
次はいきなりですが、Hello Worldでコンテナを動かすということを行っていきましょう。
以下のコマンドをターミナルで実行していきます。
このrunコマンドでコンテナを作成・起動することができます。
docker run hello-world
コマンドを実行するとまずこのようなメッセージが出てきます。

具体的にこのコマンドはまず以下を実行しています。
1.「hello-world」というイメージを探す
・ローカル(自分のPC)のキャッシュにあるか調べる
・なければ Docker Hub(公式の公開レジストリ)から自動ダウンロードする
ここで自分の場合はローカルにキャッシュが無いため、Docker Hubからイメージを取得できました。
先ほどの実行結果の下に行くと、このようにHello from Dockerが確認できます。

これは具体的に以下を実行しています。
- 
コンテナを作成して起動する
 ・見つけたイメージをもとに「コンテナ(実際に動く環境)」を作る
 ・コンテナの中でイメージに含まれるプログラムを実行する
 ・例えば hello-world イメージなら「Hello from Docker!」というプログラムが仕込まれていて、それが実行される
これでコンテナというのがまずイメージというもので作成されて、その中のプログラムを実行できることが分かりました。
そして、以下のように操作の詳細もターミナルで結果として表示されているはずです。
ここで裏側でどのように処理がされていたのか分かりますが
ここで書かれているDocker daemonとはなんでしょうか。

Docker daemonってなんだ?
デーモンというと日本だとこんな悪魔みたいな意味を感じます。

しかし、IT用語で使われるデーモンは調べてみると語源は
ギリシャ神話の「ダイモーン(daimon)」
→ 人間を見えないところで助ける精霊のような存在となります。

悪魔とはもはや真逆の意味ですね。。
このデーモンの存在を確かめるために以下のコマンドをターミナルで叩いてみましょう。
docker version
そうするとClient と Serverの両方の情報が表示されるはずです。
Client: 
 Version:28.5.1
...
Server: Docker Desktop 4.48.0
 Engine:
  Version:28.5.1
...
ここでのServerこそがdeamonです。
私たちはクライアントサイドのターミナルでdockerコマンドを使用しました。
そのリクエストを裏側にいるデーモン(dockerd) という精霊みたいなイメージの存在が常駐していて指示通り処理をしているということです。
先ほどのHello-worldの例で言えばデーモンは具体的な操作として、以下のようにリクエストを受けて裏で実際に処理を行う係をしています。
簡単なアプリをDockerで実際に動かしてみよう!
1.最初にアプリを作成してDockerfileを用意してみる
今回はPythonのフレームワークFlaskを用いたシンプルなアプリを作成してみます。
以下のコマンドをターミナルで実行しましょう。
mkdir flask-docker-app
cd flask-docker-app
そして作成されたflask-docker-appの中にapp.pyファイルを作成します。

そこに三つのルーティングを持ち、そこにアクセスされたURL(ルート)ごとに違う文字列を返す
だけの超シンプルなWebアプリ構成を記入してみます。
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
    return "Hello, Docker & Flask!"
@app.route("/about")
def about():
    return "This is a sample Flask app running in a Docker container."
@app.route("/greet/<name>")
def greet(name):
    return f"Hello, {name}! Welcome to Docker + Flask."
if __name__ == "__main__":
    # すべてのホストからアクセスできるように host="0.0.0.0" を指定
    app.run(host="0.0.0.0", port=5000)
これはシンプルにアクセスするURLに合わせて異なるテキストを表示するプログラムです。
・/ → 固定のテキストを返すトップページ
・/about → サンプルアプリの説明ページ
・/greet/<name> → 名前を動的に受け取って挨拶を返すページ
そこに今回必要なライブラリを記載した
requirements.txtというファイルも用意します。
今回はflaskというフレームワークを用いているためflaskのバージョンを記載してあります。
flask==3.0.3

仕上げとしてDockerfileというコンテナの設計図みたいなファイルも用意します。
このファイルにどういう環境を作って、どういうアプリを動かすかをステップごとに書いていきます。
# ベースとなるPythonのイメージを指定
FROM python:3.11-slim
# 作業ディレクトリを作成
WORKDIR /app
# 依存関係ファイルをコピー
COPY requirements.txt .
# Flaskをインストール
RUN pip install --no-cache-dir -r requirements.txt
# アプリのソースをコピー
COPY app.py .
# Flaskが待ち受けるポートを明示
EXPOSE 5000
# Flaskを起動
CMD ["python", "app.py"]

2.イメージを作成してコンテナを起動しよう!
先ほどのDockerfileをもとにイメージを作成することをビルドといいます。
ターミナルで先ほどのアプリの場所に移動してから以下のコマンドを入力してみます。
docker build -t flask-docker-app .
そうするとDocker desktopでイメージが作成されたことが確認できるようになります。

では次にこのイメージを実行してコンテナを立ち上げてみましょう。
ターミナルで以下のコマンドを実行してみます。
docker run -p 5000:5000 flask-docker-app
もしくは、、
Docker DesktopによるGUIでコンテナを起動させることができます。
作成されたImageの右にあるActionsのrunを押下します。

そして、コンテナ名とアクセスのためのポート番号を入力します。

これでコンテナが作成できました。

今までの流れを簡単に振り返るとコンテナを起動するために何をしたのでしょうか?
それはまず
Dockerfile にこのアプリをどんな環境で、どう動かすかを記述しました。
それを ビルド することで、設計図をもとにしたDockerイメージを作成しました。
最後に、そのイメージを起動して実際に動かしました。
イメージを実行して得られる動作中の実体――これがコンテナです。
そうしたら今ローカルで以下のURLからアクセスが可能になります。
・http://localhost:5000/

・http://localhost:5000/about

・http://localhost:5000/greet/rikutaro

結局コンテナってなんだ?可視化してみよう!
私たちはまずアプリを作成した後、Dockerfileを用意しました。
それをパッケージ化したことでイメージができます。

そのイメージを走らせて実行状態にしました。
ここで最初の言葉に戻りましょう。
コンテナとは。。
コンテナとは、アプリケーションをその依存関係とともにパッケージ化し、分離された環境で一貫して実行できるようにする技術であると。
自分の考えるコンテナは以下のような感じです。(手作り感満載)

まとめ
コンテナについて今回は簡単にハンズオンで試してみました。
コンテナは正直言葉で説明されてもよく分かりません。
実際に自分でぽちぽち操作してみて体感として分かってくるような気がします。
ただまだまだコンテナは深いです。
次回に続きます。





Discussion