CLOUDWAVE

Docker Compose practice : compose CLI ( 2025.01.03 )

갬짱 2025. 1. 14. 22:23

Docker Compose CLI

[ 배경상황 ]

  • 간단한 웹사이트 : FRONT서버, BACKEND서버, DB서버, Cache(Radis) & 서비스는 점점 세분화로 작아지고 다양해짐 ⇒ 여러 컨테이너가 필요함
  • 각 컨테이너가 중단없이, 문제없이 지속적으로 잘 운영될 수 있도록 관리할 수 있어야함

 

docker compose : 여러 컨테이너를 정의 + 네트워크 설정, 볼륨 구성 & 재실행, 문제 발생대처 등을 제시 = Define and run multi-container applications with Docker.

 

Service : 논리적으로 정의된 단위 -> 실제 실행인스턴스 container로 구성

Compose : 이들을 다루는 도구

Project : 전체 구성을 묶는 단위

 

docker compose
  • -f : 정의한 compose file을 지정 ⇒ 지정하지 않으면 현재 경로에 존재하는 docker-compose.yml을 사용
  • -p : 프로젝트 이름 명시( 반드시 명시하여 식별 ) ⇒ 지정하지 않으면 현재 디렉토리 이름으로 설정, 프로젝트 이름이 중복된 경우 병합처리됨으로 유의할것!!

 

프로젝트 실행

docker compose up
  • --abort-oncontainer-exit : 컨테이너가 단 하나라도 문제가 발생하면 모든 컨테이너를 종료( 전파의 위험 )
  • -d : 백그라운드로 실행, 포그라운드로 실행시 프로젝트 전체의 로그가 보임
  • --build : 이미지를 빌드하고 실행
  • --force-recreate : 기본적으로 컴포즈내에서 변경된 컨테이너를 재실행( 일부만 재실행 ) → 그러지 않고 모든 컨테이너를 재실행
  • --remove-orphans : 현재 Compose 파일과 관련 없는 컨테이너만 삭제
    • Compose 파일에서 서비스 이름을 변경하거나 특정 서비스를 제거하면, 해당 이름의 컨테이너는 이전에 생성된 상태로 남아있음
    • 동일한 프로젝트 이름 사용 : 다른 프로젝트에서 같은 이름을 사용 → 이전에 실행된 컨테이너는 고아가 됨
  • 고아 컨테이너 = 현재 프로젝트와 관련은 있지만 더 이상 사용되지 않는 것들을 말함 ⇒ 자동으로 제거되지 않기에 수동으로 제거해야함

+) up의 또다른 의미 : 수정사항의 반영 = restart ↔ doker run은 중복생성

 

프로젝트 목록확인

docker compose ls

 

프로젝트 이름, 상태, config file위치가 출력됨

 

프로젝트의 컨테이너 목록확인

docker compose (-p 프로젝트) ps [옵션] 서비스명

 ⇒ name, image, command, 소속 service, created시점, status(UP), port 정보가 출력됨

  • 기본 : 특정 프로젝트를 지정하지 않으면 현재 디렉토리에 있는 docker-compose.yaml 파일을 기준으로 프로젝트를 식별하고 컨테이너 목록을 출력
  • -p 프로젝트명 : 해당 프로젝트에 속한 컨테이너를 찾음

 

프로젝트의 이미지 목록확인

docker compose images ( -p 프로젝트 ) 서비스명

 

해당 container, repo & tage, image ID가 출력됨

 

serivce의 리스트

# docker-compose.yaml
version: '3.8'
name: 'cloudwave'

services:
	success:
		image: ubuntu:22.04
		entrypoint: /bin/bash
		command:
			- -c
			- sleep infinity
		networks:
			private: {}
	fail:
		image: ubuntu:22.04
		entrypoint: /bin/bash
		command:
			- -c
			- sleep fail

networks:
	private: 

success service 내부에는 ubuntu:22.04이미지를 사용한 컨테이너들로만 구성 → entrypoint: /bin/bash ( 사실상 오버라이드 가능, 컨테이너 단위가 아닌 컴포즈단위에서는 오버라이딩가능 )

 

프로젝트 삭제

docker compose down (-p 프로젝트) 서비스명
  • 기본적으로 compose 파일에 정의된 서비스에 해당하는 리소스들( 컨테이너, 네트워크, 볼륨 등 ) 삭제
  • —remove-orphans : compose파일에 정의된 리소스들 삭제 + 이에 속하지 않는 고아 컨테이너 삭제
  • -v : 사용하지 않는 볼륨을 함께 삭제
  • 다른 프로젝트에서 사용중인 리소스( 볼륨, 네트워크 등.. )은 삭제되지 않음
    internal 리소스은 삭제가능 → 내꺼 , external 삭제불가 → 외부의 것

 

재실행

docker compose restart 서비스명

서비스기반 구성 → 서비스단위 재실행시 서비스 이름적어주기, 명시하지 않으면 모든 컨테이너 대상으로 재실행

변경사항이 반영되지 않음( 주의!! ) 말그대로 기존 컴포즈 파일을 기반으로 다시 실행하는 것 → 변경사항을 저장, 반영하고 싶으면 up을 써야함( 변경사항을 포함하여 적용 )

 

종료 & 시작 : 내용이 유지되지 않음

중지 & 실행 : 수정사항이 반영됨

 

서비스 빌드하기

docker compose build [OPTIONS] [SERVICE...]

이미지 빌드(docekr build + Dockerfile) → 컨테이너화(docker run)

기존처럼 이미지에 대한 이름이 제시X, 도커컴포즈 파일내에 사용할 이름이 명시되어있음

⇒ yaml 파일에 명시된 서비스의 image 를 이름으로 한 이미지가 생성

 

 

build 항목

  • dockerfile_inline : 내부에 도커파일 내용을 내장할 수 있음
  • context : 빌드파일들의 경로 지정
  • dockerfile : 사용할 도커파일의 이름 명시

 

도커파일 사용하기

FROM ubuntu:22.04
RUN apt-get update && apt-get upgrade

 

프로젝트 로그 확인하기

docker compose logs [OPTIONS] [SERVICE...]

프로젝트 내부 서비스단위로 컨테이너 로그들을 확인

여러 컨테이너를 포함하기에 매우 복잡함 → -n으로 갯수를 지정하기( tail )

모든 서비스에서 로그 n개씩 출력

 

config 확인하기

프로젝트를 구성하고 있는 yaml파일 → 이를 기반으로 어떻게 실행중인지 보여줌

 

docker compose CLI 실습

[연습] 프로젝트 실행 및 Network 확인하기

version: '3.8'
name : example1
services:
  ubuntu:
    image: ubuntu:22.04
    entrypoint: /bin/bash
    command:
      - -c
      - "apt-get update && apt-get upgrade && apt-get install -y curl && sleep 3600"
    restart: no
  nginx:
    image: nginx:latest
    expose:
      - 80
    restart: always

curl을 설치하고 1시간 동안 sleep하게 함

expose : 같은 네트워크 내에서 접근가능한 포트 → 프로젝트의 브릿지 네트워크 내에서 컨테이너에 접근가능한 포트

 

docker compose -f example_1.yaml up -d

docker compose는 프로젝트 단위로 기본 네트워크를 할당( 브릿지 네트워크 )

<프로젝트명>_default

 

우분투 서버 접속하여 expose한 80포트를 통해 nginx 접속가능( 같은 브릿지 네트워크 영역 )

더불어 alias를 같게 한다 ⇒ 서비스개념으로 내부 구성에 관계없이 서비스간의 연결과 유기적인 결합, 성능을 위함이다.

 

[연습] 프로젝트 업데이트 - 서비스 포트 추가하기

nginx 서비스 컨테이너가 외부에서도 접근가능하도록 포트포워딩(port작업)하여 yaml파일을 수정

version: '3.8'
name : example1
services:
  ubuntu:
    image: ubuntu:22.04
    entrypoint: /bin/bash
    command:
      - -c
      - "apt-get update && apt-get upgrade && apt-get install -y curl && sleep 3600"
    restart: no
  nginx:
    image: nginx:latest
    ports:
      - 80:80
    restart: always

업데이트를 위한 docker compose up ↔ 단순한 재시작 docker compose restart와는 다름

 

호스트 환경에서도 80포트를 통해 nginx에 접근이 가능함

 

[연습] 이미지 빌드 후 프로젝트 실행하기

지정한 디렉토리의 Dockerfile을 이용하여 build한 뒤에 서비스 → 프로젝트까지 생성함

version: '3.8'

services:
	ubuntu:
		image: cloudwave:example.1
		build:
			dockerfile: "server.dockerfile"
		entrypoint: /bin/bash
		command:
			- -c
			- "sleep 3600"
		restart : no
	nginx:
		image: nginx:latest
		ports:
			- "80:80"
		restart : always
docker compose -p cloud_wave -f example_2.yaml up -d --build

—build 옵션을 통해 프로젝트 실행과 이미지를 동시적으로 실행

이러한 구조에서는 개발(수정/업데이트)과 동시에 빌드하는 일이 많아짐 → dangling이미지가 많아짐, prune을 자주 수행하여 정리해둘 것

캐시를 통한 이미지 빌드작업이 수행됨

이때 IMAGE의 이름은 -t옵션으로 지정하는 것이 아닌 yaml파일 내의 image이름으로 지정된다.

 

cloud_wave 프로젝트의 ubuntu 서비스의 이미지는 직접 빌드한 것과 동일한 내용

 

 

[연습] 서비스별로 마지막 5개 로그 출력 후 follow 하기

docker compose -f example_2.yaml logs -n 5 -f
  • -f + yaml파일 경로 → 명령수행 대상 프로젝트( compose )를 지정하는 옵션
  • -f : 로그를 "실시간으로 출력 (follow)"하는 옵션

혹은 -p옵션으로 프로젝트 이름을 지정하여 로그를 출력할 수 있다.