U prethodnom članku opisana je proces instalacije i pokretanja Kafka klastera. Za pokretanje Kafke i Zookeepera koriste se shell skripte koje imaju svoje prednosti ali i nedostatke. Kako bi se efikasnije upravljalo Kafka i Zookeeper komponentama u ovom članku opisati će se kako navedeno uspješno postići Docker Compose alatom.
Docker Compose je alat za definiciju i upravljanje više-kontejnerskim okruženjima. Drugim rječnikom, omogućava jednostavnije pokretanje, definiranje, gašenje, itd. Docker kontejnera na jednom poslužitelju. Za više poslužiteljsko okruženje logičan slijedeći korak je Docker Swarm ili Kubernetes.
Docker Compose oslanja se na definiciju kontejnera (usluga, service) u yaml datotekama. Objašnjenje Docker Compose yaml datoteke je izvan okvira ovog članka te je detalje moguće pronaći u službenoj dokumentaciji. Također, detalji CLI Docker Compose naredbi je izvan okvira ovog članka a svi detalji opisani su u službenoj dokumentaciji.
Docker Compose instalacija
Docker Compose nije dio instalacije Dockera pa je potrebno instalirati Docker Compose. Instalacija je jednostavna i svodi se na curl i chmod.
Slijedeća naredba preuzeti će 1.25.1 Docker Compose verziju za Linux (uname -s) operativni sustav 64bit arhitekture (uname -m).
$ curl -L https://github.com/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
Docker Compose se redovno održava i nadograđuje pa je poželjno provjeriti da li postoji novija verzija pa u naredbi iznad izmijeniti “1.25.1” u aktualnu verziju. Docker Compose datoteka će se pohraniti u /usr/local/bin/docker-compose direktorij te je potrebno omogućiti izvršavanje datoteke.
$ chmod +x /usr/local/bin/docker-compose
Uspješno preuzimanje Docker Compose alata moguće je provjeriti naredbom.
$ docker-compose --version
A rezultat bi trebao biti (moguće je da neće biti ista verzija, trebala bi biti usklađena sa verzijom koja se preuzimala naredbom iznad):
docker-compose version 1.25.1, build a82fef07
Compose yaml datoteka
Docker Compose koristi yaml datoteke sa definicijom kontejnera za upravljanje kontejnerima. Shodno, prvo je potrebno kreirati yaml datoteku primjerenog naziva. Za primjer će se koristiti datoteku naziva “kafka-stack.yaml”.
$ cd /opt/scripts/ $ nano kafka-stack.yaml
Sadržaj datoteke bi trebao biti sličan slijedećem.
version: '2.1' services: zookeeper: image: bitnami/zookeeper:3.5.6-debian-9-r59 container_name: zookeeper hostname: kafka.lab.local restart: unless-stopped network_mode: host ports: - "2181:2181" - "2888:2888" - "3888:3888" environment: ZOO_SERVER_ID: "1" ZOO_SERVERS: "0.0.0.0:2888:3888" ZOO_ENABLE_AUTH: "yes" ZOO_SERVER_USERS: "user" ZOO_SERVER_PASSWORDS: "password" volumes: - /opt/data/zookeeper:/bitnami/zookeeper kafka: image: bitnami/kafka:2.4.0-debian-9-r16 hostname: kafka.lab.local restart: unless-stopped network_mode: host ports: - "9092:9092" - "9696:9696" environment: ALLOW_PLAINTEXT_LISTENER: "no" KAFKA_CERTIFICATE_PASSWORD: "storepassword" KAFKA_INTER_BROKER_USER: "admin" KAFKA_ZOOKEEPER_USER: "user" KAFKA_ZOOKEEPER_PASSWORD: "password" KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE: "false" KAFKA_CFG_ADVERTISED_LISTENERS: "SASL_SSL://:9092" KAFKA_CFG_DELETE_TOPIC_ENABLE: "true" KAFKA_CFG_DEFAULT_REPLICATION_FACTOR: "1" KAFKA_CFG_INTER_BROKER_PROTOCOL_VERSION: "2.2.2" KAFKA_CFG_LISTENERS: "SASL_SSL://:9092" KAFKA_CFG_ZOOKEEPER_CONNECT: "kafka.lab.local:2181" JMX_PORT: "9696" volumes: - '/opt/certificates/keystore/kafka.keystore.jks:/opt/bitnami/kafka/conf/certs/kafka.keystore.jks:ro' - '/opt/certificates/truststore/kafka.truststore.jks:/opt/bitnami/kafka/conf/certs/kafka.truststore.jks:ro' depends_on: - zookeeper
Yaml datoteka sastoji se od definicije Zookeeper kontejnera te Zookeeper kontejnera. Gotovo cijela datoteka se poklapa sa shell skriptama iz prethodnog članka sa par dodataka:
- container_name
- hostname
- depends_on
container_name definira kako će se nazvati kontejner prilikom pokretanja kontejnera. Docker neće dozvoliti pokretanje dva kontejnera sa istim nazivima pa ili promijenite naziv drugog kontejnera ili prepustite Dockeru da generira naziv (ukloniti container_name).
hostname definira naziv hosta na kojem se pokreću Docker kontejneri. Ovaj parametar je nužan ukoliko kontejeneri ovise o nazivu hosta što je u slučaju Kafke bitno zbog certifikata.
depends_on parametar definira ovisnosti kontejenra o drugim kontejnerima te ne dozvoljava, u ovom slučaju, pokretanje Kafke prije Zookeepera. Nažalost, depends_on ne provjerava da li je kontejner u potpunosti spreman za rad nego isključivo da li se kontejner pokrenuo.
network_mode: host parametar nije sretno rješenje ali za potrebe lab okruženja biti će dostatno. Za ozbiljnije primjene preporuka je kreirati dediciranu Docker mrežu.
Sve što preostaje je pokrenuti kontejere.
$ docker-compose -f /opt/scripts/kafka-stack.yaml up
Navedena naredba će pokrenuti Zookeeper pa Kafka kontejner te u konzoli ispisivati cijeli log. Ovo je dobro za inicijalno testiranje ali u praksi nema smisla. Da bi se kontejneri pokrenuli kao deamon potrebno je iz up dodati -d parametar.
$ docker-compose -f /opt/scripts/kafka-stack.yaml up -d
Rezultati bi trebao biti.
Starting zookeeper ... done Starting kafka ... done
Stanje kontejenra može se porvjeriti standardnim Docker naredbama (docker ps) ili Docker Compose naredbama.
$ docker-compose -f /opt/scripts/kafka-stack.yaml ps
Ukoliko je potrebno zaustaviti kontejnere navedeno je moguće stop naredbom dok će down naredba zaustaviti i ukloniti sve kontejnere, mreže, image i volume.
Shell skripte kao i kafka-stack.yaml datoteku moguće je preuzeti i na GitHubu.