Docker 이미지 공유 및 다중 컨테이너 실행 가이드

KUKJIN LEE • 2주 전 작성
🏗️ Docker에서 하나의 이미지로 여러 컨테이너 실행하기
Docker에서는 하나의 이미지(Image)를 기반으로 여러 개의 컨테이너(Container)를 실행할 수 있습니다.
예를 들어, MySQL 이미지 하나를 사용하여 여러 개의 MySQL 컨테이너를 실행할 수 있습니다.
이미지와 컨테이너의 개념 정리
개념 |
설명 |
---|---|
이미지 (Image) |
실행 가능한 프로그램과 설정을 포함한 '템플릿' |
컨테이너 (Container) |
이미지를 기반으로 실행되는 독립적인 환경 |
✅ 예제: MySQL 이미지로 여러 개의 컨테이너 실행
# 첫 번째 MySQL 컨테이너 실행
docker run --name mysql-container1 -e MYSQL_ROOT_PASSWORD=root -d mysql:latest
# 두 번째 MySQL 컨테이너 실행
docker run --name mysql-container2 -e MYSQL_ROOT_PASSWORD=root -d mysql:latest
이렇게 실행하면 같은 MySQL 이미지를 공유하면서, 각각 독립적인 MySQL 컨테이너가 실행됩니다.
하지만 기본적으로 컨테이너 간 데이터 및 네트워크는 격리되어 있습니다.
Docker 이미지와 컨테이너의 관계
📌 이미지가 컨테이너에서 어떻게 공유되는가?
-
Docker 이미지는 로컬 저장소(
docker images
)에 한 번 다운로드되면 계속 재사용됩니다. -
컨테이너를 실행할 때마다 이미지를 기반으로 독립적인 환경이 생성됩니다.
-
컨테이너는 각각 개별적인 파일 시스템과 프로세스를 가짐 (기본적으로 격리됨).
🛠 이미지 공유 확인하기
docker images
위 명령어를 실행하면 다운로드한 MySQL 이미지가 목록에 표시됩니다.
이 이미지를 여러 개의 컨테이너에서 재사용할 수 있습니다.
컨테이너 간 네트워크 연결
컨테이너끼리 서로 통신하려면 네트워크 설정이 필요합니다.
예를 들어, mysql-container1
과 mysql-container2
가 같은 네트워크에서 통신
# 네트워크 생성
docker network create my-network
# 첫 번째 MySQL 컨테이너 실행 (네트워크 추가)
docker run --name mysql-container1 --network my-network -e MYSQL_ROOT_PASSWORD=root -d mysql:latest
# 두 번째 MySQL 컨테이너 실행 (같은 네트워크 사용)
docker run --name mysql-container2 --network my-network -e MYSQL_ROOT_PASSWORD=root -d mysql:latest
📌 컨테이너 간 MySQL 접속 테스트
이제 같은 네트워크에 있는 컨테이너끼리는 연결이 가능합니다.
예를 들어, mysql-container1
에서 mysql-container2
로 접속
mysql -h mysql-container2 -u root -p
데이터 유지 및 볼륨 마운트
Docker 컨테이너는 기본적으로 데이터를 유지하지 않습니다.
컨테이너가 삭제되면 내부 데이터도 사라지므로, 데이터를 유지하려면 볼륨(volume)을 사용해야 합니다.
📌 MySQL 컨테이너 실행 시 볼륨 마운트 추가
# 첫 번째 MySQL 컨테이너 실행 (볼륨 추가)
docker run --name mysql-container1 --network my-network \
-e MYSQL_ROOT_PASSWORD=root \
-v mysql-data1:/var/lib/mysql \
-p 3307:3306 \
-d mysql:latest
# 두 번째 MySQL 컨테이너 실행 (각각 독립적인 볼륨 사용)
docker run --name mysql-container2 --network my-network \
-e MYSQL_ROOT_PASSWORD=root \
-v mysql-data2:/var/lib/mysql \
-p 3308:3306 \
-d mysql:latest
✅ 각 컨테이너는 독립적으로 실행되며, 기본적으로 데이터와 네트워크는 격리됨
✅ 같은 네트워크에 속한 컨테이너끼리는 연결 가능 (
docker network create
)✅ 데이터 유지를 위해 볼륨(volume) 마운트 필요 (
-v mysql-data:/var/lib/mysql
)✅ 포트 매핑을 통해 외부에서도 MySQL에 접근 가능 (
-p 3307:3306
)