LoginSignup
1
1

More than 3 years have passed since last update.

Dockerを使ってDjangoの環境構築してみた

Posted at

はじめに

今回Dockerを使ってDjangoの環境構築をしたのでまとめてみたいと思います。
また、DjangoではデフォルトでSQLiteが入っているのですが、PostgreSQLで実装したので、その設定もdockerでやりました。何かの参考になれば嬉しいです。

dockerfile

dockerfile
FROM ubuntu:latest
RUN apt-get -y update \
    && apt-get -y upgrade \
    && apt-get install -y locales curl python3-distutils \
    && curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py \
    && python3 get-pip.py \
    && pip install -U pip \
    && pip install psycopg2-binary \
    && mkdir /code \
    && rm -rf /var/lib/apt/lists/* \
    && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
WORKDIR /req
ADD requirements.txt /req
RUN pip install -r requirements.txt

# サーバーを立てる場所に移動(djangoのprojectを作成して以降)
WORKDIR /web-version/app
# これでbashとか使わずにrunするだけでサーバーが立つ
CMD  python3 manage.py runserver 0:8001

FROM ubuntu:latest : ubuntuの環境を持ってきています
RUN : 主な環境構築をします。ubuntu環境ではapt-getを使うことでいろんなものをインストールしたりアップデートしたりできます。
WORKDIR : フォルダを作成してそのフォルダに移動します。
ADD requirements.txt /req : requirements.txtをコンテナに持ってきます。保管する場所はreqフォルダの中です。

WORKDIR /web-version/app
CMD python3 manage.py runserver 0:8001 : この2行は、コンテナを立ち上げた時に、すぐにサーバが起動してほしくて書きました。manage.pyのあるフォルダに移動してサーバを立ち上げているだけです。
ただ、まだプロジェクトを作成していない段階で実行してもmanage.pyがないのでエラーが起きます。
なので、はじめはCMD ["bash"]として、シェルに入ってプロジェクトを作ると良いです。
また、runserverの後にポートを指定することで、全てのIPからのリクエストを受け付けることができて、コンテナからサーバを立ち上げても、localhostで開くことができました。
詳しくは、djangoの公式サイトをみてください。

requirements.txt
django

docker-compose.yml

docker-compose.yml
version: "3"
volumes:
  db-data:
services: 
    web:
        build: .
        container_name: "web-django"
        ports: 
            - "8001:8001"
        volumes:
            - ".:/web-version/"
        # 下二行は-itと同じ役割
        tty: true
        stdin_open: true
        depends_on: 
            - db

    db:
        image: postgres
        volumes:
            - 'db-data:/var/lib/postgresql/data'

今回サービス名はwebとしました。
10行目のvolumes:でカレントディレクトリを作成したweb-versionというフォルダにマウントしています。

tty: true stdin_open: true: これを指定してあげることで、dockerfileで実行する場合のオプション-itと同じ役割をしてくれます。
depends_on : これはコンテナを立ち上げる順番を決めています。今回は- dbとしているので、db,webの順番でコンテナが起動します。今回はwebというサービスがdbというサービスを参照する形になっているので、このようにしています。

volumes: - 'db-data:/var/lib/postgresql/data' : postgresqlではデータが/var/lib/postgresql/dataに保管されます。そのデータをホスト側に保持しておくためにこれを書いています。なぜホスト側でデータを保持しておくのかというと、もしコンテナを消してしまうと、データも全て失ってしまうからです。失っても良い場合は書かなくても大丈夫です。
ホスト側のdb-dataに保持するのですが、そのフォルダを2,3行目のvolumes: db-data:で作成しています。

これでdockerは終わりですが、djangoでpostgresqlを使うためにはdjangoのsetting.pyを変更する必要があります。

settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'db',
        'PORT': '5432',
    }
}

終わりに

今回dockerを使ってdjangoの環境構築をしてみたのですが、やはりdockerは便利だなと感じました。(テスト環境とかデプロイ環境とかいろんなところでコンテナ使えばもっと便利に感じるはず)
ただこうやってアウトプットしてみてもまだ自分の知識が曖昧な部分があるので(runserverのポートの指定のところとか)、それをこれからもっと深堀りしてみたいです。
まだまだ初心者なので、間違っている点などありましたら、教えていただけると嬉しいです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1