ConoHaVPSでCentOS8をインストールしDockerコンテナ上で「Django」を起動させるまでをまとめました。
また、外部からのアクセスまで確認しているので参考にしてください。
CentOS8におけるDjangoの環境は以下となります。
プロジェクトフォルダ
$ pwd /docker/www/django
CentOS8のバージョン
CentOS Linux release 8.1.1911 (Core)
※本環境はConoHaVPSを使用しています。
DockerコンテナでDjango起動・外部アクセス確認
今回、Dockerコンテナで「Django」を起動するには、事前にDockerのインストールが前提となります。
Dockerインストールについては以下のページを参考にしてください。
まずは、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で以下のコマンドで「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を起動する手順は以上となります。
サーバーを構築するならVPSがおすすめです。
エンジニアのオンライン学習
ITエンジニアにおすすめの教材、オンラインスクールです。
無料からエンジニアの学習ができる教材などまとめているので参考にしてください。
おすすめオンライン教材 | |
自宅で学習ができるオンラインスクール | |
ITエンジニアの開発・検証・学習としてインターネット上で専用のサーバ(VPS)を利用しましょう!
実務経験はVPSで学べます。
コメントを残す