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옵션으로 프로젝트 이름을 지정하여 로그를 출력할 수 있다.
'CLOUDWAVE' 카테고리의 다른 글
Kubernetes Basic : Cluster, Node, Pod, Label&Annotation, Namespace ( 25.01.09 ) (0) | 2025.01.15 |
---|---|
Abstraction : Container, MSA ( 25.01.08 ) (0) | 2025.01.15 |
Docker Compose practice : compose file ( 25.01.06-07 ) (0) | 2025.01.14 |
Dokcer Practice : Docker Volume, Docker Network, Docker Advance ( 2025.01.02 ) (0) | 2025.01.14 |
Dokcer Practice : Docker IMAGE, Docker Container ( 2024.12.31 ) (0) | 2025.01.14 |