8일차_도커 컴포즈 파일, DNS, 비밀값

최지웅·2024년 11월 13일
0

인프라

목록 보기
11/19

7-1. 도커 컴포즈 파일의 구조

  • 도커 스크립트는 어플리케이션을 패키징하고 실행은 도커 컴포즈 파일을 사용한다. 이는 모든 컴포넌트가 실행 중일 때 어떤 상태여야 하는지를 기술하는 파일로, docker container run명령으로 지정되는 옵션을 모아놓은 단순한 파일이다.(약간 .sh느낌인듯)
  • 도커 컴포즈 파일을 도구를 이용해 실행하면 컴포즈가 컨테이너, 네트워크, 불륨 등 필요한 모든 도커 객체를 만들도록 도커 API 명령을 내린다.
  • 아래는 도커 컴포즈 파일 스크립트이다. JSON으로 변환이 쉬운 YAML문법으로 기술된다.
version: '3.7' # 1. 도커 컴포즈 파일 형식의 버전

services: # 2. 앱을 구성하는 모든 컴포넌트 열겨
	todo-web: #서비스 1개
    	image: diamol/ch06-todo-list # 단일 컨테이너로 실행
        ports:
        	- "8020:80"
        networks: #연결된 네트워크 app-net
        	- app-net

networks: # 3. 서비스 컨테이너가 연결될 모든 도커 네트워크 열겨
	app-net: #네트워크 1개
    	external: # nat 네트워크가 이미 존재하므로 새로 생성하지 말라
        	name: nat
  • 위 도커 컴포즈는 아래와 같다.
docker container run -p 8020:80 --name todo-web --network nat diamol/ch06-todo-list
  • 실행은 up명령을 사용해야한다. 도커는 docker-compose.yml을 찾아 수행한다.
docker network create nat
ch ./ch07/exercises/todo-list
docker-compose up # 실행
  • 컴포트 파일을 이용하여 어플리케이션 설정 사항을 문서화하는 효과를 얻을 수 있다.

7-2. 도커 컴포즈를 사용해 여러 컨테이너로 구성된 어플리케이션 실행하기

  • 컴포즈는 차례로 컨테이너를 실행시켜 애플리케이션을 가동하고, 모든 컨테이너를 동일한 도커 가상 네트워크에 약속된 이름으로 접속시켜 서로 통신하게 한다.
  • 아래는 서로 다른 유형의 서비스를 기술하는 좋은 예시로, 컴포즈는 depends_on항목에서 의존성을 참고하여 image-gallery 실행 전에 두 서비스를 먼저 실행시킨다.

컴포즈 코드

assesslog:
	image: diamol/ch04-access-log

iotd:
	image: diamol/ch04-image-of-the-day
    ports:
    	- "80"

image-gallery:
	image: diamol/ch04-image-gallery
    ports:
    	-"8010:80"
    depends_on:
    	- aceesslog
        - iotd

실행코드

ch ./ch07/exercises/image-of-the-day
docker-compose up --detach
  • 도커 컴포즈는 클라이언트 측에서 동작하는 도구이기에 도커 API로 지시를 보내면 도커 엔진 자체는 컨테이너를 실행할 뿐이지 하나의 애플리케이션으로 동작하는지는 알지 못한다.

  • 정리하자면, 도커 컴포즈를 이용해 분산 어플리케이션의 구성 요소들을 의존성에 맞게 실행시킬 수 있고 이를 정밀하게 처리하기 위해서는 컴포즈 파일을 통해 리소스를 관리할 수 있어야 한다.

7-3. 도커 컨테이너 간의 통신

  • 도커 컨테이너는 별도의 가상 IP를 가져 통신하는데, 애플리케이션 생애주기 동안 컨테이너 교체 시에도 문제가 없게끔 도커 DNS를 이용해 서비스 디스커버리 기능을 제공한다.
  • 컨테이너 이름으로 IP를 찾아주는데, 컨테이너 주소가 아닐 경우 인터넷 IP를 조회한다.
docker-compose up -d scale --iotd=3 # 컨테이너 수 3개로 늘려 데몬 실행

docker container exec -it image-of-the-day_image-gallery_1 cmd # (window)

nslookup accesslog # 같은 주소 출력

exit

# 삭제 후 실행
docker container rm -f image-of-the-day_accesslog_1

docker-compose up -d --scale iotd=3

docker container exec -it image-of-the-day_image_gallery_1 cmd # (window)

nslookup accesslog # 같은 주소 출력

nslookup iotd

exit
  • DNS 조회 결과가 여러 개의 IP주소라면 로드 밸런싱까지도 구현할 수 있다(고르게 부하 분배되게 도커 DNS는 작동함)

7-4. 도커 컴포즈로 애플리케이션 설정값 지정하기

  • PostgreSQL 데이터베이스를 사용하는 to-do 애플리케이션의 서비스 정의
services:
	
    todo-db:
    	image: diamol/postgres:11.5 # postgres DB 이미지를 app-net과 연결
        ports:
        	- '5433:5432' # PostgreSQL 표준 포트인 5432를 호스트의 5433포트로 공개
        networks:
        	- app-net
    
    todo-web:
    	image: diamol/ch06-todo-list
        ports:
        	- '8020:80'
        environment:
        	- Database:Provider=Postgres # DB 형식 전달 (환경변수 설정)
        depends_on:
        	- todo-db
        networks:
        	- app-net
        secrets:
        	- source: postgres-connection # 이 값이 기록(db 암호 설정값)
            - target: /app/config/secrets.json # 실행시 생성되며
  • 비밀값을 일반 파일을 통해 전달할 경우 컴포즈 파일 마지막에 아래와 같이 추가한다.
secrets:
	postgres-connection: # 이 값을
    	file: ./config/secrets.json # 에서 읽어오라
  • 컴포즈 파일을 이용한 어플리케이션 실행은 아래와 같다.
cd ./ch07/exercises/todo-list-postgres

docker-compose -f docker-compose-windows.yml up -d # (window)

docker-compose ps
  • 실무에선 PostgreSQL, MySQL, SQL Server에 접근 가능한 크로스 플랫폼 클라이언트 Sqlectron을 사용하기도 한다.
  • 요약하면, 패키징된 애플리케이션과 설정값을 분리할 수 있어 개발환경, 테스트환경 등 모든 환경에서 동일한 이미지를 사용할 수 있어 그대로 운영환경에 이미지를 투입할 수 있다. (컨테이너 설정까지 높은 차원에서 환경변수, 비밀값 저장 등 컴포즈 파일을 사용하여 환경값까지 동일한 이미지 실행이 가능)

7-5. 도커 컴포즈도 만능은 아니다

  • 도커 컴포즈를 이용해 정의한대로 애플리케이션을 실행할 수 있다. 반면 일부 컨테이너에 오류가 발생할 경우 다시 docker-compose up을 실행하지 않으면 원래의 상태로 되돌릴 수 없다. 고로 실제 운영 환경에서는 도커 스윔이나 쿠버네티스를 사용한다.
  • 애플리케이션의 모든 구성 요소가 각자의 Dockerfile스크립트와 컴포즈 파일을 갖게되어 항상 동일하게 애플리케이션을 배포하고 관리할 수 있기에, 컨테이너 클러스터를 사용하는 것이 아니라면 도커 컴포즈로 충분하다.(컨테이너 클러스터는 무엇인가? 컨테이너 상태별로 실행해야할 세부 사항을 정의한다 ex 쿠버테니스)
profile
이제 3학년..

0개의 댓글