Docker images bestaan uit lagen. Wanneer we een image pullen of pushen, worden alleen de lagen die nog niet in de cache staan overgedragen. Dat betekent dat als we meerdere images hebben die gebaseerd zijn op dezelfde basis OS, dat we dan de basis laag maar 1 keer hoeven te maken of te downloaden. VM's hebben deze flexibiliteit niet.
$ docker commit -m "Added more restrictive pg_hba.conf." \
-a "Sander Smits" 0b2616b0e5a8 nens/postgres:9.5
Stel we hebben een container image van 1 GB. Als we een VM zou wilen gebruiken als alternatief, dan zouden we 1 GB x het aantal VM's dat we willen nodig hebben. Met Docker kunnen we grootste deel van die 1 GB delen. Dus als we 1000 containers met hetzelfde OS hebben heb je maar iets meer dan 1 GB nodig om ze allemaal te runnen.
Geen probleem.
Gebruik docker-machine met VirtualBox.
ook voor Windows
# inframan/dockerfiles/base/Dockerfile.ubuntu-14.04-base
FROM ubuntu:trusty
MAINTAINER Sander Smits <sander.smits@nelen-schuurmans.nl>
# system dependencies
RUN apt-get update && apt-get install -y \
python-software-properties wget build-essential git \
libevent-dev libfreetype6-dev libgeos-dev \
libhdf5-serial-dev libpng12-dev mercurial python-dev \
python-lxml python-mapnik python-numpy python-pip \
python-pyproj python-pysqlite2 python-psycopg2 python-sympy \
python-scipy spatialite-bin gdal-bin libgdal1h libnetcdf-dev \
netcdf-bin python-gdal
# pip packages
RUN pip install matplotlib six
$ docker build -t nens/ubuntu-14.04-base \
-f Dockerfile.ubuntu-14.04-base .
# inframan/dockerfiles/threedi/Dockerfile.subgrid-flow-base
FROM dockrepo.lizard.net/nens/ubuntu-12.04-base
MAINTAINER Sander Smits <sander.smits@nelen-schuurmans.nl>
# run buildout and install calculation cores
...
# put custom supervisord.conf in place
ADD supervisord.conf /srv/parts/supervisor/supervisord.conf
WORKDIR /srv
$ docker build -t threedi/subgrid-flow-base \
-f Dockerfile.subgrid-flow-base .
Een Docker registry is een repository voor Docker images.
$ docker images | grep threedi/subgrid-flow-base
threedi/subgrid-flow-base latest 9caa7caa5ef2 ... 2.116 GB
$ docker tag 9caa7caa5ef2 dockrepo.lizard.net/threedi/subgrid-flow-base
$ docker images | grep threedi/subgrid-flow-base
threedi/subgrid-flow-base latest 9caa7caa5ef2 ...
dockrepo.lizard.net/subgrid-flow-base latest 9caa7caa5ef2 ...
$ docker push dockrepo.lizard.net/threedi/subgrid-flow-base
$ docker run -it --rm python:3.5.1 bash
root@c48fe9d5dd43:/# python
Python 3.5.1 (default, Mar 9 2016, 03:30:07)
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
$ docker run -d -p 8080:8080 -p 50000:50000 jenkins
$ docker run -d -p 15672:15672 -p 5672:5672 rabbitmq:3-management
$ docker run -d -p 9292:9292 -p 9200:9200 pblittle/docker-logstash
$ docker run -d mdillon/postgis:9.5
# docker-compose.yml
# rabbitmq for celery
mq:
image: rabbitmq
# postgis
db:
image: kartoza/postgis:9.3
volumes:
- /data/postgres:/var/lib/postgresql
# threedi-inpy
inpy:
image: dockrepo.lizard.net/threedi/inpy:latest
ports:
- "9010:5000"
volumes:
- /data/models:/srv/var/models
environment:
- REDIS_HOST=10.0.3.100
- RABBIT_MQ_HOST=mq
- DATABASE_HOST=db
- DATABASE_NAME=gis
- DATABASE_USER=docker
- DATABASE_PASSWORD=docker
command: /srv/bin/supervisord
links:
- mq
- db
$ docker-compose up