Dockerを使用してアプリケーションをコンテナー化する方法と、DockerComposeを使用して開発環境でアプリケーションを実行する方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/908cd5f9-e410-73b3-91f5-979bb0dd5066.png)

#はじめに
Dockerは、最も人気のあるコンテナ化テクノロジーの1つです。使いやすく、開発者にとって使いやすいツールであり、他の同様のテクノロジーよりもスムーズで簡単に使用できるという利点があります。 2013年3月の最初のオープンソースリリース以来、Dockerは開発者や運用エンジニアから注目を集めています。 Docker Inc.によると、DockerユーザーはDocker Hubに1050億を超えるコンテナーをダウンロードし、580万のコンテナーをドッキングしました。このプロジェクトには、Githubに32Kを超えるスターが集まっています。

それ以来、Dockerが主流になり、10万を超えるサードパーティプロジェクトがこのテクノロジーを使用しており、コンテナ化スキルを持つ開発者の需要が高まっています。

このブログ記事では、Dockerを使用してアプリケーションをコンテナー化する方法と、DockerComposeを使用して開発環境でアプリケーションを実行する方法について説明します。 メインアプリとしてPythonAPIを使用します。

[MetricFire](https://www.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Develop%20and%20Deploy%20a%20Python%20API%20with%20Kubernetes%20and%20Docker)の[無料デモを予約](https://www.metricfire.com/demo-japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Develop%20and%20Deploy%20a%20Python%20API%20with%20Kubernetes%20and%20Docker)して、Docker、Kubernetes、Pythonのセットアップを監視する方法を確認してください。

#開発環境のセットアップ
開始する前に、いくつかの要件をインストールします。 ここではFlaskで開発されたミニPythonAPIを使用します。 FlaskはPythonフレームワークであり、APIのプロトタイプを迅速に作成するための優れた選択肢です。 私たちのアプリケーションはFlaskを使用して開発されます。 Pythonに慣れていない場合は、このAPIを作成する手順を以下に示します。

Python仮想環境を作成して、依存関係を他のシステム依存関係から分離しておくことから始めます。 その前に、人気のあるPythonパッケージマネージャーであるPIPが必要です。

インストールは非常に簡単です。次の2つのコマンドを実行する必要があります。

```
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py
```

参考までに、Python3がインストールされている必要があります。 次のように入力して、これを確認できます。

```
​python --version​
```

PIPをインストールした後、次のコマンドを使用して仮想環境をインストールします。

```
​pip install virtualenv​
```

公式ガイドに従って、他のインストール方法を見つけることができます。 次に、仮想環境を作成する必要があるフォルダーのプロジェクトを作成し、それをアクティブ化します。 また、アプリ用のフォルダーとapp.pyというファイルを作成します。

```
mkdir app
cd app
python3 -m venv venv
. venv/bin/activate
mkdir code
cd code
touch app.py
```

特定の都市の天気を表示する簡単なAPIを作成します。 たとえば、ロンドンの天気を表示したいとします。 ルートを使用してリクエストする必要があります：

```
/london/uk
```

PIPを使用して「flask」および「requests」と呼ばれるPython依存関係をインストールする必要があります。 後でそれらを使用します：

```
pip install flask requests​
```

要件ファイルは次のようになります。

```
certifi==2019.9.11
chardet==3.0.4
Click==7.0
Flask==1.1.1
idna==2.8
itsdangerous==1.1.0
Jinja2==2.10.3
MarkupSafe==1.1.1
requests==2.22.0
urllib3==1.25.7
Werkzeug==0.16.0
```

これはAPIの初期コードです。

```
from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return 'App Works!'

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=5000)
```

テストするには、python app.pyを実行し、http：//127.0.0.1：5000 /にアクセスする必要があります。 「AppWorks！」が表示されます。 Webページで。 openweathermap.orgのデータを使用するので、必ず同じWebサイトでアカウントを作成し、APIキーを生成してください。

次に、APIに特定の都市の気象データを表示させるための便利なコードを追加する必要があります。

```
@app.route('/&lt;string:city&gt;/&lt;string:country&gt;/')
def weather_by_city(country, city):
    url = 'https://samples.openweathermap.org/data/2.5/weather'
    params = dict(
        q=city + "," + country,
        appid= API_KEY,
    )
    response = requests.get(url=url, params=params)
    data = response.json()
    return data
```

全体的なコードは次のようになります。

```
from flask import Flask
import requests

app = Flask(__name__)

API_KEY = "b6907d289e10d714a6e88b30761fae22"

@app.route('/')
def index():
    return 'App Works!'

@app.route('/&lt;string:city&gt;/&lt;string:country&gt;/')
def weather_by_city(country, city):

    url = 'https://samples.openweathermap.org/data/2.5/weather'
    params = dict(
        q=city + "," + country,
        appid= API_KEY,
    )

    response = requests.get(url=url, params=params)
    data = response.json()
    return data

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=5000)
```

127.0.0.1:5000/london/ukにアクセスすると、次のようなJSONが表示されるはずです。

```
{
  "base": "stations",
  "clouds": {
    "all": 90
  },
  "cod": 200,
  "coord": {
    "lat": 51.51,
    "lon": -0.13
  },
...
```

ミニAPIが機能しています。 Dockerを使用してコンテナ化しましょう。


#Dockerを使用してアプリのコンテナーを作成
APIのコンテナを作成しましょう。 最初のステップは、Dockerfileを作成することです。 Dockerfileは、Dockerデーモンがイメージを構築するために従う必要のあるさまざまな手順と指示を含む有益なテキストファイルです。 イメージをビルドした後、コンテナを実行できるようになります。

Dockerfileは常にFROM命令で始まります。

```
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /app
WORKDIR /app
COPY requirements.txt /app
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
COPY . /app
EXPOSE 5000
CMD [ "python", "app.py" ]
```

上記のファイルでは、次のことを行いました。

1. 「python：3」というベースイメージを使用
2. また、PYTHONUNBUFFEREDを1に設定。PYTHONUNBUFFEREDを1に設定すると、ログメッセージをバッファリングする代わりにストリームにダンプできます。
3. また、フォルダー/ appを作成し、それをworkdirとして設定
4. 要件をコピーし、それを使用してすべての依存関係をインストール
5. アプリケーションを構成するすべてのファイル、つまりapp.pyファイルをworkdirにコピー
6. アプリがこのポートを使用するため、最終的にポート5000を公開し、app.pyを引数としてpythonコマンドを起動。 これにより、コンテナの起動時にAPIが起動します。

Dockerfileを作成したら、イメージ名と選択したタグを使用してDockerfileをビルドする必要があります。 この場合、名前として「weather」を使用し、タグとして「v1」を使用します。

```
docker build -t weather:v1 .
```

Dockerfileとapp.pyファイルを含むフォルダー内からビルドしていることを確認してください。

コンテナをビルドした後、次を使用して実行できます。

```
docker run -dit --rm -p 5000:5000 --name weather weather:v1
```

-dオプションを使用するため、コンテナーはバックグラウンドで実行されます。 コンテナは「weather」（-name weather）と呼ばれます。 ホストポート5000を公開されたコンテナポート5000にマッピングしたため、ポート5000でも到達可能です。

コンテナの作成を確認したい場合は、以下を使用できます。

```
docker ps
```

次の出力と非常によく似た出力が表示されるはずです。

```
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                    NAMES
0e659e41d475        weather:v1          "python app.py"     About a minute ago   Up About a minute   0.0.0.0:5000-&gt;5000/tcp   weather
```

これでAPIをクエリできるようになります。 CURLを使用してテストしてみましょう。

```
curl http://0.0.0.0:5000/london/uk/
```

最後のコマンドがJSONを返す必要がある場合：

```
{
  "base": "stations",
  "clouds": {
    "all": 90
  },
  "cod": 200,
  "coord": {
    "lat": 51.51,
    "lon": -0.13
...
}
```

#開発のためのDockerComposeの使用
Docker Composeは、マルチコンテナーDockerアプリケーションを定義および実行するためにDockerInc。によって開発されたオープンソースツールです。 Docker Composeは、開発環境で使用することを目的としたツールでもあります。これにより、コンテナーを手動で再起動したり、変更のたびにイメージを再構築したりすることなく、コードの更新時にコンテナーを自動再ロードできます。 Dockerコンテナのみを使用して開発するComposeがないと、イライラするでしょう。

実装部分では、「docker-compose.yaml」ファイルを使用します。

これは、APIで使用している「docker-compose.yaml」ファイルです。

```
version: '3.6'
services:
  weather:
    image: weather:v1
    ports:
      - "5000:5000"
    volumes:
      - .:/app
```

上記のファイルで、イメージ「weather：v1」を使用するようにサービス「weather」を構成したことがわかります。 ホストポート5000をコンテナポート5000にマップし、現在のフォルダをコンテナ内の「/ app」フォルダにマウントします。

イメージの代わりにDockerfileを使用することもできます。 すでにDockerfileがあるので、この場合はこれをお勧めします。

```
version: '3.6'
services:
  weather:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/app
```

ここで、「docker-compose up」を実行してサービスの実行を開始するか、「docker-composeup--build」を実行してビルドしてから実行します。

#まとめ
この投稿では、ミニPython API用のDockerコンテナーを作成する方法を確認し、DockerComposeを使用して開発環境を作成しました。 GoやRailsなどの別のプログラミング言語を使用している場合は、いくつかの小さな違いを除いて、通常は同じ手順に従います。 [MetricFire](https://www.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Develop%20and%20Deploy%20a%20Python%20API%20with%20Kubernetes%20and%20Docker)の[無料デモを予約](https://www.metricfire.com/demo-japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Develop%20and%20Deploy%20a%20Python%20API%20with%20Kubernetes%20and%20Docker)して、[MetricFire](https://www.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Develop%20and%20Deploy%20a%20Python%20API%20with%20Kubernetes%20and%20Docker)が監視環境に適合するかどうかを確認してください。