| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- PostgreSQL
- 마이크로서비스
- springboot
- 마이크로서비스아키텍처
- 인프라
- dockercompose
- MSA
- 트러블슈팅
- Java 8
- ci/cd
- 분산시스템
- java
- CS
- 컨테이너
- SpringCloud
- GCP
- Database
- 공통모듈
- 백엔드면접준비
- 자바
- 멀티모듈
- 백엔드
- Flyway
- gradle
- 마이그레이션
- 도커
- 아키텍처
- GitHub Packages
- github actions
- docker
- Today
- Total
NYO_O
도커 이미지와 컨테이너의 차이, 그리고 Docker Compose 본문
백엔드 개발을 하다 보면 가장 많이 듣는 기술 중 하나가 바로 도커(Docker)입니다. "도커로 띄워주세요", "이미지 말아주세요" 같은 실무 용어들을 처음 접하면 다소 막막하게 느껴질 수 있습니다.
처음 도커를 학습할 때 가장 헷갈리는 부분은 바로 '이미지(Image)'와 '컨테이너(Container)'의 차이점입니다. 오늘은 도커의 기초 용어를 정리하고, 복잡한 실행 과정을 한 번에 해결해 주는 도커 컴포즈(Docker Compose), 그리고 자주 사용하는 필수 명령어들을 정리해 보겠습니다.
도커 핵심 용어 4가지
도커를 구성하는 가장 기본적인 4가지 요소의 역할과 관계를 알아보겠습니다.
Dockerfile 이미지를 만들기 위한 일종의 '설계도' 또는 '레시피 파일'입니다. 어떤 운영체제를 사용할지, 어떤 라이브러리를 설치할지, 소스 코드는 어디에 복사할지 등의 모든 빌드 과정이 이 파일에 정의됩니다.
도커 이미지 (Image): 컨테이너를 생성하기 위해 필요한 모든 요소(코드, 라이브러리, 환경변수 등)를 실행할 수 있는 형태로 컴파일 및 빌드해 둔 '패키지'입니다. 이미지는 변하지 않는 읽기 전용(Read-Only) 상태이며, 이 이미지를 바탕으로 우리는 언제 어디서든 동일한 환경의 컨테이너를 무한히 찍어낼 수 있습니다.
컨테이너 (Container): 도커 이미지를 실행한 '실체'입니다. 이미지가 하드디스크에 저장된 프로그램이라면, 컨테이너는 메모리에 올라가 실제로 프로세스가 돌아가고 있는 격리된 상태를 의미합니다.
네트워크 (Network): 각각 격리된 환경에서 실행되는 컨테이너들끼리 서로 데이터를 주고받으며 통신할 수 있게 연결해 주는 가상의 통로입니다.
도커 컴포즈(Docker Compose)란 무엇인가?
실제 서비스는 하나의 애플리케이션으로만 굴러가지 않습니다. 웹 서버, 백엔드 애플리케이션, 데이터베이스, 캐시 서버(Redis) 등 여러 개의 컨테이너가 유기적으로 엮여서 동작합니다. 도커 컴포즈는 이렇게 여러 개의 컨테이너 실행 옵션을 하나의 YAML(.yml) 파일에 정의하여 시스템 전체를 일괄적으로 관리할 수 있게 해주는 강력한 도구입니다.
도커 컴포즈를 사용하지 않을 경우의 고충
만약 컴포즈가 없다면 컨테이너를 하나 띄울 때마다 터미널에 아래와 같이 끝없이 긴 명령어를 매번 직접 입력해야 합니다.
docker run -d --name my-mariadb \
-e MYSQL_ROOT_PASSWORD=1234 \
-e MYSQL_DATABASE=mydatabase \
-e MYSQL_USER=user \
-e MYSQL_PASSWORD=pass \
--network my-bridge-net \
-v ./db_data:/var/lib/mysql \
-p 3306:3306 mariadb:10.6
환경 변수, 네트워크 연결, 볼륨(데이터 저장소) 설정, 포트 포워딩까지 모든 옵션을 직접 타이핑하는 것은 오타의 위험도 크고 매우 비효율적입니다.
위의 모든 복잡한 설정을 docker-compose.yml 파일에 단 한 번만 정의해 두면 됩니다. 애플리케이션과 DB를 함께 띄우는 예시를 살펴보겠습니다.
services:
# 1. 데이터베이스 서비스
db:
image: mariadb:10.6 # 도커 허브에서 공식 이미지를 가져옴
container_name: my-mariadb # 컨테이너의 고유 이름 설정
restart: always # 에러 발생 시 자동 재시작
ports:
- "3306:3306" # [호스트 포트]:[컨테이너 내부 포트]
environment: # DB 접속 설정 (환경변수)
- MYSQL_ROOT_PASSWORD=1234
- MYSQL_DATABASE=mydatabase
- MYSQL_USER=user
- MYSQL_PASSWORD=pass
volumes: # 컨테이너가 삭제되어도 데이터는 유지되도록 로컬과 연결
- ./db_data:/var/lib/mysql
# 2. 스프링 부트 애플리케이션 서비스
app:
build: . # 현재 경로(.)의 Dockerfile을 읽어 이미지를 새로 빌드
container_name: my-spring-app
ports:
- "8080:8080"
depends_on: # db 서비스가 먼저 시작된 후 실행되도록 순서 보장
- db
environment: # 스프링 설정(application.yml)에 전달될 환경변수
- SPRING_DATASOURCE_URL=jdbc:mariadb://db:3306/mydatabase
- SPRING_DATASOURCE_USERNAME=user
- SPRING_DATASOURCE_PASSWORD=pass
links: # (선택) 서비스 간 연결 명시
- db
위와 같이 코드를 작성해두면 세 가지 엄청난 이점을 얻을 수 있습니다.
- 일관성: docker-compose up 명령어 한 줄로 언제 어디서든 동일한 인프라 환경을 완벽하게 복제할 수 있습니다.
- 의존성 관리: depends_on 설정을 통해 "데이터베이스가 먼저 완전히 켜진 후에 애플리케이션을 실행해 줘"와 같은 서비스 간의 실행 순서를 정교하게 제어할 수 있습니다.
- 네트워크 자동화: 컴포즈 파일 안에 묶인 서비스들은 별도의 네트워크 설정 없이도 서로의 서비스 이름(예: db, app)을 도메인처럼 사용하여 통신할 수 있는 전용망이 자동으로 구축됩니다.
어플리케이션 빌드 및 도커 필수 명령어 모음
개발 과정에서 가장 자주 사용하는 빌드 및 도커 명령어들을 정리했습니다.
애플리케이션 빌드 (.jar 파일 생성) 도커 이미지를 만들기 위해서는 먼저 재료가 되는 애플리케이션 실행 파일(.jar 등)을 만들어야 합니다.
- 빌드 권한 부여 (최초 1회만 실행)
chmod +x gradlew
- 기본 빌드
./gradlew clean build
- 테스트 코드를 제외하고 빠르게 빌드
./gradlew clean build -x test
이미지 및 컨테이너 제어 명령어
- 실행 중인 컨테이너 목록 조회
docker ps
- 정지된 컨테이너까지 모두 포함하여 조회
docker ps -a
- 로컬에 다운로드되거나 빌드된 이미지 목록 조회
docker images
- 실행 중인 특정 컨테이너 정지
docker stop [컨테이너_이름_또는_ID]
- 정지된 컨테이너 삭제
docker rm [컨테이너_이름_또는_ID]
- 로컬 이미지 삭제
docker rmi [이미지_ID]
- 특정 컨테이너의 실시간 로그 출력
docker logs -f [컨테이너_이름]
도커 컴포즈 제어 명령어
- 컨테이너 백그라운드 실행 (코드 수정 후 새로 빌드하여 반영)
docker-compose up --build -d
- 컨테이너 일시 정지 및 삭제
docker-compose down
- 컨테이너 재시작
docker-compose restart
마무리
이번 글에서는 도커의 기초적인 개념부터, 여러 컨테이너를 우아하게 다루는 도커 컴포즈의 원리, 그리고 실무에서 필수적으로 외우고 있어야 할 명령어들까지 정리해 보았습니다.
'DevOps > Docker' 카테고리의 다른 글
| Docker Container 간 통신 원리(DNS)와 docker-compose 라이프사이클 분리 전략 (0) | 2026.05.26 |
|---|---|
| Docker로 띄운 PostgreSQL에 접속하는 방법 (0) | 2026.05.26 |