Als je aan de slag wilt met de producten van WSO2, dan zijn er verschillende manieren waarop je ze kunt draaien. Je kunt ze lokaal op je computer runnen als je MacOS, Windows of Linux gebruikt.
Variaties op een thema
Veel van deze opties zijn eigenlijk variaties op hetzelfde thema. Als je naar een VirtualBox runt, dan run je eigenlijk een ‘hypervised environment’. De hypervisor creëert een omgeving die lijkt op een geïsoleerde machine. Je kunt bijvoorbeeld op je Windows PC met een VirtualBox een geïsoleerde Linux CentOS omgeving maken. Voor alles wat binnen de CentOS omgeving draait lijkt het een volledig normaal besturingssysteem.
Werken met Docker
Als je aan de slag gaat met Docker is dat allemaal net even anders. Docker containers zijn lichtgewicht en hebben niet zo’n hypervisor nodig, omdat ze direct toegang hebben tot de vereiste routines op de kernel. Op Windows kun je Docker ook runner, maar dan zul je wel het Windows Subsystem voor Linux geïnstalleerd moeten hebben.
We kunnen Docker gebruiken om snel WSO2 instances op te starten door met de WSO2 Docker repo te werken. Deze is voor geregistreerde gebruikers op de WSO2 website te vinden. In deze blog laat ik je zien hoe je vlot een simpele API Manager kunt opzetten met Docker en Docker compose. Laten we beginnen met wat uitleg over wat er zich in de Docker container bevindt.
Wat zit er in een Docker container?
Een Docker container is gebaseerd op een Docker image. Deze docker image bestaat uit ‘lagen’ en enkele lagen vormen samen een basis waarop gebruikers van die image hun container kunnen gebruiken. De docker images die door WSO2 aangemaakt worden, bestaan uit een minimale installatie met tools zoals bash, een aantal andere tools en natuurlijk een WSO2 product. Er zijn verschillende soorten Docker images beschikbaar en ze hebben allemaal een specifieke versie en type WSO2 product.
Hoe kun je in een Docker container kijken
Inzicht krijgen in een Docker container kan op verschillende manieren en één daarvan werkt met de docker command-line tool die met de Docker meekomt.
We kunnen toegang krijgen tot de container door er een commandoregel shell in te openen. Deze shell wordt vanuit de container gestart, maar wordt gevisualiseerd op de commandoregel. Hierdoor werkt de interactie met de container hetzelfde als wanneer je via een SHH-sessie zou zijn ingelogd.
Om een shell in een draaiende Docker container te openen, zullen we deze eerst moeten starten en dan de container moeten identificeren met ID of naam. Als we weten welke container we nodig hebben, dan kunnen we een shell openen en de inhoud bekijken.
De commando’s die ik gebruik zijn allemaal standaard Docker commando’s waarbij ik er vanuit ga dat we een Docker container hebben runnen.
Type docker ps en je krijgt de containers te zien die momenteel runnen. Door een ‘-a’ aan het commando toe te voegen, krijg je ook de containers te zien die niet runnen. (Ik laat hier alleen de relevante container zien).
CONTAINER ID | IMAGE | COMMAND | CREATED | STATUS | PORTS | NAMES |
8a787ffa823e | fbbec18d601c | “/home/wso2carbon/do…” | About an hour ago | Up About an hour | 5672/tcp, 8243/tcp, 8280/tcp, 9099/tcp, 9443/tcp, 9611/tcp, 9711/tcp, 9763/tcp, 9999/tcp, 11111/tcp | wso2apim-320 |
Nu we de ID van de container die we zoeken weten, kunnen we dat gebruiken om een bash in de container uit te voeren. Het getal zal uniek zijn voor jouw container, maar het commando is verder eenvoudig:
docker exec -it 8a787ffa823e bash
Zoals je ziet hebben we nu een interface met een commandoregel waarmee we in de container kunnen kijken. Door de boom met bestandsmappen langs te lopen zien we dat er een API Manager geïnstalleerd is op /home/wso2carbon/wso2am-3.2.0
Een alternatief voor Docker: Portainer
Een alternatief voor de aanpak met een commandoregel is te vinden in het gebruik van de grafische user interface Portainer. Volgens de website is Portainer een ‘universele’ container management tool voor Kubernetes, Docker, Docker Swarm en Azure ACI. Deze GUI laat je jouw containers managen zonder dat je docker commando’s hoeft te kennen. Als je jezelf niet wilt vermoeien met de commandoregel, dan is dit een erg handige oplossing.
Het mooie van Portainer zit hem in het feit dat het daadwerkelijk in een container draait. Het hoeft dus niet te installeren en er zijn weinig downloads nodig. Sec genomen kun je Portainer al in een paar minuten ingesteld en werkend hebben. Portainer biedt instructies voor de installatie die makkelijk te volgen zijn en om duidelijk te maken hoe makkelijk, laat ik het je zien.
Portainer heeft een locatie nodig waar het persistente gegevens op kan slaan. In Docker termen heet dit een ‘volume’. Een volume kan ofwel door Docker beheerd worden of je kunt Docker op een locatie naar keuze wijzen in een bestandsmap. Om dat eenvoudig te houden en Docker het volume te laten beheren, maken we eerst een volume aan voor Portainer.
docker volume create portainer_data
Als het volume er is, dan kunnen we Portainer starten met het volgende commando:
docker run -d -p 8000:8000 -p 9000:9000 –name=portainer –restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
In een notendop: we zeggen tegen docker dat er een container op de achtergrond gerund moet worden op basis van de portainer/portainer-ce image en we specificeren enkele poorten waardoor we toegang tot de Portainer GUI willen krijgen. Er zijn twee volumes geconfigureerd, zodat Portainer bij de docker-management informatie kan en andere dingen kan opslaan die het nodig heeft om te kunnen draaien.
Als de container gestart is, kun je het docker ps commando dat ik eerder noemde gebruiken. Je krijgt nu via de browser op localhost toegang tot de interface met http://localhost:9000/#!/home.
Zo ziet de interface eruit:
Als er ook andere containers op je Docker installatie runnen, zul je die in een lijst zien staan zoals je op bovenstaand screenshot kunt zien.
In de derde kolom van de lijst staan vier icoontjes: Logs, Inspect, Stats en Exec Console.
Logs laat de console output van Docker zien. Inspect geeft inzicht in de gegevens van de container. Stats laat onder andere zien hoeveel geheugen en CPU in gebruik is en Exec geeft de mogelijkheid om een terminal naar de container te starten.
Als we een WSO2 container runnen dan zal de Docker console output de WSO2 carbon log output geven.
Hoe kunnen we een WSO2 Docker image starten?
Nu we Portainer hebben draaien, kunnen we de nieuwste (image-)versie van de WSO2 API Manager container met het volgende commando aanroepen:
docker run -d -p 9443:9443 -p 8280:8280 -p 8243:8243 –name WSO2AM320 wso2/wso2am:latest
Hierdoor zal de container detached runnen (dus op de achtergrond) en krijgt de naam WSO2AM320. Je kunt vanaf je systeem toegang krijgen via poorten 9443,8280 en 8243. Als je deze poorten niet specificeert, dan kun je geen toegang krijgen tot de WSO2 API Manager Management console.
Een bijkomend gevolg van het detached runnen van de container is dat we de console output niet te zien krijgen.
Als je het bovenstaande commando uitvoert, dan krijg je een container ID te zien. We kunnen die ID gebruiken om de console output zichtbaar te maken. Gebruik het volgende commando en vervang mijn ID met het ID wat jij te zien krijgt:
docker logs -f 8a787ffa823e
Als je de browser gebruikt, kunnen we de API Manager Management console zien en inloggen op de API Manager.
Docker compose
In bovenstaande voorbeelden zien we dat de Docker commando’s nogal lang en verwarrend zijn om op te stellen. Je zou deze commando’s daarom ook in een opstartscript kunnen zetten om dingen makkelijker te maken, maar je kunt ook docker-compose benutten.
Docker-compose geeft je de mogelijkheid om diensten te specificeren in een docker-compose.yml bestand. Iedere service is een container met een configuratie. Je kunt meerdere diensten in één bestand specificeren en daardoor dus met één commando meerdere containers starten.
Voor nu kunnen we ons leven ietsje makkelijker maken door de configuratie van de WSO2 API Manager container hierboven vast te leggen met alle instellingen zoals we die willen hebben.
Om het interessanter te maken passen we een paar kleine persoonlijke instellingen toe voor de installatie van de WSO2 API Manager en veranderen we de poort offset.
Ik manipuleer hiervoor één bestand: het deployment.toml bestand. Daar heb ik een wijziging gemaakt om de poort offset aan te passen.
Ik heb daarna een docker-compose.yml-bestand gemaakt en een config/wso2am submap. In die submap heb ik het deployment.toml-bestand gezet.
Hieronder kun je mijn docker-compose.yml bestand zien. Er is een dienst die ‘apimanager’ genoemd wordt en gebaseerd is op de wso2/wso2am:latest image en ik heb drie poorten gespecificeerd die ik wil mappen vanaf mijn machine naar een poort die WSO2 opent bij het opstarten.
Om de deployment.toml te overschrijven die een volume naar de locatie verplaatst waar de deployment.toml opgeslagen is binnen de container, heb ik voor de image gespecificeerd waar ik het bestand op mijn machine heb geplaatst (./config/wso2am/deployment.toml).
De zwakke schakel is hier natuurlijk het feit dat ik WSO2 latest gebruik, maar ik wel naar een locatie in de container van een specifieke versie verwijs (hier 3.2.0). Als de ‘laatste’ versie in een andere versie verandert, dan kan de mapping van het volume wellicht ongeldig worden.
Ik start de compositie met docker-compose up.
Er worden enkele regels van de log zichtbaar en zoals je in de bovenste regel kunt zien is de offset toegepast, hierdoor is de URL https://localhost:9453/publisher in plaats van de gebruikelijke 9443 voor een offset van nul. Ik kan nu inloggen op de WSO2 API Manager Management console en kan met de API Manager werken in Docker!