1) Dockerfile의 문제점
- 지금까지 많은 수의 Dockerfile 스크립트를 보아 온 만큼,
Dockerfile 스크립트가 애플리케이션을 패키징하기 위한 스크립트라는 점은 확실히 이해했을 것이다.
그러나 분산 애플리케이션을 기준으로 보면 Dockerfile 스크립트는
애플리케이션의 한 부분을 패키징하는 수단에 지나지 않는다.
- 웹 프런트엔드, 백엔드 API, 데이터베이스를 갖춘 애플리케이션을 패키징하려면
각 컴포넌트에 하나씩 세 개의 Dockerfile 스크립트가 필요하다.
그렇다면 이들 컨테이너는 누가 실행해야 할까?
- 직접 순서대로 각각의 컨테이너를 도커 명령행을 통해 일일이 옵션을 지정해 가며
실행할 수도 있겠지만,
이런 수동 프로세스는 온갖 실수와 오류의 원천이 되기 쉽다.
직접 실행하는 과정에서 조금만 옵션을 잘못 지정해도 애플리케이션이 정상적으로 동작하지 않거나
컨테이너 간 통신에 문제가 생길 수 있기 때문이다.
이런 방법 대신 도커 컴포즈 파일에 애플리케이션의 구조를 정의하면 된다.
2) 도커 컴포즈 파일이란?
-도커 컴포즈 파일은 애플리케이션의 '원하는 상태', 다시 말해 모든 컴포넌트가 실행중일 때
어떤 상태여야 하는지를 기술하는 파일이다.
또한, docker container run 명령으로 컨테이너를 실행할 때 지정하는
모든 옵션을 한데 모아 놓은 단순한 형식의 파일이다.
- 도커 컴포즈 파일을 작성하고나면 도커 컴포즈 도구를 사용해 애플리케이션을 실행한다.
그러면 도커 컴포즈가 컨테이너, 네트워크, 볼륨 등 모든 도커 객체를 만들도록
도커 API에 명령을 내린다.
- 다음은 도커 컴포즈 파일의 전체 스크립트다.
version: '3.7'
services:
todo-web:
image: diamol/ch06-todo-list
ports:
- "8020: 80"
networks:
- app-net
networks:
app-net:
external:
name: nat
- 이 스크립트의 내용은 도커 네트워크에 도커 컨테이너 하나가 연결된 간단한 애플리케이션을 기술한 것이다.
도커 컴포즈는 사람도 쉽게 읽고 이해할 수 있으며,
(API의 표준 언어인) JSON으로 변환하기도 쉬운 YAML 문법으로 기술된다.
YAML 문법은 들여쓰기를 통해 구조를 정의하기 때문에 들여쓰기가 중요하다.
- 위의 도커 컴포즈 파일은 다음과 같은 세 개의 최상위 문(statement)으로 구성된다.
(1) version은 이 파일에 사용된 도커 컴포즈 파일 형식의 버전을 가리킨다.
여러 번에 걸쳐 문법과 표현 가능한 요소에 많은 변화가 있었으므로
먼저 정의가 따르는 형식 버전을 지정할 필요가 있다.
(2) services는 애플리케이션을 구성하는 모든 컴포넌트를 열거하는 부분이다.
도커 컴포즈에서는 실제 컨테이너 대신 서비스(service) 개념을 단위로 삼는다.
하나의 서비스를 같은 이미지로 여러 컨테이너에서 실행할 수 있기 때문이다.
(3) networks는 서비스 컨테이너가 연결될 모든 도커 네트워크를 열거하는 부분이다.
- 도커 컴포즈를 사용해 이 애플리케이션을 실행하면 컨테이너 하나가 실행돼
스크립트에 정의된 구성을 갖춘다.
- 애플리케이션을 직접 실행해 보기 전에 스크립트에서 주의 깊게 살펴볼 부분이 두어 곳 있다.
todo-web이라는 이름의 서비스는 diamol/ch06-todo-list 이미지로부터 단일 컨테이너로 실행되며,
이 컨테이너는 호스트 컴퓨터의 80번 포트로 자신의 8002번 포트를 공개한다.
- 그리고 app-net이라는 이름의 도커 네트워크애 연결된다.
최종적인 결과는 docker container run -p 8002:80 -- name todo-web
--network nat diamol/ch06-todo-list 명령을 실행한 것과 같은 상태가 된다.
-
'도커 교과서' 카테고리의 다른 글
[도커 교과서] Dockerfile 작성하기 (0) | 2025.01.07 |
---|