DUICUO

Docker コンポーネントを使用して Django プロジェクトを開発するにはどうすればよいですか?

目次[-]
  • ローカル設定
  • Dockerマシン
  • Dockerコンポーズ
  • 展開する

Dockerはオープンソースのアプリケーションコンテナエンジンであり、開発者はアプリケーションと依存関係をポータブルなコンテナにパッケージ化できます。このコンテナは、一般的なLinuxマシンにデプロイすることで仮想化を実現します。2013年のリリース以来、GitHub上で活発に利用されているコードベース、Red HatのRHEL 6.5へのDockerサポートの統合、そしてGoogleのCompute EngineがDockerをサポートしていることからも、その人気は明らかです。

[[140734]]

この記事では、Docker Machine (システム構成) と Docker Compose (マルチコンテナ アプリケーションのアセンブリ) を使用して、Postgres、Redis、および Django を組み合わせたプロジェクトを開発するためのスタックを提供する方法について詳しく説明します。

*** では、このスタックは次のサービスごとに個別のコンテナーで構成されます。

  • Web/Djangoコンテナ
  • Nginxコンテナ
  • Postgresコンテナ
  • Redisコンテナ
  • データコンテナ

ローカル設定

Dockerバージョン1.6.1を使用し、Docker Compose 1.2.0を使用してマルチコンテナアプリケーションのオーケストレーションを行い、Docker Machine 0.2.0を使用してローカルおよびクラウドのDockerホストを作成します。以下の手順に従ってDocker ComposeとDocker Machineをそれぞれインストールし、インストール結果をテストします。

  1. $ docker-machine --version  
  2. docker-machine バージョン 0.2.0 (8b9eaf2)
  3. $ docker-compose --version  
  4. docker-compose 1.2.0

次に、 realpython/dockerizing-djangoからプロジェクトを複製するか、次のプロジェクト構造に基づいて独自のプロジェクトを作成します。

  1. ├── docker-compose.yml
  2. ├── nginx
  3. │ ├── Dockerfile
  4. │ └── サイト対応
  5. │ └── django_project
  6. ├── production.yml
  7. └── ウェブ
  8. │ ├── Dockerfile
  9. │ ├── docker_django
  10. │ │ ├── __init__.py
  11. │ │ ├── アプリ
  12. │ │ │ ├── __init__.py
  13. │ │ │ └── とどう
  14. │ │ │ ├── __init__.py
  15. │ │ │ ├── admin.py
  16. │ │ │ ├── models.py
  17. │ │ │ ├── テンプレート
  18. │ │ │ │ ├── _base.html
  19. │ │ │ │ └── ホーム.html
  20. │ │ │ ├── テスト.py
  21. │ │ │ ├── urls.py
  22. │ │ │ └── views.py
  23. │ │ ├── 設定.py
  24. │ │ ├── urls.py
  25. │ └── wsgi.py
  26. │ ├── manage.py
  27. │ ├── 要件.txt
  28. │ └──静的  
  29. │ │ └── main.css</code>

これでコンテナを実行する準備が整いました...

#p#

Dockerマシン

Docker Machine を起動するには、次のコマンドを実行します。

  1. 仮想マシンをホストするdocker machineを作成します
  2. INFO[0000] CAを作成しています: /Users/michael/.docker/machine/certs/ca.pem
  3. INFO[0000] クライアント証明書を作成しています: /Users/michael/.docker/machine/certs/cert.pem
  4. INFO[0001] boot2docker.iso を/Users/michael/.docker/machine/cache/boot2docker.isoダウンロードしています...
  5. INFO[0035] SSHキーを作成しています...
  6. INFO[0035] VirtualBox VMを作成しています...
  7. INFO[0043] VirtualBox VMを起動しています...
  8. INFO[0044] VM起動を待機しています...
  9. INFO[0094] 「dev」が作成され  現在はアクティブなマシンです
  10. INFO[0094] Dockerクライアントをこれ接続するにはシェル次のコマンドを実行します: eval "$(docker-machine env dev)"  

`create` コマンドは、新しい Machine の「開発環境」を構築します。基本的には、Boot2Docker をダウンロードし、VM の実行を開始します。開発環境では、Docker を指定するだけです。

  1. $ eval "$(docker-machine env dev)"  

現在実行中のマシンを表示するには、次のコマンドを実行します。

  1. $ docker-machine ls
  2. 名前アクティブドライバー 状態 URL
  3. dev * virtualbox 実行中 tcp://192.168.99.100:2376

次に、Django、Postgres、Redis のコンテナを起動して実行します。

Dockerコンポーズ

docker-compose.yml ファイルを見てみましょう。

  1. ウェブ:
  2. 再起動: 常に
  3. ビルド: ./web
  4. さらす:
  5. - 「8000」   
  6. リンク:
  7. - postgres:postgres
  8. - レディス:レディス
  9. ボリューム:
  10. - /usr/src/app/静的 
  11. 環境ファイル: .env
  12. コマンド: /usr/ local /bin/gunicorn docker_django.wsgi:application -w 2 -b :8000
  13.  
  14. nginx:
  15. 再起動: 常に
  16. ビルド: ./nginx/
  17. ポート:
  18. - 「80:80」   
  19. ボリューム:
  20. - /www/静的  
  21. ボリューム数:
  22. - ウェブ
  23. リンク:
  24. - ウェブ:ウェブ
  25.  
  26. ポストグルス:
  27. 再起動: 常に
  28. 画像: postgres:latest
  29. ボリューム数:
  30. - データ
  31. ポート:
  32. - 「5432:5432」   
  33.  
  34. レディス:
  35. 再起動: 常に
  36. 画像: redis:latest
  37. ポート:
  38. - 「6379:6379」   
  39.  
  40. データ:
  41. 再起動: 常に
  42. 画像: postgres:latest
  43. ボリューム:
  44. - /var/lib/postgresql
  45. コマンド: true  

ここでは、Web、Nginx、Postgres、Redis、Data の 5 つのサービスを定義します。

  • このウェブサービスは、「Web」ディレクトリ内のDockerfileを使用して構築され、Python環境もセットアップされます。Djangoアプリケーションはデフォルトでポート8000​​を使用します。このポートはホスト環境(例えばDocker Machine)のポート80に転送されます。また、このウェブサービスはコンテナのRestore.envファイルに環境変数を追加します。
  • Nginx サービスは、Django または静的ファイル ディレクトリで動作するリバース プロキシとして使用されます。
  • Postgresサービスは、Docker Hub上の公式PostgreSQLイメージからインストールされます。インストール後、Postgresはデフォルトサーバーのポート5432で実行されます。
  • Redisは公式Redisイメージを使用してインストールされます。デフォルトでは、Redisサービスはポート6379で実行されます。
  • データベースデータを格納するための別のコンテナ「Data」があることに注意してください。これにより、Postgresコンテナが完全に破壊された場合でも、データが保持されます。

次に、コンテナを実行し、イメージをビルドして、サービスを開始します。

  1. $ docker-compose ビルド
  2. $ docker-compose up -d

最初に実行するには多少時間がかかるため、コーヒーを飲んだり散歩に出かけたりする時間ができます。その後、Docker キャッシュからより高速なバージョンをビルドできます。

サービスが起動したら、データベースの移行を作成する必要があります。

  1. $ docker-compose 実行 web /usr/ local /bin/python manage.py 移行

`--docker-machine ip--` コマンドを使用して Docker Machine の IP アドレスを取得し、その IP アドレスをブラウザに入力します。

上記の画像が表示されたら、ページを更新すると更新されているはずです。基本的には、RedisのINCRを使って処理済みのリクエストごとにインクリメントします。詳しくは、 web/docker_django/apps/todo/views.pyコードをご覧ください。

#p#

同様に、これにより 5 つのサービスが作成され、すべて異なるコンテナーで実行されます。

  1. $ docker-compose ps
  2. 名前コマンド 状態 ポート
  3. ------------------------------------------------------------------------------------------------  
  4. dockerizingdjango_data_1 /docker-entrypoint.sh true 5432/tcp を起動
  5. dockerizingdjango_nginx_1 /usr/sbin/nginx 0.0.0.0:80->80/tcp を起動
  6. dockerizingdjango_postgres_1 /docker-entrypoint.sh postgres 0.0.0.0:5432->5432/tcp を起動
  7. dockerizingdjango_redis_1 /entrypoint.sh redis-server 0.0.0.0:6379->6379/tcp を起動します
  8. dockerizingdjango_web_1 /usr/ local /bin/gunicorn do ... 8000/tcp へアクセス

Web サービスで使用できる環境変数を確認するには、次のコマンドを実行します。

  1. $ docker-compose ウェブ環境を実行

ログを表示するには、次のコマンドを実行します。

  1. $ docker-compose ログ

Postgres Shell にアクセスすることもできます。これは、ユーザー/ロールとポート転送をホスト環境に追加して、docker-compose.yml ファイル経由でデータベースをすでに構成しているためです。

  1. $ psql -h 192.168.99.100 -p 5432 -U postgres --パスワード 

デプロイする準備はできましたか? まず、 docker-compose stopの実行を停止し、アプリケーションをクラウドで実行します。

展開する

アプリケーションをローカルで実行するのと同じように、全く同じDocker Machine環境を提供するクラウドホスティングサービスプロバイダーにプッシュできるようになりました。それでは、Digital Oceanにデプロイしてみましょう。

Digital Ocean に登録後、個人アクセストークンを生成します。その後、以下のコマンドを実行してください。

  1. $ docker-machine作成\
  2. -d デジタルオーシャン \
  3. --digitalocean-access-token=ここにトークンを追加してください\  
  4. 生産

ドロップレットをデプロイし、新しい Docker Machine の本番環境をセットアップするには数分かかります。

  1. INFO[0000] SSHキーを作成しています...
  2. INFO[0001] デジタルオーシャンドロップレットを作成しています...
  3. INFO[0133] 「production」が作成され  現在はアクティブなマシンです
  4. INFO[0133] Dockerクライアントをこれ接続するにはシェル次のコマンドを実行します: eval "$(docker-machine env production)"  

現在、ローカルに 1 台、Digital Ocean 上に 1 台の 2 台のマシンが稼働しています。

  1. $ docker-machine ls
  2. 名前アクティブドライバー 状態 URL
  3. dev * virtualbox 実行中 tcp://192.168.99.100:2376
  4. 本番環境 digitalocean 実行中 tcp://104.131.107.8:2376

マシンをアクティブ化し、Docker 環境をシェルにロードするように production を構成します。

  1. $ docker-machine アクティブプロダクション
  2. $ eval "$(docker-machine env production)"  

Djangoアプリケーションをクラウドで再構築してみましょう。今回は、コンテナ内にインストールする必要のない、少し異なるDocker Composeファイルを使用します。なぜでしょうか?コンテナはローカル開発に最適であり、「Web」ディレクトリ内のローカルコードを更新すれば、その変更がすぐにコンテナに反映されるからです。本番環境では、これは明らかに不要です。

  1. $ docker-compose ビルド
  2. $ docker-compose up -d -f production.yml
  3. $ docker-compose 実行 web /usr/ local /bin/python manage.py 移行

Digital Oceanアカウントに関連付けられたIPアドレスを取得し、ブラウザで確認してください。すべてがうまくいけば、アプリケーションが実行されるはずです。