Docker Compose
단일 서버에서 여러 컨테이너를 프로젝트 단위로 묶어서 관리해주게 해주는 기능을 말합니다. `docker-compose.yml` 파일을 통해 명시적으로 관리가 가능합니다.
장점
- 프로젝트 단위로 도커 네트워크 볼륨 관리가 용이함.
- 프로젝트 내 서비스 간 의존성 정의 가능함.
- 프로젝트 내 서비스 디스커버리 자동화 가능. (서비스 도메인으로 호출이 가능)
- 손 쉬운 컨테이너 수평 확장 가능.
용어
프로젝트(Project)
도커 컴포즈에서 다루는 워크스페이스 단위를 의미합니다. 하나의 `yml` 파일이라고 생각하면 됩니다. 그리고 프로젝트는 함께 관리하는 서비스 컨테이너의 묶음이기도 하고 기본 도커 네트워크를 생성합니다.
서비스(Service)
도커 컴포즈에서 컨테이너를 관리하기 위한 중간 단위를 의미합니다. `sacale` 옵션을 통해 컨테이너를 수를 쉽게 확장 가능 합니다.
컨테이너(Container)
서비스를 통해 관리 되는 컨테이너를 의미합니다.
docker-compose 옵션
`docker-compose`에서는 여러가지 옵션을 제공하고 있습니다. 각 옵션에 대한 정보는 아래와 같습니다.
버전(version)
도커의 버젼을 명시하는 옵션입니다. 최대한 최신 버젼을 사용하는 것을 권장하고 있습니다. 도커 엔진 및 도커 컴포즈 버전에 따른 호환성 매트릭스를 참조하시길 바랍니다.
버전 3부터 Docker Swarm을 호환되고 있습니다.
- `Swarm` 서비스를 `docker-compose.yml`로 정의 가능합니다.
도커 스왐(Docker Swarm)
`Docker Swarm`은 `Docker` 컨테이너 오케스트레이션 도구 중 하나로, 여러 `Docker` 호스트를 클러스터로 그룹화하고 관리하는 기능을 제공합니다. `Docker Swarm`을 사용하면 컨테이너화된 애플리케이션을 확장하고 고가용성을 유지하기 위해 여러 호스트에서 컨테이너를 배포하고 관리할 수 있습니다.
네트워크(Network)
`Docker` 컨테이너는 가상 네트워크를 사용하여 서로 통신하거나 호스트와 통신합니다. `docker-compose`에서 네트워크는 다음과 같은 역할을 합니다.
- 기본 네트워크: `docker-compose`는 기본적으로 프로젝트마다 고유한 기본 네트워크를 생성합니다. 이 네트워크를 사용하면 동일한 프로젝트 내의 컨테이너끼리 통신할 수 있습니다.
- 사용자 정의 네트워크: `docker-compose`를 사용하여 사용자 정의 네트워크를 만들 수 있습니다. 이렇게 생성한 네트워크는 여러 프로젝트에 걸쳐 사용할 수 있으며, 컨테이너 간에 특정 네트워크를 공유하여 특정 그룹 간 통신을 구성할 수 있습니다.
`docker-compose`에서 네트워크를 정의하고 컨테이너에 연결하는 경우, 컨테이너는 해당 네트워크에서 다른 컨테이너와 통신할 수 있습니다. 이를 통해 마이크로서비스 아키텍처와 관련된 애플리케이션의 컴포넌트 간 통신을 효과적으로 관리할 수 있습니다.
볼륨(Volume)
`Docker` 컨테이너는 일반적으로 임시 파일 시스템을 가지며, 컨테이너가 종료되면 그 파일 시스템이 제거됩니다. 그러나 볼륨은 컨테이너 간 데이터 공유와 데이터 영속성을 제공하는 데 사용됩니다. `docker-compose`에서 볼륨은 다음과 같은 역할을 합니다:
- 데이터 공유: 여러 컨테이너 간에 데이터를 공유하기 위해 볼륨을 사용할 수 있습니다. 예를 들어, 웹 서버 컨테이너와 데이터베이스 컨테이너 간에 데이터 공유를 위한 볼륨을 생성할 수 있습니다.
- 데이터 영속성: 컨테이너가 종료되어도 데이터가 유지되어야 하는 경우, 볼륨은 데이터를 컨테이너 내부가 아닌 호스트 머신의 파일 시스템에 저장합니다. 이로써 데이터 손실을 방지하고 데이터를 백업하거나 공유할 수 있습니다.
명령어
`docker-compose up` 명시된 `service` 들을 생성 및 구동하는 명령어
docker-compose up
...
[+] Running 3/3
⠿ Network build_default Created 0.1s
⠿ Container build-redis-1 Created 0.1s
⠿ Container build-web-1 Created 0.1s
`log` 가 찍힌 것을 보면 `Network`가 기본 라우터인 `default`가 생성 된것을 볼 수 있습니다. 그리고 구동시에 프로젝트 명을 따로 지정을 하지 않았기 때문에 `build`라는 이름으로 프로젝트가 생성 된 것을 알 수 있습니다.
`docker-compose -p my-project up -d` 프로젝트 명을 지정하고 실행 하고 `compose` 에서 벗어나게 하는 명령어
docker-compose -p my-project up -d
[+] Running 3/3
⠿ Network my-project_default Created 0.1s
⠿ Container my-project-redis-1 Started 0.7s
⠿ Container my-project-web-1 Started 0.8s
이번에는 구동시에 지정한 이름으로 이미지가 생성 된 것을 볼 수 있습니다.
`docker-compose ls` 현재 실행 중인 `compose` 의 상태를 보여주는 명령어
docker-compose ls
NAME STATUS
my-project running(2)
`docker-compose up` 은 현재 디렉토리 기준으로 작성된 `docker-compose` 를 실행하는 명령어
docker-compose up
[+] Running 4/4
⠿ Network wordpress_wordpress Created 0.1s
⠿ Volume "wordpress_db" Created 0.0s
⠿ Container wordpress-db-1 Created 0.3s
⠿ Container wordpress-wordpress-1 Created 0.1s
`docker-compose down`은 실행 중인 `compose` 중지 시키는 명령어. 뒤에 `-v`를 붙이면 `volume`도 제거 됨
docker-compose down
[+] Running 3/3
⠿ Container wordpress-wordpress-1 Removed 1.2s
⠿ Container wordpress-db-1 Removed 1.8s
⠿ Network wordpress_wordpress Removed 0.1s
docker-compose down -v
[+] Running 1/0
⠿ Volume wordpress_db Removed 0.0s
`docker-compose -p my-project up --scale web=3 -d` 서비스를 여러개로 추가할 때 사용되는 명령어.
docker-compose -p my-project up --scale web=3 -d
[+] Running 4/4
⠿ Container my-project-web-3 Started 11.1s
⠿ Container my-project-redis-1 Running 0.0s
⠿ Container my-project-web-1 Started 10.9s
⠿ Container my-project-web-2 Started 11.0s
서비스 명령어
로그를 확인할 수 있는 명령어.
docker-compose -p my-project logs
서버 `Docker-compose` 이벤트를 실시간으로 확인 가능한 명령어.
docker-compose -p my-project events
프로젝트내 사용중인 이미지 확인 명령어.
docker-compose -p my-project images
Container Repository Tag Image Id Size
my-project-redis-1 redis alpine 9bdff337981d 37.8MB
my-project-web-1 build_web latest a4acf2a1987d 213MB
프로젝트 서비스가 사용중인 프로세스를 확인하는 명령어
docker-compose -p my-project top
'Infra > Docker' 카테고리의 다른 글
Docker Ubuntu Jenkins 설치 및 설정 (0) | 2023.09.29 |
---|---|
Docker image 경량화 (0) | 2023.09.26 |
Docker image 압축 및 풀기, Docker Hub 활용 (0) | 2023.09.26 |
Docker Image build (0) | 2023.09.26 |
Docker Log (0) | 2023.09.25 |