Docker 컨테이너 간의 통신을 관리하고 격리하기 위한 기능을 제공하는 것
같은 호스트 내에서 실행중인 컨테이너 간 연결할 수 있도록 돕는 논리적 네트워크 개념
networks:
elk:
driver: bridge
services:
elasticsearch:
container_name: elasticsearch
#elasticsearch는 8버전부터 보안설정이 달라짐
image: elasticsearch:7.17.16
ports:
- 9200:9200
- 9300:9300
#현재 위치에서 elasticsearch 디렉터리 볼륨마운트
volumes:
- ./elk/elasticsearch:/usr/share/elasticsearch/data
environment:
discovery.type: single-node
#시큐리티 on
xpack.security.enabled: true
#ssl on
xpack.security.transport.ssl.enabled: true
#FE서버 CORS 허용
http.cors.allow-origin: "*"
http.cors.enabled: true
http.cors.allow-credentials: true
http.cors.allow-methods: OPTIONS, HEAD, GET, POST, PUT, DELETE
http.cors.allow-headers: X-Requested-With, X-Auth-Token, Content-Type, Content-Length, Authorization, Access-Control-Allow-Headers, Accept, x-elastic-client-meta
#username은 변경 불가
#password는 5자 이상
ELASTIC_USERNAME: "elastic"
ELASTIC_PASSWORD: "elastic123!@#"
networks:
- elk
restart: unless-stopped
logstash:
container_name: logstash
image: docker.elastic.co/logstash/logstash:7.17.16
ports:
- 5000:5000
- 9600:9600
volumes:
- ./elk/logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
depends_on:
- elasticsearch
- kafka
networks:
- elk
restart: unless-stopped
kibana:
container_name: kibana
image: kibana:7.17.16
ports:
- 5601:5601
depends_on:
- elasticsearch
volumes:
- ./elk/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
networks:
- elk
restart: unless-stopped
zookeeper:
container_name: zookeeper
image: wurstmeister/zookeeper
ports:
- 2181:2181
networks:
- elk
restart: unless-stopped
kafka:
container_name: kafka
image: wurstmeister/kafka
environment:
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
#도커 네트워크 내부에선 컨테이너들이 kafka:29092로 접근
#외부 애플리케이션(스프링부트)에선 localhost:9092로 접근
KAFKA_LISTENERS: PLAINTEXT://:29092,PLAINTEXT_HOST://:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_ADVERTISED_PORT: 9092
#카프카 토픽 레플리카 갯수
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
#카프카 토픽이름/파티션 수/레플리카 수
KAFKA_CREATE_TOPICS: "kafka-elk:1:1"
ports:
- 9092:9092
volumes:
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- zookeeper
networks:
- elk
restart: unless-stopped
client:
container_name: client
build:
context: "./client"
dockerfile: Dockerfile
ports:
- "3000:3000"
#도커 네트워크 설정 필수
networks:
- elk
restart: unless-stopped
server:
container_name: server
build:
context: "./server"
dockerfile: Dockerfile
depends_on:
- kafka
ports:
- "9100:9100"
environment:
- TZ=Asia/Seoul
#도커 네트워크 설정 필수
networks:
- elk
restart: unless-stopped
elasticsearch, logstash, kibana, kafka, react, springboot 컨테이너는 모두 networks라는 항목을 통해 elk라는 네트워크로 묶여 있dma
호스트에서 컨테이너가 생성되는 경우 결국 해당 컨테이너도 어플리케이션이기 때문에 IP 및 포트 등 네트워크을 구성하며, 이에 대한 정보가 할당되어야 함

네트워크 인터페이스(Network Interface)란 컴퓨터나 장치가 네트워크와 상호작용하기 위한 연결점이며, 데이터를 주고받을 수 있는 하드웨어 또는 소프트웨어 구성 요소
네트워크 인터페이스는 컴퓨터와 네트워크 간의 통신을 가능하게 하며, 데이터 전송과 수신을 처리함

네트워크 계층을 통해 컴퓨터와 외부 네트워크의 물리적인 연결이 이루어짐

실제 컴퓨터의 랜카드(NIC)를 통해 랜포트를 열어서 랜 케이블에 연결하는 것이 아닌, 가상의 네트워크 인터페이스를 생성하는 것
veth는 일반적인 네트워크 인터페이스와는 달리 패킷을 전달받으면, 자신에게 연결된 다른 네트워크 인터페이스로 패킷을 보내주는 식으로 동작하기 때문에 항상 쌍으로 생성해줘야 함.
한 쪽에서 다른 쪽으로 패킷을 전송할 수 있으며, 한 쪽에 다운된 경우 나머지 한 쪽도 정상적으로 기능하지 않는 것이 특징
도커 컨테이너도 결국 네트워크를 구성함 → 컨테이너마다의 IP 와 포트가 존재
172.17.0.x 의 IP 을 순차적으로 할당[명령어 예시]
docker container run -it ubuntu:latest
apt-get update을 통해 ubuntu OS에서 사용 가능한 패키지들과 그 버전에 맞는 정보를 업데이트apt-get install net-tools 을 통해 네트워크 관련 도구를 설치해당 도커 컨테이너에 아무런 설정을 하지 않는다면 외부에서 접근할 수 없으며
오로지 해당 도커 컨테이너를 구동시킨 호스트에서만 접근 가능함

외부 네트워크에 컨테이너 어플리케이션을 노출하기 위해서는 eth0의 IP/PORT를 호스트의 IP/PORT에 바인딩시켜야함
ifconfig 명령어를 입력하면 확인 가능함

docker network create --driver=bridge my-bridgedocker container run -d --network=none nginx:latest