컨테이너 격리
컨테이너는 격리된 상태로 생성됩니다. redis로 예를 들어 보겠습니다. docker를 통해 redis 서버를 실행하고, nodejs를 별도로 실행한다면 redis서버와 node.js에서의 redis client가 연결이 막힌 상태가 됩니다. 이러한 연결을 해결해서 컨테이너끼리 통신할 수 있도록 하는 것이 도커 컴포즈(docker compose)입니다.
컨테이너 의존
docker compose는 여러개의 컨테이너를 하나의 그룹으로 묶어서 함께 실행 및 관리하도록 합니다. 이 컨테이너들은 의존성이 있거나 함께 동작해야 할 경우를 고려하여 사용됩니다. 예를 들어, 웹 서버와 데이터베이스를 함께 사용해야 할 경우 웹 서버와 데이터베이스를 각각 독립적으로 실행하는 대신 docker-compose를 사용해서 묶을 수 있다.
이렇게 compose를 사용함으로 얻을수 있는 장점은 다음과 같다.
- 여러 컨테이너의 관리 :여러개의 도커 컨테이너를 하나의 그룹으로 묶어서 쉽게 관리할 수 있다. 각 컨테이너 간의 의존성과 실행 순서를 명확하게 정의할 수 있어서 여러 컨테이너를 동시에 실행하거나 정지할 수 있다.
- 복잡한 서비스 구성 : 여러 컨테이너로 이루어진 복잡한 서비스의 실행을 YAML 파일로 관리하면서 코드를 간결하게 유지할 수 있다.
- 환경 설정 분리 : YAML 파일을 이용해서 docker compose를 통해 환경 설정을 분리할 수 있다. 로컬 개발, 스테이징, 프로덕션 등 다양한 환경에 대한 설정을 각각의 YAML 파일로 정의할 수 있습니다.
일반적으로 docker compose는 docker-compose.yml라는 이름의 YAML파일을 작성한다.
사용법
책의 예시)
version: "3"
services:
redis-server:
image: "redis"
node-app:
build: .
ports:
- "5000:8080"
서버와 DB 일반적 예시)
version: '3'
services:
web:
image: nginx:latest
ports:
- "80:80"
database:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: mydb
version 도커 컴포즈의 버전
service 이곳에 실행하려는 컨테이너들을 정의
redis-server 컨테이너 이름
image 컨테이너에서 사용하는 이미지
node-app 컨테이너 이름
build 현 디렉터리에 있는 Dockerfile 사용
ports 포트 매핑 로컬 포트 : 컨테이너 포트
docker-compose up 컨테이너를 시작한다. 이미지가 없을 때만 이미지를 빌드하고 컨테이너를 시작한다.
docker-compose stop 실행중인 컨테이너를 멈춘다.
docker-compose down 컨테이너를 정지한 후에 컨테이너들과 네트워크까지 모두 삭제해준다.
docker-compose up --build 명령어는 컨테이너를 시작하지만 이미지가 있든 없든 이미지를 빌드하고 컨테이너를 시작한다.
컨테이너를 한번 실행한 후 소스 코드를 수정하고 다시 도커 컴포즈를 이용해 컨테이너를 시작할 때는 —build 옵션을 추가해 컨테이너를 실행해야 한다.
개발환경과 운영환경에서의 도커
개발 환경에서는 소스를 변경하면 즉각적으로 다시 빌드하여 반영하는 것과 같이 개발적으로 필요한 요소가 많다. 반면 운영 단계에서는 즉각적인 변경이 아닌 안정성이 더 중요합니다.
따라서 Dockerfile도 개발와 운영단계를 나누어서 사용하는 경우가 많습니다.
일반적인 네이밍은 Dockerfile.dev와 Dockerfile로 나뉘어집니다.
'Infra' 카테고리의 다른 글
[Docker] 이미지와 volumn (0) | 2023.07.26 |
---|---|
[Docker] docker 개념 잡기, 명령어 (0) | 2023.07.26 |
[AWS] aws 리소스 개념 잡기 (0) | 2023.05.15 |