In the world of containerization, Docker has emerged as a popular choice for packaging and deploying applications. However, effectively managing and analyzing logs generated by Docker containers can be a challenging task. That’s where the power of the Elasticsearch Fluentd Kibana (EFK) stack comes in. By combining these three robust technologies, Docker logging becomes a streamlined and efficient process. In this article, I will share the docker-compose file for the EFK stack and explore how it enables centralized log management, real-time log processing, and insightful visualization. Whether you’re a developer, DevOps engineer, or system administrator, understanding Docker logging with the EFK stack is crucial for ensuring the availability, performance, and troubleshooting of containerized applications.
First of all, why is Fluentd not Logstash(ELK)? Fluentd is lite and fast! “Fluent Bit” is faster with fewer filtering features.
Using docker-compose we can have containers for Elasticsearch, Fluentd, Kibana, and Containers for my actual nodejs app.
Here is an example docker-compose.yml file
version: "2.1" services: myapp: build: ./myapp #docker network networks: ['stack'] restart: unless-stopped ports: ['3000:3000'] depends_on: ['fluentd'] healthcheck: test: ["CMD", "curl", "-s", "-f", "https://localhost:3000/"] retries: 6 logging: driver: "fluentd" options: fluentd-address: ${FLUENTD_HOST}:24224 #Elasticsearch elasticsearch: hostname: elasticsearch image: "docker.elastic.co/elasticsearch/elasticsearch:${ELASTIC_VERSION}" environment: - http.host=0.0.0.0 - transport.host=127.0.0.1 - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms${ES_JVM_HEAP} -Xmx${ES_JVM_HEAP}" mem_limit: ${ES_MEM_LIMIT} ulimits: memlock: soft: -1 hard: -1 volumes: - ./config/elasticsearch.yml:/usr/share/elasticsearch/elasticsearch.yml - esdata:/usr/share/elasticsearch/data ports: ['9200:9200'] #Healthcheck healthcheck: test: ["CMD", "curl","-s" ,"-f", "-u", "elastic:${ES_PASSWORD}", "https://localhost:9200/_cat/health"] #docker network networks: ['stack'] restart: unless-stopped #Kibana kibana: container_name: kibana hostname: kibana image: "docker.elastic.co/kibana/kibana:${ELASTIC_VERSION}" volumes: - ./config/kibana.yml:/usr/share/kibana/kibana.yml #Port 5601 accessible on the host ports: ['5601:5601'] #docker network networks: ['stack'] #Wait for ES instance to be ready depends_on: ['elasticsearch'] environment: - "ELASTICSEARCH_PASSWORD=${ES_PASSWORD}" healthcheck: test: ["CMD", "curl", "-s", "-f", "https://localhost:5601/login"] retries: 6 #fluentd fluentd: container_name: fluentd hostname: fluentd build: ./fluentd volumes: - ./fluentd/conf:/fluentd/etc depends_on: ['elasticsearch'] #docker network networks: ['stack'] environment: ['ELASTIC_VERSION=${ELASTIC_VERSION}','ES_PASSWORD=${ES_PASSWORD}'] restart: unless-stopped ports: - "24224:24224" - "24224:24224/udp" - "42185:42185" - "42185:42185/udp" - "24230:2423" volumes: #Es data esdata: driver: local networks: {stack: {}}
Here configured fluentd logger driver of docker.
You can even log host machine with td-agent running in the host can send logs to fluentd container.
Fluentd Docker image file ./fluentd/Dockerfile
FROM fluent/fluentd:v0.12-debian ENV ES_USERNAME ${ES_USERNAME} ENV ES_PASSWORD ${ES_PASSWORD} ENV ES_HOST ${ES_HOST} RUN ["gem", "install", "fluent-plugin-elasticsearch", "--no-rdoc", "--no-ri", "--version", "1.10.0"]