🐍

【Python】DockerでPython環境構築(windows)

2024/06/15に公開

開発環境:

  • windows 11
  • Vscode 1.87.2
  • Docker 26.1.1
  • Docker-compose 2.27.0
  • python

1.Vscodeのダウンロード

1-1. 以下のVscodeのダウンロードサイトへ移動し、Windowsをクリックしダウンロードする。

https://code.visualstudio.com/download

2.Docker-Desktopのインストール

2-1. 以下のサイトでDocker Desktop for Windows -x86_64をクリックする。

https://docs.docker.com/desktop/install/windows-install/

Docker-Desktopに含まれるもの
  • Docker Engine:
    Docker imageをもとにアプリケーションを実行するための環境を整える(コンテナ化する)ためのアプリケーション。1つのDockerコンテナを作成する。
  • Docker CLI クライアント:
    Dockerコマンド(runbuildを実行するためのコマンドラインツール。
  • Docker Compose:
    複数のDockerコンテナを操作および管理するためのアプリケーション。Dockerコンテナが複数存在する環境でも操作がしやすくなる。docker-compose.yamlという名前のファイル(指示書)に、各コンテナに対する設定をあらかじめ定義しておく。
  • Notary:
    コンテナイメージに暗号化署名を付与するためのツール。
  • Kubernetes (K8s):
    コンテナ化されたアプリケーションのデプロイ、スケーリング、および管理を自動化します。Kubernetesは、多くのコンテナを一貫して管理し、複雑な分散システムを効率的に運用するための強力なツール。
  • Credential Helper:
    docker login の認証状態をいい感じに管理してくれるもの。
インストールされたかを確認する方法
Windows Power Shellまたはコマンドプロンプト
docker -v または docker version
Windows Power Shellまたはコマンドプロンプト
docker-compose -v または docker-compose version

3.プロジェクトフォルダの作成

3-1. 以下のコマンドを実行し、プロジェクトフォルダを作成する。

Windows Power Shellまたはコマンドプロンプト
mkdir test-python-project

3-2. 対象のディレクトリに移動する。

Windows Power Shellまたはコマンドプロンプト
cd test-python-project

4.VScodeでフォルダを開く

4-1. 作成したプロジェクトフォルダをVScodeで開く。(作成者を信頼しますをクリックする)

Windows Power Shellまたはコマンドプロンプト
code .

5.Dockerfileを作成

5-1. 手動でVScodeにDockerfileを作成する。

5-2. 先ほど作成したDockerfileに以下のコードを貼り付ける。

Dockerfile
# ベースイメージとして公式のPythonイメージを使用
FROM python:3

# 作業ディレクトリを設定
WORKDIR /app

# 必要なライブラリをインストールするためのrequirements.txtをコピー
COPY requirements.txt .

# ライブラリのインストール
RUN apt-get update && apt-get install -y \
  libpq-dev \
  && pip install --upgrade pip \
  && pip install -r requirements.txt

# プロジェクトファイルをコンテナにコピー
COPY . .

# ポート8000を開放
EXPOSE 8000

# Django開発サーバーを起動
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

ビルド(build)とは

ソースコード上に問題がないか解析した上で、問題がなければ機械語に翻訳し、それぞれのファイルを組み合わせること。

Dockerfileの構成要素
  • FROM:
    ベースイメージを指定します。この場合、Pythonのイメージを使用しています。
  • WORKDIR:
    作業ディレクトリを設定します。ここで指定したディレクトリがコンテナ内での作業ディレクトリとなります。
  • RUN:
    コマンドを実行します。ここでは、pipのアップグレードと依存関係のインストールを行っています。
  • COPY:
    ファイルやディレクトリをホストマシンからコンテナにコピーします。
  • CMD:
    コンテナが実行されたときに実行されるデフォルトのコマンドを指定します。

6.requirements.txtファイルの作成

6-1. 手動でプロジェクトディレクトリ内にrequirements.txtを作成。

6-2. 以下のコードをファイル内にコピーして貼り付ける。

requirements.txt
Django>=3.0,<4.0
psycopg2-binary>=2.8

7.docker-compose.ymlファイルの作成

7-1. 手動でdocker-compose.ymlを作成する。

7-2. 以下のコードを貼り付ける。

docker-compose.yml
services:
  web:
    # ディレクトリ(.)にあるDockerfileを使用してコンテナイメージをビルドする
    build: .
    # コンテナが起動されたときに実行されるデフォルトのコマンド
    command: python manage.py runserver 0.0.0.0:8000
    # ボリュームの設定を行うために記述する
    volumes:
      - .:/app
    # host_port:container_portという表現で、これにより、コンテナ内のアプリケーションが外部からアクセス可能となる
    ports:
      - "8000:8000"
    # 依存しているサービスが起動している場合にのみ起動(下記はDBが起動してwebが起動という意味)
    depends_on:
      - db

  db:
    image: postgres:13
    environment:
      POSTGRES_DB: mydatabase
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
    ports:
      - "5432:5432"
docker-compose.ymlファイルの中身について詳しく知りたい場合

8.Dockerコンテナのビルド

8-1. 以下のコマンドを実行し、Dockerコンテナをビルドする。

ターミナル
docker-compose build
実行結果
> docker-compose build  
[+] Building 0.0s (0/0)  docker:default
2024/06/14 21:59:31 http2: server: error reading preface from client //./pipe/docke[+] Building 101.3s (13/13) FINISHED                                docker:default
 => [web internal] load build definition from Dockerfile                      0.1s
 => => transferring dockerfile: 637B                                          0.0s 
 => [web internal] load metadata for docker.io/library/python:3               3.5s 
 => [web auth] library/python:pull token for registry-1.docker.io             0.0s
 => [web internal] load .dockerignore                                         0.2s
 => => transferring context: 2B                                               0.0s 
 => [web 1/7] FROM docker.io/library/python:3@sha256:4584ea46d313a10e849eb7  50.4s
 => [web 2/7] WORKDIR /app                                                    5.6s
 => [web 3/7] COPY requirements.txt .                                         0.3s
 => [web 4/7] RUN apt-get update                                             13.7s
 => [web 5/7] RUN pip install --upgrade pip                                   4.8s 
 => [web 6/7] RUN pip install -r requirements.txt                            20.5s 
 => [web 7/7] COPY . .                                                        0.3s 
 => [web] exporting to image                                                  1.4s 
 => => exporting layers                                                       1.3s 
 => => writing image sha256:dfc0e89e5b8d8922b9127af037e54472fd78847bd36a5875  0.0s 
 => => naming to docker.io/library/test-python-web                            0.0s 

8-2. Docker desktopにてコンテナが立ちあがったことを確認する。

9.Djangoプロジェクトフォルダの作成と編集

9-1. 以下のコマンドを実行し、Djangoプロジェクトを作成する。

ターミナル
docker-compose run web django-admin startproject myproject .
出力結果

9-2. プロジェクトが作成されたことを確認する。

9-3. myproject/settings.pyファイルを開き、データベース設定を以下のように変更する。

myproject/settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydatabase',
        'USER': 'myuser',
        'PASSWORD': 'mypassword',
        'HOST': 'db',
        'PORT': '5432',
    }
}

9-4. マイグレーションの実行

ターミナル
docker-compose run web python manage.py migrate
出力結果
docker-compose run web python manage.py migrate
[+] Creating 1/0
 ✔ Container test-python-db-1  Running                                        0.0s 
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK

10.コンテナの起動とブラウザ表示確認

10-1. 以下のコマンドを実行し、コンテナを起動する。

ターミナル
docker-compose up
出力結果
> docker-compose up
[+] Running 2/2
 ✔ Container test-python-db-1   Running                                       0.0s 
 ✔ Container test-python-web-1  Created                                       1.3s 
Attaching to db-1, web-1
web-1  | Watching for file changes with StatReloader
web-1  | [14/Jun/2024 13:26:40] "GET / HTTP/1.1" 200 10697
web-1  | [14/Jun/2024 13:26:40] "GET /static/admin/css/fonts.css HTTP/1.1" 200 423 
web-1  | [14/Jun/2024 13:26:40] "GET /static/admin/fonts/Roboto-Light-webfont.woff HTTP/1.1" 200 85692
web-1  | [14/Jun/2024 13:26:40] "GET /static/admin/fonts/Roboto-Regular-webfont.woff HTTP/1.1" 200 85876
web-1  | [14/Jun/2024 13:26:40] "GET /static/admin/fonts/Roboto-Bold-webfont.woff HTTP/1.1" 200 86184
web-1  | Not Found: /favicon.ico
web-1  | [14/Jun/2024 13:26:41] "GET /favicon.ico HTTP/1.1" 404 2113


v View in Docker Desktop   w Enable Watch

10-2. ブラウザhttp://localhost:8000/にアクセスし、ブラウザの表示を確認する。

参考

https://docs.docker.jp/docker-for-windows/install.html

Discussion