Docker를 활용한 데이터 통합(공유)
KUKJIN LEE • 3개월 전 작성
분산된 마이크로서비스 아키텍처에서 다양한 서비스들이 동일한 데이터를 접근하거나 공유하는 상황이 빈번히 발생합니다. Docker를 활용하여 컨테이너 간 데이터를 효율적으로 공유하는 방법과 데이터베이스 공유와의 차이점에 대해 설명하겠습니다.
언제 사용하면 좋을까?
컨테이너 간 데이터 공유가 필요한 경우!!
1. 컨테이너 간 데이터 공유 개요
컨테이너 간 데이터 공유는 여러 컨테이너가 동일한 데이터에 접근할 수 있도록 하는 방법입니다. 이를 통해 서로 다른 컨테이너에서 동일한 데이터를 읽고 쓸 수 있습니다. Docker 볼륨을 활용하면 데이터의 지속성을 보장하고 컨테이너 간에 쉽게 데이터를 공유할 수 있습니다.
2. 데이터 공유 시나리오
예시: kakao.gg에서의 컨테이너 간 데이터 공유
-
서버1(컨테이너1): 음식점 정보를 다루는 서비스
-
서버2(컨테이너2): 카페 정보를 다루는 서비스
-
데이터 공유 필요성: 서버2가 서버1의 데이터를 가져와 사용자에게 추천 음식점을 보여줍니다.
3. Docker를 활용한 데이터 공유 방법
Docker 볼륨을 사용하여 컨테이너 간 데이터를 공유할 수 있습니다. 여러 컨테이너가 동일한 볼륨을 마운트하면, 이 볼륨을 통해 데이터를 읽고 쓸 수 있습니다.
데이터 공유 설정 방법
-
Docker 볼륨 생성
docker volume create shared_data
-
컨테이너 실행 시 볼륨 마운트
docker run -d --name server1 -v shared_data:/app/data my_server1_image
docker run -d --name server2 -v shared_data:/app/data my_server2_image
여기서 shared_data
볼륨은 두 컨테이너 모두에 마운트되어 있습니다. 이로 인해, 서버1이 데이터를 작성하면 서버2가 해당 데이터를 읽을 수 있습니다.
4. 데이터베이스 공유와의 차이점
데이터베이스가 공유되는 경우, 모든 컨테이너가 동일한 데이터베이스에 접근할 수 있기 때문에 별도의 데이터 공유 메커니즘이 필요하지 않을 수 있습니다. 예를 들어, MySQL이나 MongoDB와 같은 데이터베이스를 사용하는 경우, 각 컨테이너가 동일한 데이터베이스 인스턴스에 접근하여 데이터를 읽고 쓸 수 있습니다.
예시
Docker를 사용하는 시나리오
-
서버1 컨테이너:
docker run -d --name server1 myapp:latest
-
이 컨테이너는 애플리케이션 서버1을 실행하며, 데이터베이스1에 접근합니다.
-
-
서버2 컨테이너:
docker run -d --name server2 myapp:latest
-
이 컨테이너는 애플리케이션 서버2를 실행하며, 데이터베이스1에 접근합니다.
-
-
데이터베이스 컨테이너:
docker run -d --name database1 -e MYSQL_ROOT_PASSWORD=root mysql:latest
-
이 컨테이너는 MySQL 데이터베이스를 실행하며, 서버1과 서버2 컨테이너가 접근합니다.
-
데이터베이스 접근 방식
-
서버1:
db.connect('database1:3306')
-
서버1 컨테이너는 데이터베이스1 컨테이너의 주소를 통해 데이터베이스에 연결합니다.
-
-
서버2:
db.connect('database1:3306')
-
서버2 컨테이너도 동일하게 데이터베이스1에 연결합니다.
-
데이터베이스1만 사용한다고 가정해서 이해가 어렵다면, 아래를 확인해주세요.
애플리케이션 서버 컨테이너 실행
서버1과 서버2를 각각 컨테이너로 실행하고, 환경 변수를 통해 각 데이터베이스에 연결할 수 있도록 설정합니다. 각 서버가 데이터베이스와 유연하게 연결할 수 있습니다.
# 서버1 컨테이너 실행 (데이터베이스1과 데이터베이스2 둘 다 연결)
docker run -d --name server1 --network mynetwork -e DB1_HOST=database1 -e DB2_HOST=database2 myapp:latest
# 서버2 컨테이너 실행 (데이터베이스1과 데이터베이스2 둘 다 연결)
docker run -d --name server2 --network mynetwork -e DB1_HOST=database1 -e DB2_HOST=database2 myapp:latest
# 서버3 컨테이너 실행 (데이터베이스2만 연결)
docker run -d --name server3 --network mynetwork -e DB2_HOST=database2 myapp:latest
여러 서비스가 동일한 데이터를 필요로 하는 경우, Docker 볼륨을 통해 데이터를 통합 관리할 수 있습니다. 예를 들어, 주문 관리 서비스와 재고 관리 서비스가 동일한 재고 데이터를 공유할 수 있습니다.