Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Docker on AWS Elastic Beanstalk

Docker on AWS Elastic Beanstalk

Szymon Skórczyński

October 15, 2015
Tweet

More Decks by Szymon Skórczyński

Other Decks in Programming

Transcript

  1. DOCKER
    on
    AWS Elastic Beanstalk
    Szymon Skórczyński
    Schibsted Tech Polska
    AWS UG Tricity
    October 15, 2015

    View full-size slide

  2. Szymon Skórczyński
    PHP Developer
    @sskorc

    View full-size slide

  3. WHAT MAKES DOCKER
    SO GOOD?

    View full-size slide

  4. Host OS
    Hypervisor
    Guest
    OS
    Guest
    OS
    Guest
    OS
    bins/libs bins/libs bins/libs
    App A App A` App B
    Host OS
    Docker
    bins/libs bins/libs
    App A
    App A’
    App B
    App B’
    App B’
    App B’
    VM
    Docker container
    Docker
    Standard VM

    View full-size slide

  5. IMAGE
    VS
    CONTAINER

    View full-size slide

  6. HOW TO DEVELOP?

    View full-size slide

  7. Host (Mac or Windows)
    Docker Client
    Docker Machine
    Docker Server
    Container
    Apache
    Container
    Mongo

    View full-size slide

  8. applicaction
    sources
    DB
    files

    View full-size slide

  9. php:
    build: .
    links: [db]
    volumes:
    - .:/var/www/docker-symfony
    nginx:
    image: nginx:1.9.4
    links: [php]
    volumes_from: [php]
    volumes:
    - ./docker/vhost.conf:/etc/nginx/conf.d/default.conf
    ports: ["80:80"]
    db:
    image: mongo:latest
    volumes:
    - /mnt/sda1/var/lib/mongo-data:/data/db
    ports: ["27017:27017"]
    docker-compose.yml

    View full-size slide

  10. FROM php:5.6.12-fpm
    RUN apt-get update \
    && curl -sL https://deb.nodesource.com/setup | bash - \
    && apt-get install -y git libssl-dev zlib1g-dev libicu-dev g++ \
    && pecl install mongo \
    && echo extension=mongo.so > /usr/local/etc/php/conf.d/mongo.ini \
    && pecl install apcu-beta \
    && echo extension=apcu.so > /usr/local/etc/php/conf.d/apcu.ini \
    && docker-php-ext-install zip mbstring intl
    RUN curl -sS https://getcomposer.org/installer | php \
    && mv composer.phar /usr/bin/composer
    ADD docker/php.ini /usr/local/etc/php/php.ini
    WORKDIR /var/www/docker-symfony
    Dockerfile

    View full-size slide

  11. FROM sskorc/symfony2-mongo:latest
    ADD docker/php.ini /usr/local/etc/php/php.ini
    WORKDIR /var/www/docker-symfony
    Dockerfile

    View full-size slide

  12. RUN IT!
    docker-compose up -d

    View full-size slide

  13. HOW TO DEPLOY?

    View full-size slide

  14. THE STEPS
    1. Create a specific IAM policy and assing it to the role
    2. Create a new environment with “Multi-container Docker”
    predifined configuration

    View full-size slide

  15. THE STEPS
    1. Create a specific IAM policy and assing it to the role
    2. Create a new environment with “Multi-container Docker”
    predifined configuration

    View full-size slide

  16. THE STEPS
    1. Create a specific IAM policy and assing it to the role
    2. Create a new environment with “Multi-container Docker”
    predifined configuration
    3. Assign a proper role to the environment

    View full-size slide

  17. THE STEPS
    1. Create a specific IAM policy and assing it to the role
    2. Create a new environment with “Multi-container Docker”
    predifined configuration
    3. Assign a proper role to the environment

    View full-size slide

  18. THE STEPS
    1. Create a specific IAM policy and assing it to the role
    2. Create a new environment with “Multi-container Docker”
    predifined configuration
    3. Assign a proper role to the environment
    4. Prepare the Dockerrun.aws.json file
    5. Deploy!

    View full-size slide

  19. {
    "AWSEBDockerrunVersion": 2,
    "authentication": {
    "bucket": "docker-symfony",
    "key": "docker/dockercfg"
    },
    "volumes": [
    {
    "name": "data",
    "host": { "sourcePath": "/var/data" }
    },
    {
    "name": "symfony-app",
    "host": { "sourcePath": "/var/app/current" }
    },
    {
    "name": "vhost-config",
    "host": { "sourcePath": "/var/app/current/docker/vhost.conf" }
    }
    ],

    View full-size slide

  20. "containerDefinitions": [{
    "name": "db",
    "image": "mongo:latest",
    "essential": true,
    "memory": 256,
    "mountPoints": [{
    "sourceVolume": "data",
    "containerPath": "/data/db"
    }]
    },
    {
    "name": "php",
    "image": "sskorc/docker-symfony:latest",
    "essential": true,
    "memory": 256,
    "links": ["db"],
    "mountPoints": [{
    "sourceVolume": "symfony-app",
    "containerPath": "/var/www/docker-symfony"
    }]
    },

    View full-size slide

  21. {
    "name": "nginx",
    "image": "nginx:1.9.4",
    "essential": true,
    "memory": 256,
    "portMappings": [{
    "hostPort": 80,
    "containerPort": 80
    }],
    "links": ["php"],
    "mountPoints": [{
    "sourceVolume": "symfony-app",
    "containerPath": "/var/www/docker-symfony"
    },
    {
    "sourceVolume": "vhost-config",
    "containerPath": "/etc/nginx/conf.d/default.conf"
    }]
    }
    ]
    }
    Dockerrun.aws.json

    View full-size slide

  22. option_settings:
    - namespace: aws:elasticbeanstalk:command
    option_name: Timeout
    value: 1200
    commands:
    01_docker_clean_containers:
    command: docker rm -v $(docker ps -a -q)
    ignoreErrors: true
    02_docker_clean_images:
    command: docker rmi $(docker images -q)
    ignoreErrors: true
    .ebextensions/01docker.config

    View full-size slide

  23. checkout
    sources
    push
    sf2 image
    pull
    sf2 image
    mongo image
    nginx image
    GitHub
    CircleCI
    AWS
    Docker Hub
    build sf2 image
    run tests
    on sf2 image
    send
    and fire!
    pull
    mongo image
    run
    sf2 image
    mongo image
    nginx image

    View full-size slide

  24. checkout
    sources
    push
    sf2 image
    pull
    sf2 image,
    mongo image,
    nginx image
    GitHub
    CircleCI
    AWS
    Docker Hub
    build
    run tests
    on
    send sources
    and fire!
    pull
    mongo image
    run
    sf2 image,
    mongo image,
    nginx image

    View full-size slide

  25. checkout
    sources
    push
    sf2 image
    pull
    sf2 image,
    mongo image,
    nginx image
    GitHub
    CircleCI
    AWS
    Docker Hub
    build
    run tests
    on
    send sources
    and fire!
    pull
    mongo image
    run
    sf2 image,
    mongo image,
    nginx image
    APPLICATION_VERSION=$ENVIRONMENT-$BUILD_NUM-docker-symfony.zip
    zip $APPLICATION_VERSION -r .
    aws s3 cp $APPLICATION_VERSION s3://$EB_BUCKET/$APPLICATION_VERSION
    aws elasticbeanstalk create-application-version --application-name
    "docker-symfony" \
    --version-label $BUILD_NUM --source-bundle S3Bucket=
    $EB_BUCKET,S3Key=$APPLICATION_VERSION
    aws elasticbeanstalk update-environment --environment-name
    $ENVIRONMENT \
    --version-label $BUILD_NUM

    View full-size slide

  26. checkout
    sources
    push
    sf2 image
    pull
    sf2 image,
    mongo image,
    nginx image
    GitHub
    CircleCI
    AWS
    Docker Hub
    build sf2 image
    run tests
    on sf2 image
    send sources
    and fire!
    pull
    mongo image
    run
    sf2 image,
    mongo image,
    nginx image

    View full-size slide

  27. SHOULD YOU TRY DOCKER?

    View full-size slide

  28. WHY?
    Portability
    Isolation
    Performance
    Modularity
    Community

    View full-size slide

  29. https://github.com/sskorc/docker-symfony
    http://www.schibsted.pl/category/devops/
    @sskorc

    View full-size slide