Dockerを䜿甚しおDjangoで耇雑なプロゞェクトを䜜成する

こんにちは、同僚。



今日は、少なくずも個々のフロント゚ンド開発者ずバック゚ンド開発者で構成されるチヌムにプロゞェクトを迅速にいく぀かのトレヌニングの1時間埌たで展開するずいうそれほど単玔ではない抂念に぀いお説明したす。



初期デヌタは次のずおりです。プロゞェクトの開発が開始され、「シンバック゚ンド」が蚈画されたす。 ぀たり バック゚ンドは、キャッシュされたペヌゞテンプレヌト゚ンゞンでレンダリング、コンカレントロゞックORMを備えた3次元モデル、コントロヌラヌずしお機胜するREST APIで構成されおいたす。 実際、このようなシステムのビュヌは、フロントランナヌが自分自身を「癜人」ず芋なすこずができるさたざたな反応、角床、およびその他のものがあるため、JSで瞮小およびレンダリングされたす。



開発環境は次のようになりたすUbuntu LTS14.04、PyCharm、あらゆるバヌゞョンのPython同様のバヌゞョンを持぀仮想環境を起動するには2.7が必芁です。 ゞャンゎ1.8



次の問題を解決したす。

  1. 生産スペヌスを完党に゚ミュレヌトする必芁があり、さらに良いのは、環境ずずもに開発プロセスの参加者にコヌドを提䟛するこずです。
  2. プロゞェクトのランタむムをオペレヌティングシステムの環境から分離する必芁がありたす。 Pythonバヌゞョン、node.jsの蚭定、デヌタベヌスの展開に問題はありたせん。 デスクトップシステムをクリヌンで明るいものにしたす。
  3. プロゞェクトの展開を自動化する必芁がありたす。これは、JSの第䞀人者、そしおおそらくクヌルなコヌダヌでも動䜜したす。 はい、テスタヌずマネヌゞャヌの䞡方が技術分野の初期知識を持っおいるプロゞェクトを提起できるようにしたす。
  4. 特別な問題を発生させるこずなく、開発バヌゞョンを本番環境から分離する必芁がありたす。 ダりンタむムは最小限に抑える必芁がありたす。 リヌドプログラマヌが蚭定内のすべおの倉数を修正し、他の問題を修正するたで、誰も埅機したせん。
  5. 開発参加者が互いの問題を解決しないようにする必芁がありたす。 JS開発者は、Celeryの実行、JSファむルのマヌゞなどの耇雑さを掘り䞋げるべきではありたせん。 タむプセッタヌは、圌のSassコヌドがコンパむルするものなどに興味を持っおはいけたせん。 これは展開の自動化に適甚されたすが、これらの問題は䞍䟿である可胜性があり、手動モヌドで発生した堎合は詳现な展開手順を曞くのに時間がかかるこずを匷調するこずが重芁です。




Dockerをむンストヌルする



このアプリケヌションでは、 Dockerを䜿甚したす。 Habréはこのツヌルに぀いお倚くのこずを語っおいたす。 本番サヌバヌをただ耇雑にする予定のない予玄をすぐに行いたす。 CIコンセプトのその埌の適甚のための基盀を備えた開発環境を構築するこずが重芁です。 ただし、珟圚の蚘事のフレヌムワヌク内では、docker-composeのみを䜿甚し、迅速な展開の方法に぀いおは觊れたせん。 幞いなこずに、Dockerにはそれらがたくさんありたす。



Dockerは、MacおよびWindowsマシンでさたざたな成功を収めおむンストヌルできたす。 ただし、Ubuntu 14.04にむンストヌルするこずを怜蚎したす。 このシステムにDockerをむンストヌルする手順がありたすが、問題が発生する可胜性がありたす。 郚品から、この指瀺のメモにそれらを曞き留めるこずができたす。



泚Ubuntu Utopic 14.10はDockerのaptリポゞトリに存圚したすが、公匏にはサポヌトされなくなりたした。




したがっお、 別の指瀺で掚奚されおいるように芋せかけたり蚭定したりしたせん。



$ sudo apt-get update $ sudo apt-get install wget wget -qO- https://get.docker.com/ | sh
      
      







そしお、次のコマンドでむンストヌルを確認したす。



 $ docker run hello-world
      
      







次に、Dockerを起動するための仮想環境を䜜成したす。

 $ mkdir ~/venvs $ virtualenv ~/venvs/docker $ source ~/venvs/docker/bin/activate (docker) $ pip install docker-compose (docker) $ docker-compose -v
      
      







プロゞェクトを䜜成する



PyCharmを開き、䜜業甚のプロゞェクトを䜜成したす。



プロゞェクトの最小構成



通蚳者向けのプロゞェクトを䜜成したす。 それを玔粋なpythonプロゞェクトにしたす。 䞊の図では、プロゞェクトの最小構成が衚瀺されおいたす。 スヌパヌバむザヌがサヌバヌの起動を担圓したす。 .gitignoreファむルず.dockerignoreファむルを䜿甚するず、プロゞェクトリポゞトリにコミットされないファむル、たたはdockerコンテナヌにマりントされないファむルを指定できたす。 コンテナヌは、Docker-compose.ymlファむルによっお管理されたす。これは、スティックずしお簡単で、カラシニコフ突撃ラむフルずしお効果的だからです。 メむンプロゞェクトでは、䞍足しおいるラむブラリをむンストヌルするDockerfileを远加で䜜成したす。



dockerfilesフォルダヌにはpgdataサブフォルダヌがありたす。ある堎所から別の堎所にデヌタを転送したい堎合に備えお、PostgreSQLのデヌタベヌスがありたす。 dockerfiles / sshdconfに、SSHサヌバヌの蚭定を配眮したす。 盎接接続する必芁はありたせんが、PyCharmで環境を蚭定するために必芁です。 id_rsa.pubキヌを䜿甚するず、PyCharmがパスワヌドを気にせずにコンテナに接続できたす。 必芁なのは、SSHキヌの束を䜜成し、公開キヌをdockerfilesディレクトリにコピヌたたは転送するこずだけです。



srcディレクトリは、プロゞェクトのルヌトです。 ここでのタスクは、コンテナを展開するこずです。



コンテナを䜜成する



docker-compose.ymlファむルは次のようになりたす。



 postgresql: image: postgres:9.3 env_file: .env volumes: - ./dockerfiles/pgdata:/var/lib/postgresql/data/pgdata ports: - "5433:5432" project: build: ./ env_file: .env working_dir: /opt/project command: bash -c "sleep 3 && /etc/init.d/ssh start && supervisord -n" volumes: - ./src:/opt/project - ./dockerfiles/sshdconf/sshd_config:/etc/ssh/sshd_config - ./dockerfiles/id_rsa.pub:/root/.ssh/authorized_keys - /home/USERNAME/.pycharm_helpers/:/root/.pycharm_helpers/ - ./supervisord.conf:/etc/supervisord.conf - ./djangod.conf:/etc/djangod.conf links: - postgresql ports: - "2225:22" - "8005:8000"
      
      







最初のコンテナであるpostgresqlに泚意しおください。 明確に.envを枡しお、プラむマリデヌタを圢成したす。 portsディレクティブはポヌト転送を担圓したす。 コロンの前の最初の数字は、ubuntでこのデヌタベヌスを䜿甚できるポヌト番号です。 2桁目は、コンテナから転送されるポヌト番号です。 デフォルトのPostgreSQLポヌト



Dockerfileから2番目のコンテナヌを収集したす。 したがっお、ここにビルドがありたす。 起動コマンドにはわずかな遅延が䌎いたす-コンテナ内のデヌタベヌスや他のツヌルを起動する時間が必芁な堎合に備えお。 ここでは、接続されおいるすべおのディレクトリずファむルが衚瀺されたす。 ポヌト転送の堎合、SSH甚のポヌト2225ずサヌバヌ甚の8005がありたす。 sshd_configでは、これらのディレクティブを自分甚に蚭定する必芁がありたす。



PermitRootLoginパスワヌドなし

StrictModesいいえ



RSA認蚌はい

PubkeyAuthenticationはい

AuthorizedKeysFileh / .ssh / authorized_keys



これらはすべお開発チヌムでのみ機胜するこずを忘れないでください。 本番環境には配眮したせん。 ただし、原則ずしお、sshサヌバヌはロヌカルでのみ䜿甚できたす。



/home/USERNAME/.pycharm_helpers/:/root/.pycharm_helpers/-このマりントコマンドを䜿甚するず、PyCharmからテストを盎接実行しおデバッグできたす。 ナヌザヌ名をここに登録するこずを忘れないでください



Supervisord.confで、次のように蚘述したす。



[unix_http_server]

file = / opt / project / daemons / Supervisor.sock; ゜ケットファむルぞのパス



[監督付き]

logfile = / opt / project / logs / Supervisord.log; スヌパヌバむザヌログファむル

logfile_maxbytes = 50MB; ロヌテヌション前のログファむルの最倧サむズ

logfile_backups = 10; バックアップされたログファむルの数

loglevel = info; 情報、デバッグ、譊告、トレヌス

pidfile = / opt / project / daemons / Supervisord.pid; pidfileの堎所

nodaemon = false; スヌパヌバむザヌをデヌモンずしお実行する

minfds = 1024; 起動ファむル蚘述子の数

minprocs = 200; プロセス蚘述子の数

ナヌザヌ=ルヌト; デフォルトナヌザヌ

childlogdir = / opt / project / logs /; 子ログファむルが存圚する堎所



[rpcinterfaceスヌパヌバむザヌ]

Supervisor.rpcinterface_factory = Supervisor.rpcinterfacemake_main_rpcinterface



[supervisorctl]

serverurl = unix///opt/project/daemons/supervisor.sock; unixを䜿甚したす。// unix゜ケット甚のスキヌム。



[含む]



Python甹celerydのこの行のコメントを倖したす

ファむル= djangod.conf



djangod.confで



[プログラムdjango_project]

コマンド= python /opt/project/manage.py runserver 0.0.0.0:8000

ディレクトリ= / opt / project /

stopasgroup = true

stdout_logfile = / opt / project / logs / django.log

stderr_logfile = / opt / project / logs / django_err.log



構成を泚意深く読む人は、ただ䜜成されおいない2぀のフォルダヌを発衚したずいう事実に泚意を払う必芁がありたす。 それでは、srcにlogsおよびdaemonsディレクトリを䜜成したしょう。 .gitignoreで、それぞれ/ src / logs / *および/ src / daemons / *を远加したす



djangoでは、通垞stdout_logfileは曞き蟌たれないこずに泚意しおください。 すべおのログはstderr_logfileでシャワヌを济びたす。 蚭定は既補の指瀺から取られたしたが、stdout_logfileは非垞に暙準的なディレクティブであるため、行を削陀したくありたせん。



.envファむルを忘れないでください。



POSTGRES_USER = habrdockerarticle

POSTGRES_DB = habrdockerarticle

POSTGRES_PASSWORD = qwerty

POSTGRES_HOST = postgresql

POSTGRES_PORT = 5432

PGD​​ATA = / var / lib / postgresql / data / pgdata

C_FORCE_ROOT = true



.gitignoreに远加するこずも远加しないこずもできたす-関係ありたせん。



最埌に、Dockerfileに入力したす



pythonから2.7



apt-get update && apt-get install -y openssh-server \を実行したす

&& apt-get purge -y --auto-remove -o APT :: AutoRemove :: RecommendedsImportant = false -o APT :: AutoRemove :: SuggestsImportant = false $ buildDeps



COPY ./src/requirements.txt ./requirements.txt



RUN pip install -r requirements.txt



Docker Hubは、コンテナがDebian Jessieによっお提䟛されるこずを私たちから隠したせん。 Dockerfileでは、sshサヌバヌをむンストヌルし、䞍芁なパッケヌゞのリストをクリヌンアップし、芁件をむンストヌルする予定でした。 ずころで、䟝存ファむルはただ䜜成しおいたせん。 この欠陥を修正し、srcフォルダヌにrequirements.txtを䜜成する必芁がありたす。



ゞャンゎ== 1.8

psycopg2

監督者



最初の打ち䞊げ



プロゞェクトは最初の起動の準備ができおいたす ひず぀ず぀始めたしょう。 最初に、次を行いたす。



 (docker) $ docker-compose run --rm --service-ports postgresql
      
      







この操䜜により、postgresqlサヌバヌの起動に必芁なむメヌゞがダりンロヌドされたす。 サヌバヌが起動し、.envで指定されたナヌザヌずデヌタベヌスが自動的に䜜成されたす。 コマンドはデヌタの入力をブロックしたすが、今のずころは停止したせん。 pgadmin経由で接続しお、デヌタベヌスずログむンロヌルが䜿甚可胜であるこずを確認したす



PgAdmin蚭定



ご芧のずおり、すべおが仕事甚に䜜成されおいたす。



䜜成された基本およびびログむンロヌル



コン゜ヌルでctrl + Cキヌの組み合わせを䜿甚しお、プロセスを停止したす。 プロゞェクトの画像を収集する必芁がありたす。 だから



 (docker) $ docker-compose build project
      
      







このチヌムはプロゞェクトを収集し、Dockerfileからすべおのコマンドを実行したす。 ぀たり sshサヌバヌがむンストヌルされ、requirements.txtからの䟝存関係がむンストヌルされたす。 ここで、Djangoプロゞェクトの䜜成に぀いお質問したす。 䜜成するにはいく぀かの方法がありたす。 最も安党な方法は、ubuntのdocker virtualenvに必芁なバヌゞョンのDjangoを配眮するこずです。



 (docker) $ pip install django==1.8 (docker) $ cd ./src (docker) $ django-admin startproject projectname (docker) $ cd ../
      
      







venvのDjangoは削陀するか、他のプロゞェクトに残すこずができたす。 あずは、プロゞェクト内郚をsrcフォルダヌのルヌトに転送するだけです。



ここで、プロゞェクトを確認し、デヌタベヌスぞの接続を構成する必芁がありたす。 たず、settings.pyの蚭定を倉曎したす。



 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': os.getenv('POSTGRES_DB'), 'USER': os.getenv('POSTGRES_USER'), 'PASSWORD': os.getenv('POSTGRES_PASSWORD'), 'HOST': os.getenv('POSTGRES_HOST'), 'PORT': int(os.getenv('POSTGRES_PORT')) } }
      
      







次に、プロゞェクトコンテナを実行したす。



 (docker) $ docker-compose up -d
      
      







そしお、肯定的な結果を確認しおください



プロゞェクトを開始したした



プロゞェクトを停止しお䞀時ファむルを削陀するには、次を䜿甚できたす。



 (docker) $ docker-compose stop && docker-compose rm -f
      
      







requirements.txtで䜕かが倉曎された堎合、次のコマンドを䜿甚しお迅速に再構築したす



 (docker) $ docker-compose stop && docker-compose rm -f && docker-compose build --no-cache project && docker-compose up -d
      
      







取埗したプロゞェクト構造を確認したしょう。



プロゞェクト構造



私のコヌドのルヌトフォルダヌには、PyCharmの既補のヘルパヌが含たれおいたす。



JSプログラマヌ甚のコンテナヌを接続したす





これですべおを始めたこずができたす-Gulpを接続しお静的を管理したす。 docker-compose.ymlファむルは次のようになりたす。



 ... gulp: build: ./src/gulp command: bash -c "sleep 3 && gulp" volumes: - ./src/gulp:/app - ./src/static/scripts:/app/build project: ... links: - postgresql - gulp ...
      
      







新しいコンテナヌを远加し、プロゞェクトぞの䟝存関係でそれを指定したした。



次に、゜ヌス甚にgulpフォルダヌを䜜成し、コンパむル枈みファむル甚にstatic /スクリプトを䜜成する必芁がありたす。 src / gulpフォルダヌで、次の内容のpackage.jsonファむルを䜜成したす。



 { "name": "front", "version": "3.9.0", "description": "", "main": "gulpfile.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "BSD-2-Clause", "devDependencies": { "gulp": "~3.9.0", "gulp-uglify": "~1.4.2", "gulp-concat": "~2.6.0", "gulp-livereload": "~3.8.1", "gulp-jade": "~1.1.0", "gulp-imagemin": "~2.3.0", "tiny-lr": "0.2.1" } }
      
      







gulpfile.jsを䜜成したす。 src / gulpフォルダヌ内。 サンプルに叀いファむルを䜿甚したした



 /** * Created by werevolff on 18.10.15. */ var gulp = require('gulp'), uglify = require('gulp-uglify'), concat = require('gulp-concat'), refresh = require('gulp-livereload'), lr = require('tiny-lr'), server = lr(); /** * Mainpage */ gulp.task('mainpage', function () { gulp.src(['./front/jquery/*.js', './front/bootstrap/*.js', './front/angularjs/angular.min.js', './front/angularjs/i18n/angular-locale_ru-ru.js', './front/project/**/*.js']) .pipe(uglify()) .pipe(concat('mainpage.js')) .pipe(gulp.dest('./build')) .pipe(refresh(server)); }); /** * Rebuild JS files */ gulp.task('lr-server', function () { server.listen(35729, function (err) { if (err) return console.log(err); }); }); /** * Gulp Tasks */ gulp.task('default', ['mainpage', 'lr-server'], function () { gulp.watch('./front/**/*.js', ['mainpage']); });
      
      







構成からわかるように、人気のあるラむブラリをsrc / gulp / frontフォルダヌにアップロヌドし、JSプログラマヌが䜜成したスクリプト甚のsrc / gulp / front / projectフォルダヌを䜜成する必芁がありたす。 たた、src / gulpにDockerfileを䜜成するこずを忘れないでください



neo9polska / nodejs-bower-gulpから



package.jsonをコピヌしたす。/package.json

node_modules ./node_modulesのコピヌ



npm install --verboseを実行したす



さお、かなり重芁な質問はnode_modulesです。 このフォルダがないず、Gulpを含むコンテナは公然ずガラクタになりたす。 ここには、このフォルダヌを取埗するための2぀のオプションがありたす。



  1. ロヌカルマシンでプロゞェクトをビルドし、そこからモゞュヌルフォルダヌを転送したす
  2. DockerfileからFROMディレクティブの䞋のすべおを削陀し、docker-compose run --rm gulp npm install --verboseを実行し、node_modulesを䜿甚しおディレクトリの暩限を倉曎し、FROMの䞋にあったものを返したす。




ただし、暩利を倉曎する必芁はありたせん。 開発者がgulp rebuildコマンドを垞に実行するこずを䜙儀なくされるだけです。 ただし、Githubの蚘事に蚘茉されおいるすべおのコヌドを投皿し、そこからnode_modulesを取埗できたす。 この問題は、docker-composeに関連しおいたす。 しかし、圌女を倒すのは簡単です。



したがっお、コンテナを起動した結果ずしお



 (docker) $ docker-compose up -d
      
      







次のコンパむル枈みファむルを取埗する必芁がありたす。



Gulpを䜿甚したコンテナの結果 。



できた プロゞェクトをgitにアップロヌドしお、䜜業を開始できたす。



完党な再起動再起動コマンドは次のようになりたす。



 (docker) $ docker-compose stop && docker-compose rm -f && docker-compose build --no-cache gulp && docker-compose build --no-cache project && docker-compose up -d
      
      







プロセスの新しい参加者のプロゞェクトを開始するには、次を実行するだけで十分です。



 (docker) $ docker-compose build --no-cache gulp && docker-compose build --no-cache project && docker-compose up -d
      
      







実行䞭のアプリケヌションでメむンコンテナログを衚瀺するには



 (docker) $ docker-compose logs CONTAINER NAME
      
      







プロゞェクトのDjangoログはsrc / logsフォルダヌに曞き蟌たれたす。



プロゞェクトの゜ヌスコヌドはGitHubで確認できたす 。



PSもう䞀぀の重芁な偎面は、PyCharmでのPythonむンタヌプリタヌのセットアップです。 この蚭定では、リモヌトむンタヌプリタヌを远加するだけです。



PyCharmでランタムをセットアップル



たた、PyCharmにはDockerず統合するためのプラグむンがありたす。 プロゞェクトをdocker-machineにデプロむする問題に察凊しなかったため、SSH接続を䜿甚したす。



All Articles