こんにちは、同僚。
今日は、少なくとも個々のフロントエンド開発者とバックエンド開発者で構成されるチームにプロジェクトを迅速に(いくつかのトレーニングの1時間後まで)展開するというそれほど単純ではない概念について説明します。
初期データは次のとおりです。プロジェクトの開発が開始され、「シンバックエンド」が計画されます。 つまり バックエンドは、キャッシュされたページ(テンプレートエンジンでレンダリング)、コンカレントロジック(ORM)を備えた3次元モデル、コントローラーとして機能するREST APIで構成されています。 実際、このようなシステムのビューは、フロントランナーが自分自身を「白人」と見なすことができるさまざまな反応、角度、およびその他のものがあるため、JSで縮小およびレンダリングされます。
開発環境は次のようになります:Ubuntu LTS(14.04)、PyCharm、あらゆるバージョンのPython(同様のバージョンを持つ仮想環境を起動するには2.7が必要です)。 ジャンゴ(1.8)
次の問題を解決します。
- 生産スペースを完全にエミュレートする必要があり、さらに良いのは、環境とともに開発プロセスの参加者にコードを提供することです。
- プロジェクトのランタイムをオペレーティングシステムの環境から分離する必要があります。 Pythonバージョン、node.jsの設定、データベースの展開に問題はありません。 デスクトップシステムをクリーンで明るいものにします。
- プロジェクトの展開を自動化する必要があります。これは、JSの第一人者、そしておそらくクールなコーダーでも動作します。 はい、テスターとマネージャーの両方が技術分野の初期知識を持っているプロジェクトを提起できるようにします。
- 特別な問題を発生させることなく、開発バージョンを本番環境から分離する必要があります。 ダウンタイムは最小限に抑える必要があります。 リードプログラマーが設定内のすべての変数を修正し、他の問題を修正するまで、誰も待機しません。
- 開発参加者が互いの問題を解決しないようにする必要があります。 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
PGDATA = / 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経由で接続して、データベースとログインロールが使用可能であることを確認します

ご覧のとおり、すべてが仕事用に作成されています。

コンソールで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フォルダー内。 サンプルに古いファイルを使用しました:
var gulp = require('gulp'), uglify = require('gulp-uglify'), concat = require('gulp-concat'), refresh = require('gulp-livereload'), lr = require('tiny-lr'), server = lr(); 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)); }); gulp.task('lr-server', function () { server.listen(35729, function (err) { if (err) return console.log(err); }); }); 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つのオプションがあります。
- ローカルマシンでプロジェクトをビルドし、そこからモジュールフォルダーを転送します
- 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
次のコンパイル済みファイルを取得する必要があります。

。
できた! プロジェクトを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にはDockerと統合するためのプラグインがあります。 プロジェクトをdocker-machineにデプロイする問題に対処しなかったため、SSH接続を使用します。