Introduction à Docker

@AlexisHassler

INSA
Sewatech

Principes de base

Fonctionnement de Docker

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

https://www.docker.com/what-docker

Architecture

Isolation

Architecture

VM
Docker

Architecture

Linux

En développement

MongoDB

PostgreSQL

MySQL

AsciiDoctor

RabbitMQ

ActiveMQ

ActiveMQ

Docker

En production

Docker en production

Ecosystème

Premiers pas

Installation sous Linux

  • Client
    • Application Linux
  • Serveur
    • Daemon Linux
Linux

Installation sous Linux

# Déclarer la source
echo "deb https://apt.dockerproject.org/repo ubuntu-wily main" \
     >> /etc/apt/sources.list.d/docker.list
# Installer Docker
apt-get update
apt-get install docker-engine

Installation sous Linux

sudo docker help ...
sudo addgroup $USER docker
docker help ...

Installation sous Linux

installation remote
export DOCKER_HOST=docker.sewatech.fr

Installation sous MacOS

  • Client
    • Application MacOS
  • Serveur
    • Linux VM
Windows

Installation sous MacOS

Docker for Mac
brew install docker
brew cask install docker

Installation sous Windows

  • Client
    • Application Windows
  • Serveur
    • Linux VM
Windows

Installation sous Windows

Docker for Windows

Installation sous Windows

Windows Container

Installation

docker version
Client:
 Version:      17.03.0-ce
 API version:  1.26
 Go version:   go1.7.5
 Git commit:   60ccb22
 Built:        Thu Feb 23 11:02:43 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.03.0-ce
 API version:  1.26 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   60ccb22
 Built:        Thu Feb 23 11:02:43 2017
 OS/Arch:      linux/amd64
 Experimental: false

Démarrer un conteneur

docker image pull hello-world
docker container run hello-world

Conteneurs

Run interactif

docker container run -it debian
root@72371fac506b:/#

Isolation des conteneurs

ls -l /
rm -r /bin

Isolation des conteneurs

alexis@Mac ~ $ ifconfig

en0       Link encap:Ethernet  HWaddr 02:42:ac:11:00:03
          inet addr:192.168.1.42  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:3/64 Scope:Link
          ...
lo        Link encap:Local Loopback
          ...
root@203f542a3fdb:/$ ifconfig

eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:03
          inet addr:172.17.0.3  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:3/64 Scope:Link
          ...
lo        Link encap:Local Loopback
          ...

Isolation des conteneurs

alexis@Mac ~ $ netstat -pan

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address     Foreign Address   State
tcp        0      0 127.0.1.1:53      0.0.0.0:*         LISTEN
tcp6       0      0 :::5000           :::*              LISTEN
tcp6       0      0 :::8000           :::*              LISTEN
tcp6       0      0 ::1:8000          ::1:46082         ESTABLISHED
...
root@203f542a3fdb:/$ netstat -pan

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address     Foreign Address   State

Active UNIX domain sockets (servers and established)
Proto RefCnt Flags   Type   State     I-Node   Path

Run interactif

docker container run -it alpine
docker container run -it alpine /bin/sh
docker container run -it debian echo "Hello World"

Run détaché

docker container run -d httpd
alexis@Mac ~ $

Run détaché

# Liste des conteneurs actifs
docker container ls

# Liste de tous les conteneurs
docker container ls -a
# Logs d'un conteneur
docker container logs <container-name>

Cycle de vie

docker container stop elegant_brahmagupta
docker container kill elegant_brahmagupta

Cycle de vie

container lifecycle

Cycle de vie

docker container rm elegant_brahmagupta
docker container rm 72371f
docker container run -it --rm debian

Cycle de vie

docker container rm $(docker container ls -f status=exited)
# avec confirmation
docker container prune

# sans confirmation
docker container prune -f

Cycle de vie

docker container logs elegant_brahmagupta
docker container logs --tail 10 elegant_brahmagupta
docker container logs --follow elegant_brahmagupta

Images

Commande build

docker image build -t sw/app .
docker container run -d sw/app

Dockerfile

FROM httpd
MAINTAINER Alexis Hassler <alexis.hassler@sewatech.fr>

RUN apt-get update

COPY site/ /var/www/

WORKDIR /var/www/

ENTRYPOINT ["/start.sh"]
CMD ["--env=default"]
# ou
CMD ["/start.sh", "--env=default"]

Dockerfile, exécution

docker container run -d sw/app --env=dev
docker container run -it debian bash

Dockerfile, échanges

Système de fichiers en couches

docker image history demo/layers
IMAGE         CREATED BY                                  SIZE
23b9aa4066c0   /bin/sh -c rm tomcat85                     0 B
054d0880c62e   /bin/sh -c unzip tomcat85                  13.14 MB
6a209ff5aea1   /bin/sh -c wget http://bit.ly/tomcat85     9.9 MB
859c09d07c42   /bin/sh -c apt-get install -y wget unzip   40.8 MB
33b20b7674a7   /bin/sh -c apt-get update                  9.861 MB
73e72bf822ca   /bin/sh -c (nop)  CMD ["/bin/bash"]        0 B
<missing>      /bin/sh -c (nop) ADD file:41ea5187c50115   123 MB

Système de fichiers en couches

Systèmes nus

Busybox

1 Mo

Alpine

5 Mo

Debian

125 Mo

Ubuntu

130 Mo

CentOS

200 Mo

Fedora

200 Mo

Systèmes avec httpd

Busybox

1 Mo

Alpine

9 Mo

Debian

180 Mo

Ubuntu

225 Mo

CentOS

245 Mo

Fedora

275 Mo

Gérer les images

docker image ls
docker image ls -a
docker image ls -f "dangling=true"
docker image ls -f "dangling=false"

Gérer les images

docker image rm da7ff372b5067f5
docker image rm --no-prune da7ff372b5067f5
docker image rm -f da7ff372b5067f5

Gérer les images

docker image rm $(docker image ls -qf "dangling=true")
# uniquement sans tag
docker image prune

# y compris avec tag
docker image prune -a

# sans confirmation
docker image prune -f

Réseau

Exposition de ports

docker container run -p 8888:80 httpd

Réseaux par défaut

network bridge

Réseaux par défaut

network host

Réseaux par défaut

network none

Réseaux personnalisés

network custom

Réseaux personnalisés

docker network create frontend

docker container run -d --net=frontend --name web              \
                     sewatech/httpd
docker container run -d --net=frontend --name app              \
                     sewatech/tomcat
network custom named
$ ping web

Volumes

Partage de répertoire

docker container run -d
           -v ${PWD}/web-content:/usr/local/apache2/htdocs    \
           --name web httpd
image/svg+xml root:root root:root

Volumes nommés

docker container run -it -v cli-data:/data --name cli debian
docker container run -it -v /data --name cli debian
image/svg+xml root:root root:root

Volumes nommés

docker volume create --name data-vol
docker volume create --name data-vol              \
                     --driver local               \
                     --opt type=tmpfs             \
                     --opt device=tmpfs           \
                     --opt o=size=100m,uid=1000

Volumes nommés

docker volume ls
docker volume ls -f 'dangling=true'

Volumes nommés

docker volume rm cli-data
docker container rm -v cli
docker volume prune

Sécurité

image/svg+xml root:root root:root

Sécurité

USER toto
USER 1000

Multi-conteneurs

Docker Compose

  • Orchestration des conteneurs locaux
docker container run sw/web
docker container run sw/db
docker container run sw/app
  • Rationalisation des scripts
docker container run                   \
          -p 1000:8080 -p 1001:1099    \
          -v $PWD/data:/db/data        \
          -v $PWD/log:/db/logs         \
          --net=backend                \
          --name=db                    \
          sw/db main

Docker Compose

Docker Compose

compose_version=1.11.2
base_url=https://github.com/docker/compose/releases/download
url=$base_url/$compose_version/docker-compose-`uname -s`-`uname -m`

curl -L $url > /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

Docker Compose

# Debian, Ubuntu,...
apt-get -y install python-pip

# CentOS (with EPEL repository)
yum install epel-release
yum install python-pip

# Fedora
dnf install python-pip
pip install docker-compose

Docker Compose

docker image pull docker/compose:$compose_version
docker container run --rm -it                                             \
                     -v /var/run/docker.sock:/var/run/docker.sock         \
                     -v $(pwd):$(pwd)                                     \
                     -w "$(pwd)"                                          \
                     docker/compose:$compose_version
compose_version=1.11.2
base_url=https://github.com/docker/compose/releases/download
url=$base_url/$compose_version/run.sh

curl -L $url > /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

docker-compose.yml

version: '2'
services:
  web:
    ...
volumes:
  log: ...
networks:
  front-tier:
    driver: bridge

docker-compose.yml

services:
  web:
    image: sewatech/web
    build:
      context: .
    ports:
    - "127.0.0.1:8888:80"
    volumes:
    - web-content:/usr/local/apache2/htdocs
    networks:
    - front-tier

Principales commandes

docker-compose up -d
docker-compose up -d --force-recreate
docker-compose down

TP

 

Introduction à Docker

@AlexisHassler

INSA

FIN

Sewatech