도커 컴포즈 파일
도커 컴포즈 파일은 애플리케이션의 '원하는 상태', 즉, 모든 컴포넌트가 실행 중일 때 어떤 상태여야 하는지를 기술하는 파일이다. 그리고 docker container run 명령으로 컨테이너를 실행할 때 지정하는 모든 옵션을 한 곳에 모아 놓은 단순한 형식의 파일이다. 도커 컴포즈 파일을 작성한 뒤, 도커 컴포즈 도구를 사용해 애플리케이션을 실행하면 도커 컴포즈가 컨테이너, 네트워크, 볼륨 등 필요한 모든 도커 객체를 만들도록 도커 API에 명령을 내린다.
위 스크립트의 내용은 도커 네트워크에 도커 컨테이너 하나가 연결된 간단한 애플리케이션을 기술한 것이다.
위 도커 컴포즈 파일은 다음과 같은 세 개의 최상위 statement로 구성된다.
- version: 파일에 사용된 도커 컴포즈 파일 형식의 버전을 나타냄.
- service: 애플리케이션을 구성하는 모든 컴포넌트를 열거하는 부분. *도커 컴포즈에서는 실제 컨테이너 대신 서비스 개념을 단위로 삼는다. 하나의 서비스를 같은 이미지로 여러 컨테이너에서 실행 가능하기 때문이다.
- networks: 서비스 컨테이너가 연결될 모든 도커 네트워크를 열거하는 부분
도커 컴포즈를 통해 애플리케이션을 실행하면 컨테이너 하나가 실행돼 스크립트에 정의된 구성을 갖추게 된다.
도커 네트워크 생성
컴포즈 스크립트의 external 필드에 정의된 네트워크는 애플리케이션 실행 전에 생성돼 있어야 한다.
애플리케이션을 실행시킨다. 도커 컴포즈는 현재 있는 리소스와 애플리케이션을 구성하는 리소스를 비교해 더 필요한 요소를 생성한다.
위와 같이 도커 컴포즈를 이용하면 간단하고 안정적으로 애플리케이션 실행이 가능하다. 도커 컴포즈 파일은 애플리케이션 소스 코드, Dockerfile 스크립트와 함께 형상 관리 도구로 관리된다. 이 파일에 애플리케이션의 모든 실행 옵션이 기술되므로 README 파일에 애플리케이션 이미지 이름이나 공개해야 할 포트 번호를 문서화할 필요가 없다.
도커 컴포즈로 여러 컨테이너로 구성된 애플리케이션 실행
accesslog 서비스는 이미지 이름만 적혀있고 iotd 서비스는 REST API다. 스크립트에 이미지 이름과 함께 80번 포트를 호스트 컴퓨터의 무작위 포트를 통해 공개하도록 작성됐다. image-gallery 서비스는 이미지 이름과 함께 8010번 포트를 호스트 컴퓨터의 8010번 포트를 통해 공개한다. 또한 depends_on 항목은 이 서비스가 다른 두 서비스에 의존한다는 사실을 기술한다.
도커 컴포즈는 의존 관계를 준수해 세 개의 컨테이너를 만들고, image-gallery 컨테이너는 accesslog와 iotd 서비스가 실행된 다음에 실행된다.
도커 컴포즈는 컨테이너를 관리해주고 도커 컴포즈를 통해 전체 애플리케이션을 관리할 수 있다.
도커 컴포즈는 컨테이너를 관리하는 별도의 명령이지만 내부적으로는 마찬가지로 도커 API를 사용한다. 따라서 도커 컴포즈를 실행한 컨테이너라도 똑같이 도커 명령행으로 관리할 수 있다.
컴포즈로 애플리케이션을 중지하면 모든 컨테이너가 중지된다. 중지된 컨테이너는 CPU나 메모리를 점유하지는 않지만, 컨테이너 파일 시스템은 그대로 유지한다. 이후 다시 애플리케이션을 시작하면 기존 컨테이너가 재시작된다.
도커 컴포즈는 클라이언트 측에서 동작하는 도구이다. 도커 컴포즈 명령을 실행하면 컴포즈 파일에 따라 도커 API로 지시를 보내고, 이는 도커 엔진 자체는 컨테이너를 실행할 뿐, 여러 컨테이너가 하나의 애플리케이션으로 동작하는지 여부는 알지 못한다. 그러므로 컴포즈를 사용해 애플리케이션을 관리하려면 컴포즈 파일을 작성하고 이 파일을 읽을 수 있게 해야 한다.
도커 컨테이너 간 통신
컨테이너는 도커 엔진으로부터 부여받은 자신만의 가상 IP 주소를 가지며 모두 같은 도커 네트워크로 연결돼 IP 주소를 통해 서로 통신이 가능하다. 그러나 애플리케이션 생애주기동안에 컨테이너가 교체되면 IP 주소가 변경되기 때문에 IP 주소가 변경돼도 문제가 없도록 도커에서 DNS를 이용해 서비스 디스커버리 기능을 제공한다.
accesslog의 IP 주소는 168.126.63.1임을 알 수 있다. 도커 네트워크에 연결된 모든 컨테이너는 이 네트워크의 범위에 포함되는 IP 주소를 부여받는다. 그리고 이 네트워크를 통해 컨테이너 간 통신이 가능하다. DNS 조회를 사용하면 컨테이너가 교체돼 IP 주소가 변경되더라도 항상 새로 만들어진 컨테이너에 접근이 가능하다.
<ref>
'DevOps > DOCKER' 카테고리의 다른 글
[Docker] 도커 볼륨을 이용한 퍼시스턴트 스토리지 (0) | 2024.03.14 |
---|---|
[Docker] 이미지 생성 (0) | 2024.03.13 |
[Docker] 컨테이너를 이용해 웹 사이트 호스팅 (0) | 2024.03.11 |