Docker Compose?

songtofu·2022년 4월 13일
0

Docker

목록 보기
2/6

Compose?

복수 개의 컨테이너를 실행시키는 도커 어플리케이션이 정의를 하기 위한 툴이다.
Compose를 사용하면 YAML파일을 사용하여 애플리케이션의 서비스를 구성할 수 있다.
그런 후, signal command를 사용하여 구성에서 모든 서비스를 만들고 시작한다.

Compose는 모든 환경((workflow에서 production, staging, development, testing 및 CI 워크플로우)을 포함합니다.

Compose process

기본적으로 3Step의 프로세스를 사용한다.
1. 앱의 환경을 정의하여 어디에서나 재사용할 수 있는 Dockerfile을 정의.
2. docker-compose.yml 에서 앱을 구성할 수 있는 서비스를 정의. 그래서 단 하나의 환경에서 실행할 수 있게 함.
3. docker-compose up 명령어를 실행합니다. 그리고 Compose를 시작시키고 전체의 앱을 실행

명령어

특징

1. 단일 호스트에 여러 개의 격리된 환경.

Compose는 프로젝트 이름을 사용하여 서로 환경을 분리, 이 프로젝트 이름을 다른 컨텍스트에서 사용할 수 있다.
+) 컨텍스트 :

  • dev host에서, 프로젝트의 브랜치의 각각 feature에 대해 안정적인 복사본을 실행할 때와 같이 각각의 단일 환경의 여러 복사본을 만듭니다.
  • CI server에서, 서로 간섭하지 않도록 하기 위해 고유한 빌드 넘버로 프로젝트 이름을 셋팅할 수 있습니다.
  • 공유된 host 나 dev host를 사용하여 같은 서비스 이름을 사용한 다른 프로젝트에 간섭이 되는 것을 막습니다.

기본적인 프로젝트 이름은 프로젝트 디렉토리의 basename이다. 프로젝트 이름을 -p 명령어 옵션 또는 COMPOSE_PROJECT_NAME 환경 변수를 사용하여 프로젝트 이름을 커스텀할 수 있습니다.

2. 컨테이너를 만들 때 볼륨 데이터를 보존함.

서비스에 의해 사용되어 지는 모든 볼륨을 막을 수 있다. docker-compose up명령어를 실행했을 때, docker-compose를 실행하면 이전 실행에서 컨테이너를 찾았을 때, 이 전 컨테이너의 볼륨을 새 컨테이너로 복사를 합니다.

이 프로세스를 통해 볼륨에서 만든 데이터가 손실되지 않도록 합니다.

docker-compose명령어를 윈도우에서 실행을 한다면 환경변수 설정이 필요할 수 있습니다.

3. 변경된 컨테이너만 다시 작성함.

Compose가 컨테이너를 생성하기 위해서 설정을 캐싱해놓습니다.
변경되지 않은 서비스를 재시작 하였을 때 Compose는 기존 컨테이너를 다시 사용합니다.
컨테이너를 다시 사용한다는 것은 환경을 매우 빠르게 변경 할 수 있다는 것을 의미합니다.

4. 환경 간 구성 변수 및 이동

Compose는 Compose files 에서 변수를 지원합니다. 이러한 변수를 사용하여 다른 환경 또는 다른 사용자에 대한 Compose를 사용자 정의 할 수 있습니다.

Docker Compose 네트워크

디폴트 네트워크

  • 기본적으로 Docker Compose는 하나의 디폴트 네트워크에 모든 컨테이너를 연결.
  • 디폴트 네트워크의 이름 docker-compose.yml가 위치한 디렉토리 이름 뒤에 _default 가 붙는다. ex) 디렉토리 이름이 our_app이라면 our_app_default
  • Compose는 먼저 네트워크를 생성해놓고 각 컨테이너를 구동한 후 네트워크에 연결 시키기 때문에
    디폴트 네트워크의 이름은 Docker Compose로 애플리케이션을 올릴 때 어렵지 않게 확인가능.

컨테이너 간 통신

  • 디폴트 네트워크 안에서 컨테이너 간의 통신에서는 서비스의 이름이 호스트명으로 사용된다.
    ex) web 서비스의 컨테이너에서 db서비스의 컨테이너를 대상으로 ping 명령어를 날릴 수 있다. 디폴트 네트워크 상에서 db서비스 컨테이너의 IP가 192.168.48.2로 확인
$ docker-compose exec web ping db
PING db (192.168.48.2) 56(84) bytes of data.
64 bytes from our_app_db_1.our_app_default (192.168.48.2): icmp_seq=1 ttl=64 time=0.094 ms
64 bytes from our_app_db_1.our_app_default (192.168.48.2): icmp_seq=2 ttl=64 time=0.162 ms
64 bytes from our_app_db_1.our_app_default (192.168.48.2): icmp_seq=3 ttl=64 time=0.080 ms
64 bytes from our_app_db_1.our_app_default (192.168.48.2): icmp_seq=4 ttl=64 time=0.348 ms
64 bytes from our_app_db_1.our_app_default (192.168.48.2): icmp_seq=5 ttl=64 time=0.195 ms
64 bytes from our_app_db_1.our_app_default (192.168.48.2): icmp_seq=6 ttl=64 time=0.187 ms
  • 컨테이너 간 통신에서 주의할 점 : 접속하는 위치가 디폴트 네트워크 내부냐 외부냐에 따라 port가 달라질 수 있다는 것.
    ex) docker-compose.yml에 web서비스의 ports설정이 아래와 같다면,
services:
  web:
    build: .
    ports:
      - "8001:8000"

호스트 컴퓨터에서 접속할 떄는 8001 포트를 사용해야 하고, 같은 디폴트 네트워크 내의 다른 컨테이너에서 접속할 때는 포트 8000을 사용해야한다.

$ curl -I localhost:8001 // 호스트 컴퓨터에서 web서비스 컨테이너 접속
$ docker-compose exec alpine curl -I web:8000 // 같은 네트워크 내의 다른 컨테이너에서 web서비스 컨테이너 접속

출처

profile
읽으면 머리에 안들어와서 직접 쓰는 중. 잘못된 부분 지적 대환영

0개의 댓글