Dockerfile から Docker インスタンスを実行する

Isaac Tony 2022年8月23日
Dockerfile から Docker インスタンスを実行する

さまざまな環境でのソフトウェアと依存関係の管理に関しては、Docker コンテナーが間違いなく標準ユニットになっています。実際のアプリケーションで作業する場合は、アプリケーションのコンテナイメージをビルドする前に Docker ファイルを作成する必要があります。

Dockerfile は、Docker イメージをアセンブルするときに指示が設定された読み取り専用のテキストドキュメントです。一方、Docker イメージは、Docker コンテナーの構築に使用される一連の命令、アプリケーションコード、依存関係、ツール、およびライブラリです。

したがって、コンテナーは、Dockerfile からアセンブルされた Docker イメージの実行可能なインスタンスです。

この記事では、Dockerfile を作成し、このファイルから docker インスタンスを実行する手順について説明します。

Dockerfile から Docker インスタンスを実行する手順

Dockerfile から Docker インスタンスを実行するには、以下の手順に従う必要があります。

Dockerfile を作成する

Dockerfile を作成するには、そのコンポーネントを理解する必要があります。最も一般的なコマンドには、次のものがあります。

  • FROM:使用される親/ベースイメージのレイヤーを作成します。
  • WORKDIR:作業ディレクトリを設定できます。
  • COPY:現在のディレクトリの内容をコンテナ内のディレクトリにコピーできます。
  • PULL:Docker リポジトリからファイルを追加します。
  • RUN:イメージをビルドするときに実行されます。
  • CMD:コンテナの起動時に実行するコマンドを指定します。
  • ENV:ビルド中に使用される環境変数を定義します。
  • ENTRYPOINT:コンテナの起動時に実行するコマンドを決定します。
  • MAINTAINER:イメージの作成者を指定します。

Dockerfile を作成するには、まず、Dockerfile をホストするメインディレクトリを作成します。コンソールにメッセージを出力する簡単な Flask アプリケーションを作成します。

mkdir my-app

次に、このディレクトリに移動して、アプリケーションのメインファイルを app.py として作成します。このファイルには、プログラムのアプリケーションコードが含まれています。

from flask import Flask

app = Flask(__name__)


def hello():

    print("Hello, this is a simple Flask application")


hello()

これで、Dockerfile の作成に進み、Docker イメージを作成するために必要なコマンドを入力できます。

touch Dockerfile

また、このアプリケーションを実行するためにインストールするために必要なファイルを含む requirements.txt ファイルを作成しました。要件を以下に示します。

click==8.0.4
Flask==2.0.3
gunicorn==20.1.0
itsdangerous==2.1.0
Jinja2==3.0.3
MarkupSafe==2.1.0
Werkzeug==2.0.3

Dockerfile を編集し、次のコマンドを追加して、docker build コマンドを使用して Docker イメージを作成します。この場合、Python がベースイメージです。

また、作業ディレクトリを設定し、必要なファイルを現在のディレクトリから Docker コンテナのディレクトリにコピーしました。

#  base image
FROM python

# Set your working directory
WORKDIR /var/www/
# Copy the necessary files
COPY ./app.py /var/www/app.py
COPY ./requirements.txt /var/www/requirements.txt

# Install the necessary packages
RUN pip install -r /var/www/requirements.txt
# Run the app
CMD ["echo", "Hello, Developer"]

Docker イメージを作成する

docker build コマンドを使用して Docker イメージを作成します。ただし、このコマンドは同じディレクトリで実行する必要があります。

構文:

$ docker build [OPTIONS] PATH | URL | -

my-app ディレクトリ内で、以下のコマンドを実行します。 -t フラグを使用すると、イメージの名前にタグを付けて、Dockerfile がこのコマンドを実行しているのと同じディレクトリにあることを示すことができます。

~/my-app$ docker build -t new_image .

出力:

[+] Building 184.4s (10/10) FINISHED
 => [internal] load build definition from Dockerfile                                                                                       1.5s
 => => transferring dockerfile: 38B                                                                                                        0.0s
 => [internal] load .dockerignore                                                                                                          1.9s
 => => transferring context: 2B                                                                                                            0.0s
 => [internal] load metadata for docker.io/library/python:latest                                                                          50.8s
 => [1/5] FROM docker.io/library/python@sha256:3204faabc2f0b5e0939bdb8b29079a2a330c38dee92a22482a9ed449c5649a55                           30.4s
 => => resolve docker.io/library/python@sha256:3204faabc2f0b5e0939bdb8b29079a2a330c38dee92a22482a9ed449c5649a55                            0.4s
 => => sha256:3204faabc2f0b5e0939bdb8b29079a2a330c38dee92a22482a9ed449c5649a55 2.14kB / 2.14kB                                             0.0s
 => => sha256:17e2d81e5757980ee40742d77dd5d3e1a69ad0d6dacb13064e1b018a6664ec72 2.22kB / 2.22kB                                             0.0s
 => => sha256:178dcaa62b393b539abc8b866c39be81e8ade01786880dc5d17ce3fe02426dbb 8.55kB / 8.55kB                                             0.0s
 => => sha256:38121472aa0128f87b31fde5c07080418cc17b4a8ee224767b59e24c592ff7d3 2.34MB / 2.34MB                                            10.4s
 => => extracting sha256:38121472aa0128f87b31fde5c07080418cc17b4a8ee224767b59e24c592ff7d3                                                 14.6s
 => [internal] load build context                                                                                                          1.1s
 => => transferring context: 195B                                                                                                          0.0s
 => [2/5] WORKDIR /var/www/                                                                                                                3.2s
 => [3/5] COPY ./app.py /var/www/app.py                                                                                                    1.9s
 => [4/5] COPY ./requirements.txt /var/www/requirements.txt                                                                                2.6s
 => [5/5] RUN pip install -r /var/www/requirements.txt                                                                                    82.3s
 => exporting to image                                                                                                                     8.1s
 => => exporting layers                                                                                                                    6.0s
 => => writing image sha256:5811f24b498ae784af32935318a5fddba536e2be27233b19bf08cad81438d114                                               0.2s
 => => naming to docker.io/library/new_image

以下の docker images コマンドを使用して、docker イメージを一覧表示できるようになりました。

~/my-app$ docker images

出力:

REPOSITORY           TAG       IMAGE ID       CREATED         SIZE
new_image            latest    5811f24b498a   2 minutes ago   929MB

Dockerfile からインスタンスを実行する

この Docker イメージから実行可能なインスタンスを作成するには、docker run コマンドを使用して、前に作成したイメージ上に書き込み可能なレイヤーを作成します。

構文:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

最後に、上記のコマンドを使用して実行可能なインスタンスを作成できます。

~/my-app$ docker run -it new_image
Hello, Developer
著者: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn