실습 1. 에서 docker-compose를 설치한 이유는 한번에 관리하기 위함이다. kafka를 위한 docker-compose.yml 파일을 /home/user 경로에 생성해보자.
1) kafka 폴더 생성
mkdir kafka
2) kafka 폴더로 이동해서 docker-compose.yml 파일 생성
만약 다른 이름으로 해주면 실행시 -f를 붙여줘야해서 docker-compose.yml로 했다.
vi docker-compose.yml
2-1) docker-compode.yml 의 내용.
주의할 점은 environment쪽 [ip address]에는 가상머신으로 설치한 경우 가상머신의 IP를, 외부 서버로 한다면 Public IP를 입력하면 되는데, 나는 로컬로 실습하는 중이므로 localhost를 입력했다.
입력 방법은 i를 눌러서 Insert 모드로 만들어 준 후 아래 내용을 복사 후 esc를 눌러서 Insert 모드를 종료하고 :wq를 입력해서 쓰면서 저장하고 나오기를 해준다.
version: '3'
services:
zookeeper:
image: zookeeper
container_name: zookeeper
ports:
- "2181:2181"
networks:
- kafka-net
restart: always
kafka:
image: wurstmeister/kafka
container_name: kafka
ports:
- "9091:9091"
- "9092:9092"
- "29092:29092"
- "29094:29094"
networks:
- kafka-net
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- zookeeper
environment:
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
#KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_LOCALHOST://localhost:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_LOCALHOST://localhost:9092,PLAINTEXT_HOST://[ip address]:9091
#KAFKA_LISTENERS: PLAINTEXT://:29092,PLAINTEXT_LOCALHOST://:9092
KAFKA_LISTENERS: PLAINTEXT://:29092,PLAINTEXT_LOCALHOST://:9092,PLAINTEXT_HOST://:9091
#KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_LOCALHOST:PLAINTEXT
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_LOCALHOST:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_JMX_PORT: "29094"
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_SOCKET_REQUEST_MAX_BYTES: 2147483647
KAFKA_MESSAGE_MAX_BYTES: 2147483647
KAFKA_HEAP_OPTS: "-Xms6g -Xmx8g"
akhq:
image: tchiotludo/akhq
container_name: akhq
ports:
- "18080:8080"
networks:
- kafka-net
restart: always
depends_on:
- kafka
environment:
AKHQ_CONFIGURATION: |
akhq:
connections:
kafka:
properties:
bootstrap.servers: kafka:29092
volumes:
esdata1:
driver: local
networks:
kafka-net:
driver: bridge
3) docker-compose 실행
docker-compose up
이때 만약 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
문구가 뜬다면, 간단하게는 Docker Desktop을 설치하고 어플리케이션을 실행한다음 다시 up을 시켜보면 아래처럼 잘 실행된다. 
Docker Desktop에서도 확인할 수 있다.

터미널 1,2 이렇게 두개를 띄워주자.
1) docker 실행
docker ps
2) bash를 통해 컨테이너 접근
docker exec -it kafka /bin/bash
정상적으로 실행 되었다면 bash를 통해 컨테이너에 접근한다.
컨테이너는 /opt/kafka/bin/ 경로에 있다! bin으로 이동 고고
그러면 kafka Shell script들이 나오는데, 여기서 kafka-topics.sh, kafka-console-consumer.sh, kafka-console-producer.sh 에 접근해 실습을 해볼것이다.
cd /opt/kafka/bin

Producer & Consumer
메시지를 보낼 때는Producer을 사용하고 받을 때는Consumer를 사용한다.
터미널 1
1)
./kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test
> 뜨고 커서 깜빡거리는 것 까지 확인
터미널 2
1) 메시지를 보내기 위해 Topic을 생성한다
./kafka-topics.sh --create --bootstrap-server localhost:9092 --topic test

2)
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
터미널 1
1) 메시지를 보내보자! 한글/영어 상관없이 입력!
터미널 2를 확인해보자.
터미널 2
터미널 2에서는 터미널 1이 보낸 메시지를 잘 읽어온다.

히히 재밌땅
웹 브라우저
메시지를 보낸다음 http://localhost:18080/으로 이동해보자.
그럼 akhq.io로 이동이 될텐데, 보냄과 동시에 읽기를 확인할 수 있는 곳이다.
들어가서 보면 아까보낸 두개의 메시지가 잘 카운트 되어 들어와있는걸 볼 수 있다.
클릭해보면,

메시지도 확인 가능하고 Partition, Offset도 확인이 가능하다.
끝나면 ctrl + c로 다 종료해준다.