Introduction To Docker

People's Postcode Lottery - January 2018

What Is Docker?

Docker allows you to package an application with all of its dependencies into a standardized unit for software development.

Why Do We Use It?

Environment Parity

Easier Tooling

Experimentation

Container v Image

Image

  • Bundled dependencies
  • Distributable
  • Build time configuration
  • Generally environment independent

Container

  • Running instance of an Image
  • Runtime configuration

2 Main Components

  • Docker Engine
  • Docker Compose

Dockerfile

Main Dockerfile Commands

  • FROM
  • RUN
  • VOLUME
  • CMD
  • COPY/ADD
  • ENTRYPOINT
  • WORKDIR
  • HEALTHCHECK
FROM alpine:3.5

RUN apk add --no-cache bash

ENTRYPOINT bash
FROM alpine:3.5

RUN apk add --no-cache bash

COPY ./demo /var/www

WORKDIR /var/www

ENTRYPOINT bash

Volumes

  • Host to Container Mapping:
    • ./secrets:/var/run/secrets
  • Container Volumes
    • - /secrets
    • Can be named or unnamed (volumes key in compose file)
  • Plugins (Not really used here)

Docker Compose

  • Orchestration tool for Docker Engine
  • Primarily used for Development
  • Create full application stacks
  • Define the parity you'll later use in prod
version: '2'

volumes:
    cache:
        driver: local
        driver_opts:
            type: tmpfs
            device: tmpfs
            o: uid=33
    logs:
        driver: local
        driver_opts:
            type: tmpfs
            device: tmpfs
            o: uid=33

networks:
  salesflowmanagerapi_default:
    external: true

services:
    application:
        build:
            dockerfile: ./Dockerfile
            context: .
        entrypoint: /var/www/opt/docker/dev/entrypoint
        environment:
            - SYMFONY_ENVIRONMENT=test
            - BLACKFIRE_SERVER_ID
            - BLACKFIRE_SERVER_TOKEN
        volumes:
            - ./opt/beats/dev/filebeat.yml:/etc/filebeat/filebeat.yml:ro
            - ./opt/elk/dev/logstash/logstash-beats.crt:/etc/pki/tls/certs/logstash-beats.crt:ro
            - ./opt/php/dev/php.ini:/usr/local/etc/php/php.ini:ro
            - ./opt/php/dev/conf.d/:/usr/local/etc/php/conf.d/:ro
            - .:/var/www
            - ../../src:/var/php-src:ro
            - cache:/var/www/var/cache
            - logs:/var/www/var/logs
        depends_on:
            - elk
            - redis
        dns_search:
            - pluk.eeghlan.net
        dns:
            - 172.26.10.2
            - 10.2.0.10
        privileged: true
        tmpfs:
            - /tmp:rw,nodev,noexec,nosuid
        env_file:
            - .env
            - ./src/App/Salesflow/Domain/SalesflowManager/.env
        ports:
            - 80
        networks:
            - salesflowmanagerapi_default

    redis:
        image: redis:alpine

    elk:
      image: sebp/elk
      ports:
          - "5044:5044" # Logstash Beats interface
          - "5601:5601" # Kibana web interface
          - 9200 # Elasticsearch JSON interface
      volumes:
          - ./opt/elk/dev/logstash/logstash.conf:/etc/logstash/logstash.conf
          - ./opt/elk/dev/logstash/logstash-beats.crt:/etc/pki/tls/certs/logstash-beats.crt
          - ./opt/elk/dev/logstash/logstash-beats.key:/etc/pki/tls/private/logstash-beats.key
          - ./opt/elk/dev/logstash/patterns:/opt/logstash/patterns
          - logs:/var/www/app/logs

Important Commands

  • Build:
    • docker image build --tag <tag_name> . -f <file_name>
  • Start Docker-Compose application
    • docker-compose up
  • Stop Docker Compose
    • docker-compose kill
  • System Cleanup
    • docker system prune
  • Execute into a container (compose)
    • docker-compose exec <container_compose_name> sh
  • Execute into a container (Non-Compose)
    • docker container exec -ti <container_id/name> sh
  • Run a container
    • docker container run --rm <image_name>:<image_tag>

Deploying Docker

  • Build image from repository
  • Push image to a Docker Registry
  • Create Ansible Playbook
    • Pull docker image
    • Set up dependant services
    • Expose correct environment variables
    • Run container

Questions?

Introduction To Docker

By Scott Pringle

Introduction To Docker

  • 692