読者です 読者をやめる 読者になる 読者になる

Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

Docker Compose -> Dockerrun.aws.jsonに書き換えて、Nginx, uWSGI+Djangoのデプロイ

概要

Docker Compose -> Dockerrun.aws.jsonに書き換えて、Nginx, uWSGI+Djangoのデプロイ

参考サイト

github.com

やったこと

  • Docker Composeのbuild している箇所をあらかじめimageとして登録しておく
  • Docker compose -> Dockerun.aws.jsonに変える。
  • ElasticBeanstalkで、複数コンテナでデプロイする。

Docker Composeのbuild している箇所をあらかじめimageとして登録しておく

  • 以下のフォルダを丸ごとgit hubに登録する。

uWSGI用

Dockerfile # これは、uWSGI,django用のDockerfile
my app 
  - manage.py
  - myapp
  - requirements.txt
  - static
uwsgi.sh

nginx用

Dockerfile
nginx.conf
  • docker hub に、github経由で、automated_createで登録する。

Docker compose -> Dockerun.aws.jsonに変える

  • docker-compose.ymlをちょっと変更する。
uwsgi:
  image: dockerhub/uwsgi-django
  command: ./uwsgi.sh
  volumes:
    - /static

nginx:
  build: dockerhub/nginx-django
  links:
    - uwsgi
  volumes_from:
    - uwsgi
  ports:
    - "0.0.0.0:80:80"
  • dockerrun.aws.jsonに設定する。
{
  "AWSEBDockerrunVersion": 2,
  "volumes": [
    {
      "name": "app-root",
      "host": {
        "sourcePath": "/var/app/current/app/"
      }
    }
  ],
  "containerDefinitions": [
    {
      "name": "uwsgi",
      "image": "dockerhub/uwsgi-django",
      "essential": true,
      "memory": 128,
      "mountPoints": [
        {
          "sourceVolume": "app-root",
          "containerPath": "/src/app/"
        }
      ]
    },
    {
      "name": "nginx",
      "image": "dockerhub/nginx-django",
      "essential": true,
      "memory": 128,
      "portMappings": [
        {
          "hostPort": 80,
          "containerPort": 80
        }
      ],
      "mountPoints": [
        {
          "sourceVolume": "app-root",
          "containerPath": "/src/app/"
        }
      ],
      "links": [
        "uwsgi"
      ]
    }
  ]
}

ポイント * imageを差し替える。hostPort80, containerportも80にする。

ElasticBeanstalkにデプロイしてみる。

Error発生!

ERROR    Failed to start ECS task after retrying 2 times.

Elastic BeanstalkにECSのアクセス権限がないぽいので、ロールを変更する。

Docker イメージを作って AWS EC2 Container Registory (ECR) にプッシュし、ElasticBeanstalk でデプロイする - Qiita

aws-elasticbeanstalk-ec2-role を選択し、「ポリシーのアタッチ」→ container で検索して、AmazonEC2ContainerRegistryReadOnly をアタッチします。

再度デプロイしてみる。。。またも失敗!たぶん、commandが設定されてないせいだな。

ということで、一旦dockerfileからimageを設定し直してみる。

dockerfileからimage設定し直し

以下の記事で、設定する。

pythonskywalker.hatenablog.com

再度eb deployしてみる。

お〜〜〜、deployできた!意外と1つのコンテナに詰め込むよりはわかりやすくていいかもしれんな(^ ^)/

最終的なDockerrun.aws.jsonは以下の通り。

{
  "AWSEBDockerrunVersion": 2,
  "volumes": [
    {
      "name": "app-root",
      "host": {
        "sourcePath": "/var/app/current/app/"
      }
    }
  ],
  "containerDefinitions": [
    {
      "name": "uwsgi",
      "image": "dockerhub/uwsgi-django",
      "essential": true,
      "memory": 128,
      "mountPoints": [
        {
          "sourceVolume": "app-root",
          "containerPath": "/src/app/"
        }
      ]
    },
    {
      "name": "nginx",
      "image": "dockerhub/nginx-django",
      "essential": true,
      "memory": 128,
      "portMappings": [
        {
          "hostPort": 80,
          "containerPort": 80
        }
      ],
      "mountPoints": [
        {
          "sourceVolume": "app-root",
          "containerPath": "/src/app/"
        }
      ],
      "links": [
        "uwsgi"
      ]
    }
  ]
}

次からは、ちょっとずつ修正していこう。