Apache Karaf 4.2.1 & Docker

Apache Karaf 4.2.1 & Docker

Déployé début Septembre 2018, Apache Karaf™ 4.2.1 connait une MAJ majeure de la série de 4.2.x en apportant corrections, améliorations et nouvelles fonctionnalités comme :

  • un meilleur support de Java 9, 10 & 11
  • Des jeux d’exemples directement disponibles dans la distribution Karaf, vous permettant de démarrer facilement.
  • Meilleur KarafTestSupport vous permettant de créer facilement vos propres tests d’intégration
yupiik-article-karaf-docker

Une des nouvelles fonctionnalités ajoutées dans cette version est le support de Docker : excellente plateforme de conteneurs. Le mélange de Docker (conteneur système) et d’Apache Karaf ™ (conteneur d’application) donne un ensemble d’une grande flexibilité ainsi qu’une approche puissante pour vos applications, écosystème. Vous décidez ainsi de l’approche de provisionnement que vous souhaitez adopter :

  • Statique : en utilisant le profil statique de Karaf directement exécuté dans Docker
  • Dynamique : avec une distribution Karaf régulière utilisée dans Docker

La version 4.2.1 apporte deux outils :

  1. Un Build tooling (scripts) qui permet de créer facilement une image Docker Karaf utilisable pour créer des conteneurs Docker
  2. Un dockerfeature qui permets de manipuler Docker directement depuis Karaf (utilisable depuis une instance en cours d’exécution)

Adaptation de l’article :  « Apache Karaf & Docker» du blog Nanthrax écrit par Jean-baptiste Onofré (Technical Advisor)

Les caractéristiques du Docker Karaf

assembly/docker/build.sh n’est pas la seule nouveauté dans Apache Karaf 4.2.1.Une nouvelle fonctionnalité de docker a également été ajoutée. Elle permet d’interagir avec Docker directement depuis une instance Apache Karaf en cours d’exécution.

Les conditions préalables

La fonction docker Apache Karaf interagit avec Docker utilisant tcp. Vous devez l’activer en passant une option au deamon Docker : /usr/bin/dockerd -H fd:// -H tcp://localhost:2375

Par exemple, sur un système Ubuntu, vous pouvez configurer le deamon Docker dans le fichier /lib/systemd/system/docker.service en modifiant la propriété ExecStartExecStart=/usr/bin/dockerd -H fd:// -H tcp://localhost:2375

Vous devez redémarrer le Deamon Docker après avoir modifié le fichier docker.service>$ service docker restart

Vous pouvez vérifier l’état du Docker :

> service docker status
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; disabled; vendor preset: enabled)
   Active: active (running) since Tue 2018-09-11 11:30:08 CEST; 3min 7s ago
     Docs: https://docs.docker.com
 Main PID: 31978 (dockerd)
    Tasks: 38
   CGroup: /system.slice/docker.service
           ├─31978 /usr/bin/dockerd -H fd:// -H tcp://localhost:2375
           └─32004 docker-containerd --config /var/run/docker/containerd/containerd.toml
sept. 11 11:30:07 precision dockerd[31978]: time="2018-09-11T11:30:07.569933812+02:00" level=warning msg="Your kernel does not support cgroup rt period"
sept. 11 11:30:07 precision dockerd[31978]: time="2018-09-11T11:30:07.569949221+02:00" level=warning msg="Your kernel does not support cgroup rt runtime"
sept. 11 11:30:07 precision dockerd[31978]: time="2018-09-11T11:30:07.570903883+02:00" level=info msg="Loading containers: start."
sept. 11 11:30:08 precision dockerd[31978]: time="2018-09-11T11:30:08.258633531+02:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address"
sept. 11 11:30:08 precision dockerd[31978]: time="2018-09-11T11:30:08.289844901+02:00" level=info msg="Loading containers: done."
sept. 11 11:30:08 precision dockerd[31978]: time="2018-09-11T11:30:08.360892312+02:00" level=info msg="Docker daemon" commit=7390fc6 graphdriver(s)=overlay2 version=17.12.1-ce
sept. 11 11:30:08 precision dockerd[31978]: time="2018-09-11T11:30:08.361071172+02:00" level=info msg="Daemon has completed initialization"
sept. 11 11:30:08 precision dockerd[31978]: time="2018-09-11T11:30:08.365804009+02:00" level=info msg="API listen on 127.0.0.1:2375"
sept. 11 11:30:08 precision dockerd[31978]: time="2018-09-11T11:30:08.365826737+02:00" level=info msg="API listen on /var/run/docker.sock"
sept. 11 11:30:08 precision systemd[1]: Started Docker Application Container Engine.

Ce service de docker peut être utilisé localement ou à distance grâce à la fonction Karaf Docker.

Installation de la fonction Karaf Docker

Il est très simple d’installer la fonction docker sur une instance Apache Karaf en cours d’exécution : karaf@root()> feature:install docker

Une fois la fonction docker installée,de nouvelles commandes docker:* shell sont disponibles dans Karaf.

docker:info est utilisable pour obtenir des détails sur le service Docker :

karaf@root()> docker:info 
Containers: 0
Debug: false
Driver: overlay2
ExecutionDriver: null
IPv4Forwarding: true
Images: 1
IndexServerAddress: https://index.docker.io/v1/
InitPath: null
InitSha1: null
KernelVersion: 4.15.0-33-generic
MemoryLimit: true
NEventsListener: false
NFd: 20
NGoroutines: 33
SwapLimit: false

Par défaut, Karaf Docker utilise l’URL http://localhost:2375 pour interagir avec Docker. Si vous souhaitez vous connecter à un autre service Docker (à distance par exemple), il vous faut utiliser la commande --url

karaf@root()> docker:info --url http://localhost:2375

docker:version fournit les détails du service Docker que vous utilisez :

karaf@root()> docker:version
Version: 17.12.1-ce
Os: linux
Kernel version: 4.15.0-33-generic
Go version: go1.10.1
Git commit: 7390fc6
Arch: amd64
API version: 1.35
Build time: 2018-02-28T17:46:05.000000000+00:00
Experimental: null

Toute action de Docker peut être effectuée à l’aide de la commande Karaf shell, ou directement dans le DockerMBean fourni par Karaf.

Cas pratique : docker ElasticSearch avec proxy http

La documentation d’Apache Karaf décrit toutes les commandes docker:* : pour plus d’informations .

Manipuler le conteneur Docker directement dans Karaf et exposer dans Karaf

Pour illustrer ce cas d’utilisation, nous utilisons une image Docker approvisionnant ElasticSearch. Tout d’abord, recherchons l’image directement dans Karaf à l’aide des commandes docker:search shell :

karaf@root()> docker:search elasticsearch
Name                                │ Description                                                                                          │ Automated │ Official │ Star Count
────────────────────────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────┼───────────┼──────────┼───────────
elasticsearch                       │ Elasticsearch is a powerful open source search and analytics engine that makes data easy to explore. │ false     │ true     │ 3027
...

On extrait l’image ElasticSearch à l’aide de la commande docker:pull :

karaf@root()> docker:pull -v elasticsearch

Les images disponibles dans le service Docker sont visibles en utilisant la commande docker:images :

karaf@root()> docker:images
Id                                                                      │ RepoTags               │ Created    │ Labels │ Size      │ Virtual Size
────────────────────────────────────────────────────────────────────────┼────────────────────────┼────────────┼────────┼───────────┼─────────────
sha256:362c5cb1669b144eef89d39a6e9153c546c14923e10fde17701920615c0e2add │ [elasticsearch:latest] │ 1536162308 │        │ 485920188 │ 485920188

Maintenant, nous pouvons créer un conteneur en utilisant l’image Elasticearch et le contrôler directement depuis Karaf :

karaf@root()> docker:create --cmd '/docker-entrypoint.sh' --tty --image elasticsearch --exposedPort 9200/tcp --hostPortBinding 9200 elasticsearch

Le conteneur ElasticSearch disponible avec la commande docker:ps est ainsi visible :

karaf@root()> docker:ps -a
Id                                                               │ Names           │ Command                                     │ Created    │ Image         │ Image ID                                                                │ Status  │ State   │ Ports │ Size │ Size Root
─────────────────────────────────────────────────────────────────┼─────────────────┼─────────────────────────────────────────────┼────────────┼───────────────┼─────────────────────────────────────────────────────────────────────────┼─────────┼─────────┼───────┼──────┼──────────
6db4369b07eb3894034c77ea3e28b08e80ec723a711ee90ff6f1a3917256a57b │ [elasticsearch] │ /docker-entrypoint.sh /docker-entrypoint.sh │ 1536674098 │ elasticsearch │ sha256:362c5cb1669b144eef89d39a6e9153c546c14923e10fde17701920615c0e2add │ Created │ created │       │ 0    │ 0

Nous démarrons notre conteneur ElasticSearch :

karaf@root()> feature:install http

La fonctionnalité http apporte le support des proxies HTTP. Ainsi, nous pouvons simplement ajouter un proxy du service Karaf HTTP au conteneur ElasticSearch Docker :

karaf@root()> http:proxy-add /elasticsearch http://localhost:9200

Le proxy HTTP disponible est visible  dans Karaf :

karaf@root()> http:proxies 
URL            │ ProxyTo
───────────────┼──────────────────────
/elasticsearch │ http://localhost:9200

Maintenant, ElasticSearch est accessible via Karaf en utilisant http://localhost:8181/elasticsearch.

Fondamentalement, la fonction Karaf docker est un moyen d’interagir avec le service Docker directement avec les commandes du docker. Il offre également une caractéristique unique : l’approvisionnement.

L'approvisionnement Karaf Docker

Vous avez une instance Karaf en cours d’exécution où vous installez un tas de fonctionnalités, de bundles, modifiez la configuration, …. Vous souhaitez créer un conteneur Docker en utilisant cette instance ? Simplifiez l’utilisation de la commande docker:provision. Il créera un conteneur Docker avec votre instance comme volume de conteneur, le démarrant automatiquement.

Pour créer le conteneur :

karaf@root()> docker:provision mykaraf

Vous disposez désormais d’un nouveau conteneur mykaraf

karaf@root()> docker:ps -a
Id                                                               │ Names     │ Command                     │ Created    │ Image             │ Image ID                                                                │ Status  │ State   │ Ports │ Size │ Size Root
─────────────────────────────────────────────────────────────────┼───────────┼─────────────────────────────┼────────────┼───────────────────┼─────────────────────────────────────────────────────────────────────────┼─────────┼─────────┼───────┼──────┼──────────
d3f3feb99f7f63735fed24946b2d4fe76d83742db0cada4c743ba3535cb73ed4 │ [mykaraf] │ /opt/apache-karaf/bin/karaf │ 1536681767 │ java:8-jre-alpine │ sha256:fdc893b19a147681ee764b2edab6c494d60fe99d83b14b8794bbcbc040ec7aa7 │ Created │ created │       │ 0    │ 0

Maintenant, le conteneur peut se lancer même en dehors de l’instance Karaf :

$> docker start mykaraf

Le conteneur mykaraf a démarré :

$> docker ps CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                                              NAMES d3f3feb99f7f        java:8-jre-alpine   "/opt/apache-karaf/b…"   3 minutes ago       Up 1 second         0.0.0.0:1099->1099/tcp, 0.0.0.0:8101->8101/tcp, 0.0.0.0:8181->8181/tcp, 0.0.0.0:44444->44444/tcp   mykaraf

Comme Karaf Docker a automatiquement créé la liaison de port, la connexion à l’instance Karaf fonctionnant dans le conteneur Docker en utilisant ssh est désormais possible :

$> ssh -p 8101 karaf@localhost ... karaf@root()>

Découvrez prochainement un second article sur les mises à jour d’Apache Karaf 4.2.1 : les distributions Vanilla et personnalisées.

Bloqué dans vos roadmaps ?

Vous souhaitez former vos équipes ?

fr_FRFrançais
en_GBEnglish (UK) fr_FRFrançais