7.1 볼륨 마운트
Docker Compose에서 볼륨과 네트워크를 마운트하면 유연하고 효율적인 멀티컨테이너 애플리케이션을 만들 수 있어. 볼륨(volumes)은 컨테이너 외부에 데이터를 저장해야 하는 경우에 사용되고, 네트워크(networks)는 컨테이너 간 상호작용을 가능하게 해. 이번 강의에서는 Docker Compose에서 볼륨과 네트워크를 사용하는 방법에 대해 자세히 알아볼게.
Docker의 볼륨은 컨테이너 외부에 데이터를 저장할 수 있게 해줘서 컨테이너가 중지되거나 삭제된 후에도 데이터를 유지할 수 있어. 데이터베이스 데이터, 로그 파일 및 지속적으로 유지해야 하는 기타 데이터를 저장하는 데 특히 유용해.
볼륨 유형:
- 이름이 지정된 볼륨(Named Volumes): Docker에 의해 관리되며 호스트의 특정 디렉토리에 저장돼.
- 바인드 마운트(Bind Mounts): 호스트의 지정된 디렉토리에서 컨테이너로 마운트돼.
Docker Compose에서 볼륨 설정
이름이 지정된 볼륨 예제
이 예제에서는 postgres-data
라는 이름 지정 볼륨이 생성되고, 컨테이너 db
내부의 /var/lib/postgresql/data
디렉토리에 마운트돼.
version: '3.8'
services:
db:
image: postgres:latest
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
postgres-data:
바인드 마운트 예제
이 예제에서는 로컬 디렉토리와 파일 nginx.conf
와 html
이 컨테이너 web
에 바인드 마운트로 마운트돼.
version: '3.8'
services:
web:
image: nginx:latest
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
7.2 네트워크 마운트
Docker Compose에서 네트워크는 컨테이너들이 서로 상호작용할 수 있게 해줘. 각 컨테이너는 하나 이상의 네트워크에 연결될 수 있어서, 격리와 트래픽 관리를 가능하게 해줘.
네트워크 타입:
- 브릿지 네트워크 (Bridge): 기본적으로 컨테이너들은 같은 호스트 내에서 상호작용할 수 있는 브릿지 네트워크에 연결돼.
- 오버레이 네트워크 (Overlay): Docker Swarm 클러스터에서 다른 호스트에서 실행 중인 컨테이너 간 상호작용을 위해 사용돼.
- 네트워크 플러그인 (Network Plugins): 제3자 네트워크 드라이버를 사용해서 더 복잡한 설정을 가능하게 해줘.
사용자 정의 네트워크 생성 및 사용 예시
이 예시에선 두 개의 사용자 정의 네트워크 front-end와 back-end를 생성해. app 서비스는 두 네트워크 모두에 연결되고, web 서비스는 front-end에만, db 서비스는 back-end에만 연결돼.
version: '3.8'
services:
web:
image: nginx:latest
networks:
- front-end
app:
image: myapp:latest
networks:
- front-end
- back-end
db:
image: postgres:latest
networks:
- back-end
networks:
front-end:
back-end:
실용적인 조언:
- 이름 있는 볼륨 사용: 이름 있는 볼륨은 Docker가 관리하며 데이터 사용 및 관리를 단순화해. 이름 있는 볼륨은 여러 서비스에서 동시에 연결될 수 있어. 예를 들어, 백엔드 서비스는 로그를 기록하고 모니터링 서비스는 그 로그를 분석한 뒤
error
수준 에러를 발견하면 알림을 보내줘. - 네트워크 분리: 여러 네트워크를 사용하면 애플리케이션의 다양한 부분을 격리하고 그 상호작용을 제어할 수 있어.
- 구성 파일 저장: 구성 파일을 마운트하기 위해 바인드된 볼륨을 사용하면 이미지 재구성 없이 설정을 쉽게 변경할 수 있어.
- 네트워크 보안: 필요한 컨테이너만 상호작용할 수 있도록 네트워크 접근을 제한하면 애플리케이션 보안이 높아져.
7.3 볼륨과 네트워크 사용 예제
Docker Compose에서 볼륨과 네트워크 사용 예:
예제 1: 웹 서버와 데이터베이스가 있는 애플리케이션
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
networks:
- webnet
db:
image: postgres:latest
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- db-data:/var/lib/postgresql/data
networks:
- webnet
volumes:
db-data:
networks:
webnet:
이 예제에서는:
- 웹 서버 nginx와 데이터베이스 PostgreSQL은 동일한 네트워크 webnet에 연결되어 있어 상호 작용이 가능합니다. 네트워크가 하나뿐인 경우 명시하지 않아도 됩니다. 기본 네트워크가 생성됩니다.
- 데이터베이스 데이터는 이름이 지정된 볼륨 db-data에 저장되어 컨테이너를 재시작해도 데이터가 유지됩니다.
예제 2: 다중 계층 애플리케이션
version: '3.8'
services:
frontend:
image: myfrontend:latest
networks:
- front-tier
- back-tier
backend:
image: mybackend:latest
networks:
- back-tier
volumes:
- backend-data:/var/lib/backend
database:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- db-data:/var/lib/mysql
networks:
- back-tier
volumes:
backend-data:
db-data:
networks:
front-tier:
back-tier:
이 예제에서는:
- 두 개의 네트워크 front-tier와 back-tier가 생성되었습니다.
- 서비스 frontend는 두 네트워크 모두에 연결되어 backend 및 외부 클라이언트와 상호 작용할 수 있습니다.
- 서비스 backend와 database는 back-tier 네트워크에만 연결되어 격리와 상호 작용을 보장합니다.
- 서비스 backend와 database의 데이터는 각각 별도의 이름이 지정된 볼륨 backend-data와 db-data에 저장됩니다.
GO TO FULL VERSION