【CentOS8】DockerコンテナでDjango起動確認(ConoHaVPS)エラー対応あり


ConoHaVPSでCentOS8をインストールしDockerコンテナ上で「Django」を起動させるまでをまとめました。
また、外部からのアクセスまで確認しているので参考にしてください。

CentOS8におけるDjangoの環境は以下となります。

プロジェクトフォルダ

$ pwd
/docker/www/django

CentOS8のバージョン

CentOS Linux release 8.1.1911 (Core)

DockerコンテナでDjango起動・外部アクセス確認

今回、Dockerコンテナで「Django」を起動するには、事前にDockerのインストールが前提となります。
Dockerインストールについては以下のページを参考にしてください。

【CentOS7】Dockerインストールと起動(無償版CE)

2020年2月22日

まずは、Djangoを動かすための指定フォルダを作成します。
作成は「mkdir」コマンドで作成します。

$ mkdir django
$
$ pwd
/docker/www/django

次にDjangoを起動するにあたり、以下の2つのファイルを作成します。

  • Dockerfile
  • requirements.txt

それぞれのファイルの作成と注意点については以下を参考にしてください。

CentOS8環境下での「Dockerfile」と「requirements.txt」作成とエラーについて

CentOS8の環境下においてDockerfileを作成する際、ビルドコマンド実行時に以下のようなエラーが発生します。

WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f8384a8ca90>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution')': /simple/django/
ERROR: Could not find a version that satisfies the requirement Django (from -r requirements.txt (line 1)) (from versions: none)
ERROR: No matching distribution found for Django (from -r requirements.txt (line 1))
ERROR: Service 'web' failed to build: The command '/bin/sh -c pip install -r requirements.txt' returned a non-zero code: 1

このエラーは、djangoのpipインストールの失敗が原因となっています。
原因は、コンテナ上で作成されたpythonで、pipインストールをする際、「名前解決ができない」ことにより、外部アクセスが失敗し、インストールに失敗してしまうこととなります。

解決策としてネット上で書かれている「nameserver」に外部DNSのアドレスを記載してもコンテナ上でhostsが機能せず、結果名前解決ができません。


CentOS8のDockerコンテナでpipインストールを実施する際は「プロキシサーバ」で解決

今回の解決策として、ホストのCentoOS8でプロキシサーバを立てることで事象を解決しています。

このプロキシサーバ経由で外部アクセスコマンドを実行することにより、プロキシサーバが名前解決をし、うまくインストールができるようになります。
※pip以外の外部接続コマンド「yum」なども同じです。

プロキシサーバのインストールは以下のページを参考にしてください。

【CentOS8】プロキシサーバのインストール設定手順

2020年3月22日

プロキシサーバインストール

CentOS8で以下のコマンドで「Squid」をインストールします。

$ yum -y install squid

インストールが成功した後、以下コマンドで「Squid」を起動します。

$ systemctl start squid
$ systemctl enable squid

デフォルトのプロキシサーバのポート番号は「3128」となります。
ファイアウォールで3128番のポートを開放しておきましょう。

Dockerfileの作成

Djangoをビルドするために必要となる「Dockerfile」の作成は以下となります。

$ touch Dockerfile

Dockerfile編集

$ vim Dockerfile

※Dockerfile

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install --proxy=118.27.xx.xx:3128 --upgrade pip
RUN pip install --proxy=118.27.xx.xx:3128 -r requirements.txt
ADD . /code/

pip installは上記で作成した「プロキシサーバ」経由でインストールをします。
ここは重要なところなので覚えておきましょう。

「requirements.txt」の作成

次にpip installを実施するライブラリを「requirements.txt」で書き込みます。
今回は、「Django」とPostgreSQLの連携に必要な「psycopg2」をインストールします。

以下では、バージョン指定をしていないので最新のバージョンでインストールすることになります。

# cat requirements.txt
Django
psycopg2

Dockerイメージの作成

上記で作成した、「Dockerfile」と「requirements.txt」を利用してビルドを実行します。

「Dockerfile」と「requirements.txt」がある「django」フォルダに移動して、ビルドコマンドを実行します。
また、イメージ名は「django」とします。

$ pwd
/docker/www/django
$

ビルドコマンドは以下となります。
最後に「Successfully」となれば成功です。

$ docker build -t django .

Successfully built aad3f8d089c9
Successfully tagged django:latest

以下コマンドで、「django」と「python」のイメージがインストールされていることを確認します。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
django              latest              aad3f8d089c9        58 minutes ago      976MB
postgres            latest              73119b8892f9        2 weeks ago         314MB
nginx               latest              6678c7c2e56c        2 weeks ago         127MB
python              3                   f88b2f81f83a        3 weeks ago         933MB
adminer             latest              9519517dc56c        4 weeks ago         87.7MB
$

Docker上で「Django」コンテナの起動

作成した「django」イメージを元にコンテナを作成し、起動させます。
djangoをdockerで動かすために、「-p」オプションでポートフォワーディングをします。

また、ホストとコンテナで「web」ディレクトリを共有するために、「-v」オプションでマウントをします。

コンテナ名は「django-test」となります

# docker run -itd -p 0.0.0.0:8000:8000 -v /docker/www/django/web:/code --name django-test django

また、ここで重要なところは、自身のアドレスに対して記載する際、「127.0.0.1」は起動後、アクセスエラーとなってしまうので注意しましょう。
上記コマンドの通り、「0.0.0.0」の指定で正常にアクセスができました。
※ちなみに「localhost」もエラーではじかれます。

コンテナが正常に起動すると以下で確認できます。

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
6b1dd000d076        django              "python3"           About an hour ago   Up About an hour    0.0.0.0:8000->8000/tcp   django-test
$

Djangoプロジェクト作成

「web」フォルダ配下でDjangoプロジェクトを作成します。

$ cd /docker/www/django/web/

Webフォルダは以下で以下コマンドで「Django」プロジェクトを作成します。

$ docker exec django-test django-admin startproject djangotest .

正常にプロジェクトが作成されると以下のようにフォルダ・ファイルが作成されます。

$ tree
.
--- djangotest
|---- asgi.py
|---- __init__.py
|---- settings.py
|---- urls.py
|---- wsgi.py
--- manage.py

1 directory, 6 files
$

※重要:Djangoにアクセスする「settings.py」を編集

Django起動しても以下の設定をしないとアクセスができません。
「settings.py」で指定の行を編集します。

※ここ大事

$ vim djangotest/settings.py

「ALLOWED_HOSTS」の行で、[] → [“*”]へ変更します。

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = ["*"]

編集は「i」コマンドで、保存して抜ける場合は「Esc」を押して「:wq」となります。

「Django」を起動

ここまで作成できれば、あとはDjangoを起動するだけとなります。

以下コマンドで、Djangoを起動します。

$ docker exec django-test python3 manage.py runserver 0.0.0.0:8000
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
March 23, 2020 - 08:51:51
Django version 3.0.4, using settings 'djangotest.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.


バックグラウンドで起動する場合

バックグラウンドでDjangoを起動する場合はオプションで「-d」を付けます。

※バックグラウンドで起動しなくてもDjangoコンテナは起動し続けます。
 停止する場合は「docker stop」コマンドを実行します。

$ docker exec -d test python3 manage.py runserver 0.0.0.0:8000

Django起動後、外部アクセスをすると以下のようにDjangoのページが表示されます。

外部アクセスをする場合はファイアウォールでポート許可をすること

今回、Djangoへのアクセスはポート番号「8000」番を利用しています。
外部アクセスをする場合は、ファイアウォールで「8000」番を開放しておきましょう。

$ firewall-cmd --add-port=3128/tcp --zone=public --permanent
$ firewall-cmd --reload

Djangoへのアクセスポート「8000」番が解放されていることを確認

$ firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: cockpit dhcpv6-client http postgresql ssh
  ports: 8000/tcp 80/tcp 5432/tcp 3128/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

$

CentOS8環境下でDockerコンテナでDjangoを起動する手順は以上となります。


関連記事


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

ABOUTこの記事をかいた人

blank

インターネット関連のSEをやっています。 ネットワーク、サーバー、ストレージ、仮想基盤まで幅広く手を出しており、MVNOの構築経験もあります。 現在は、Pythonを使ったプログラミングの開発をしネットワークの自動化ツールを作成しています! Pythonの入門書も作成しているので、ぜひ参考にしてください!