見出し画像

DockerでDjangoのロケットを飛ばしてみる # 171日目

エラーにハマっており更新が滞りました…!

Django Rest Framework (以下、DRF)を学んでいる途中ですが、技術書のサンプルアプリなどを作っていく際、どうせならDockerを絡めて動作させたいなと考え、まずはDocker環境でDjangoが動くかどうか試してみました。

簡単にできるかと思っていましたが、見事にハマってしまったので、DockerでDjangoのロケットを飛ばす所までをどうやって実装したかメモしていきます。

過去のDocker関連の記事はこちらにまとめています。


まずフォルダの構成は以下です。
optファイルをマウントして仮想環境で操作します。optに入っているのはDjangoのファイルですが、これはDockerコンテナを立ち上げた後に仮想環境内で作成します。

dev_docker  __ opt________________________ config
           |                            |_ manage.py
           |__ docker-compose.yml      
           |
           |__ Dockerfile


まずDockerfileは以下のように記載しました。これはDockerイメージを作成する際の環境設定を記述するファイルです。

今回はDockerが用意してくれている「python」というオフィシャルイメージを使っています。また、DRFの設定を色々と試したいので、DRF関連のライブラリもふんだんにpip installしています。

[Dockerfile]
 
FROM python:3
USER root

# 以下はLinuxのコマンド。日本語やpipjupyterlabの設定をしている
RUN apt-get update
RUN apt-get -y install locales && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm

RUN apt-get install -y vim less
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools

RUN python -m pip install django
RUN python -m pip install djangorestframework
RUN python -m pip install markdown
RUN python -m pip install django-filter
RUN python -m pip install django-cors-headers
RUN python -m pip install djoser
RUN python -m pip install djangorestframework-simplejwt


次にdocker-compose.ymlです。これはイメージをビルドする際などに使うDockerコマンドがまとまっているファイルで、これを使うとコマンドがシンプルになり、繰り返し同じコマンドを使いやすくなります。

ここで重要なのはvolumesとportsの設定です。volumesで自分の環境にあるoptフォルダが仮想環境にマウントされ、portsでポートマッピング(自分の環境のポート番号と仮想環境のポート番号を対応させる)を行っています。

[docker-compose.yml]

version: '3.8'
services:
  python3:
    restart: always
    build: .
    container_name: 'drf_test'
    working_dir: '/root/'
    tty: true
    volumes:
      - ./opt:/root/opt
    ports:
      - "8000:8000"

Djangoでロケットを飛ばす際、runserverしてローカルホストにアクセスします。そのためポートマッピングで8000番をマッピングしておきます。

ただ、ここで重要な注意点があります。

このままコンテナを立ち上げてDjangoのプロジェクトを立ち上げても、コンテナ内でローカルホストで起動するアプリには外部から接続ができません。コンテナ内のローカルホストはこれまたコンテナ内で完結していて、ポートマッピングしてもホストと接続されているわけではないからです。

(今の理解で図示しましたが、もし間違っていたらご指摘ください。。)

つまりアプリを起動する際にコンテナネットワークのIPをバインドして、コンテナ内部と接続する必要があります。

実際にDjangoを立ち上げて試してみたいと思います。


まずはコンテナを立ち上げてイメージをビルドします。
作業フォルダにcdしてから以下のコマンドです。

docker compose up -d --build

立ち上がっているか以下のコマンドで確認します。

docker container ls

以下のような結果が出るので、CONTAINER IDをコピーしておきます。

CONTAINER ID   IMAGE                COMMAND     CREATED         STATUS         PORTS                    NAMES
7805eeb94e4f   dev_docker_python3   "python3"   7 minutes ago   Up 7 minutes   0.0.0.0:8000->8000/tcp   drf_test

コンテナネットワークのIPアドレスを以下コマンドで調べておきます。

docker inspect 7805eeb94e4f

下の方にNetworksという項目があり、その中のIPAdressをこぴーしておきます。

 "Networks": {
                "dev_docker_default": {

                   ~ 略 ~

                    "IPAddress": "172.XX.X.X",
 
          ~ 略 ~


次に仮想環境に入ってDjangoプロジェクトを立ち上げます。

まずは仮想環境に入ります。root@~という表示が出れば成功です。

docker compose exec python3 bash

optフォルダ内に作りたいのでフォルダを移動します。

cd opt

いつも通りDjangoのプロジェクトを立ち上げます。

django-admin startproject config .

runserverしてロケットを飛ばします。ここで先ほどコピーしておいたコンテナネットワークのIPAdressを使い、コンテナ内部とコンテナネットワークのバインドを忘れずに併記します。

python manage.py runserver 172.19.0.2:8000


すると無事にロケットが飛びました!!


これで一先ずDocker環境でDjangoをいじってみる準備は整いました。
これからDRFを色々実装してみようと思います。


ここまでお読みいただきありがとうございました!


参考


この記事が気に入ったらサポートをしてみませんか?