4 posts tagged

hint

This oneliner will query for last 5 containers and removes them.

docker ps -a -n 5 -q | xargs docker rm

It is useful when you have dangling containers after failed builds

Afterward, you can launch image cleanup because you won't be tied with stopped containers.

docker rmi `docker images -qf dangling=true`

It is sometimes happened when you need to update just docker image and do not do deployment again. Here is oneliner to do this for Kubernetes deployment myapp.

printf '{"spec":{"template":{"metadata":{"labels":{"date":"%s"}}}}}' `date +%s`  | xargs -0 kubectl patch deployment myapp -p
  1. Bundle package will create a cached copy, so bundler in docker will not fetch all dependencies all the time.
bundle package
  1. Create separate bundler data volume to perisist bundle between builds. Set BUNDLE_PATH to data volume. You can include this option just for development docker-compose.yml file and not to include in production.
version: "2"

services:
  memcached:
    image: memcached
    networks:
      - back-tier
  redis:
    image: redis
    ports: ["6379"]
    networks:
      - back-tier
  db:
    image: mysql:5
    volumes:
      - ./sql:/docker-entrypoint-initdb.d
      - mysql:/var/lib/mysql
    networks:
      - back-tier

  sse:
    image: mprokopov/sse
    build:
      context: sse/.
    command: "bundle exec rackup --host 0.0.0.0 --port 9292"
    environment:
      - RACK_ENV=production ## docker database settings in config.yml
    ports:
      - "9292:9292"
    links:
      - redis
      - db
    depends_on:
      - db
      - redis
    networks:
      - back-tier
      - front-tier

  worker:
    image: mprokopov/itservice_web_dev
    command: "bundle exec rake environment resque:work"
    environment:
      - QUEUE=*
    links:
      - db
      - redis
    depends_on:
      - db
      - redis
    networks:
      - back-tier

  worker-schedule:
    image: mprokopov/itservice_web_dev
    command: "bundle exec rake environment resque:scheduler"
    links:
      - db
      - redis
    depends_on:
      - redis
    networks:
      - back-tier

  search:
    image: mprokopov/itservice_search
    build: ./search
    volumes:
      - search-data:/search
    depends_on:
      - db
    links:
      - db
    networks:
      - back-tier
    expose:
      - "9306"
  web:
    ports:
      - "3000:3000"
    environment:
      - LETTER_OPENER=letter_opener_web
      - RAILS_SERVE_STATIC_FILES=true
      - SLACK_NOTIFICATION=false
      - EMAIL_NOTIFICATION=false
      - SLACK_WEBHOOK_CHANNEL=#events_test
      - STREAM_API=http://localhost:9292
    depends_on:
      - db
      - redis
    links:
      - db
      - redis
      - search
    networks:
      - back-tier
      - front-tier
    volumes:
      - search-data:/search

volumes:
  search-data:
  mysql:

networks:
  back-tier:
  front-tier:
  1. Use docker-compose.override.yml for development and docker-compose.prod.yml for production builds. Create docker-compose.yml which contains common services configuration.
version: "2"

services:
  db:
    environment:
      - MYSQL_DATABASE=itservice_development
      - MYSQL_USER=
      - MYSQL_ROOT_PASSWORD=
      - MYSQL_PASSWORD=

  sse:
    environment:
      - MYSQL_DATABASE=itservice_development
      - MYSQL_USER=
      - MYSQL_PASSWORD=
      - MYSQL_HOST=db
      - REDIS_HOST=redis
      - RACK_ENV=production ## docker database settings in config.yml

  worker:
    environment:
      - RAILS_ENV=development

  worker-schedule:
    environment:
      - RAILS_ENV=development

  search:
    environment:
      - SPHINX_ENV=development
  web:
    image: mprokopov/itservice_web_dev
    command: bundle exec rails s -b 0.0.0.0 -p 3000
    environment:
      - RAILS_ENV=development
      - LETTER_OPENER=letter_opener_web
      - RAILS_SERVE_STATIC_FILES=true
      - SLACK_NOTIFICATION=false
      - EMAIL_NOTIFICATION=false
      - SLACK_WEBHOOK_CHANNEL=#events_test
      - STREAM_API=http://localhost:9292
      - BUNDLE_PATH=/bundle
    volumes:
      - bundle:/bundle
      - ./app:/app

volumes:
  bundle:
  1. Use docker-compose.prod.yml as docker-compose.override.yml in production, so you will save necessary keystrokes, because docker-compose will use override.yml by default.
  2. Use nginx-proxy container in production and gem unicorn/puma or thin.
    connect nginx-proxy container to frontend network like this
docker network connect itservice_front-tier nginx-proxy

It will enable to use nginx-proxy with docker-compose v2 syntax.

  1. In case you're using CoreOS or systemd you can create container backups via custom backup service and Timer for that service.