Docker Run 을 사용하여 Container 실행이 가능하다.
예를 들어 docker run -it ubuntu bash 을 아래와 같이 docker-compose.yml 으로 작성할 수 있다.
version: '3.8'
services:
ubuntu:
image: ubuntu
Docker Compose 가 없다면, Make 파일을 사용하여 Docker run CLI 을 코드로 기록할 수 있지만, Docker Compose 을 통해 network, option 등을 쉽게 관리할 수 있다.
그렇다면 Docker Compose 는 무엇인가?
도커 컴포즈(Docker Compose) 란?
멀티 컨테이너 도커 애플리케이션을 코드로 정의하고 실행하기 위한 도구이다. 이를 통해 여러 컨테이너를 단일 환경에서 정의하고 실행할 수 있으며, 개발, 테스트, 배포 환경에서 애플리케이션을 관리하는 데 사용된다.
도커 컴포즈는 YAML 을 사용하여 네트워크, 볼륨 등을 정의할 수 있으며, Docker Swarm 과 Kubernetes 와 함께 사용도 가능하다.
도커 컴포즈의 장점
- 이미지, 환경변수, 네트워크, 볼륨 등의 정보를 YAML 파일로 작성하여 코드로 관리
- 간단한 명령어 로 컨테이너 실행 (docker-compose up -d)
- 하나의 YAML 파일로 여러 환경에 배포 (개발, 테스트, 운영 환경 등)
- 컨테이너 인스턴스 관리
- 하나의 YAML 파일로 서로 다른 컨테이너 관리
- 컨테이너 오케스트레이션 툴과 함께 사용 가능 (Swarm, Kubernetes)
- 도커 컴포즈에 있는 서비스들은 동일한 하나의 네트워크에 연결됨
docker-compose 설치하기
docker-compose 는 기본적으로 설치되어 있지 않기 때문에 별도로 설치해야 한다.
하지만 docker compose 옵션이 있다면 이를 통해 docker-compose.yml 파일을 실행할 수 있다.
https://docs.docker.com/compose/install/linux/#install-the-plugin-manually
Install the Compose plugin
Download and install Docker Compose on Linux with this step-by-step handbook. This plugin can be installed manually or by using a repository.
docs.docker.com
내가 docker 을 사용했을 땐 docker-compose 을 사용했는데, 요즘 개발을 시작한 친구들은 docker compose 을 사용하고 있었다..
위의 터미널은 rocky os 에서 docker register 를 등록하여 docker 을 설치했고,
아래의 터미널은 기본 ubuntu register 을 이용하여 docker 을 설치했다.
docker-compose.yml 에서 자주 사용하는 옵션
아래 옵션 외에도 많은 옵션을 사용하지만, 아래의 옵션만 알고 있어도 충분하다고 본다.
- version: 도커 컴포즈 버전으로 지원하는 옵션들이 약간 차이가 있음
- services: 컨테이너 정의
- build: 도커 이미지를 빌드하기 위한 경로, Dockerfile 의 경로, URL 또는 context, dockerfile 등의 옵션 작성 가능
- context: 상대 경로로 시작할 위치
- dockerfile : 도커 파일의 경로
- container_name : 컨테이너를 가르키는 별칭으로 localhost 처럼 호스트 주소로 사용 가능
- image: 컨테이너를 실행할 이미지
- command: 컨테이너가 시작될 때 실행할 명령어, Dockerfile 의 CMD를 오버라이드함
- ports: 포트 포워딩하여 호스트와 컨테이너 간에 포트를 매핑, 프로토콜(tcp/udp)도 입력할 수 있음
- expose: 컨테이너가 내부적으로 열어두는 포트를 지정, 외부에 노출되지 않으며 같은 네트워크에 있는 다른 서비스들과 연결
- environment: 컨테이너 내부에서 사용할 환경 변수 지정, key=value 또는 .env 파일 참조 가능
- env_file: 환경 변수 파일 경로 지정
- depends_on: 서비스 간에 의존성 지정, depends_on 옵션에 명시된 서비스가 실행된 후 실행됨
- volumes: 호스트와 컨테이너 간에 볼륨을 마운트, 읽기 전용(read-only) 옵션도 추가 가능
- networks: 컨테이너 네트워크 지정, networks 옵션을 사용하여 여러 개의 네트워크를 생성하고 컨테이너에 할당 가능
- links: 컨테이너 간의 링크 생성. 링크된 컨테이너는 서로 호스트 이름으로 접근할 수 있음. 네트워크 옵션과 함께 사용 가능
- healthcheck: 컨테이너의 실행 상태를 검사하는 방법을 지정. test, interval, timeout, retries 등의 옵션이 있음
- restart: 컨테이너가 종료될 때 재시작 정책을 지정. no, always, on-failure, unless-stopped 중 1가지를 선택 해야함
healthcheck 설명
- interval: 확인 간격 시간 (10초 간격으로 체크함)
- timeout: 응답 대기 시간으로 시간 초과 시 죽은걸로 봄 (5초)
- retries: 컨테이너가 비정상으로 플래그 지정되기 전 허용되는 연속 실패 횟수 (3회)
- start_period: 상태 확인을 실행하기 전에 앱에 약간의 시작 시간을 줄 수 있는 상태 확인을 트리거하기 전에 기다리는 시간
version: '3.8'
services:
nginx:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/"]
interval: 10s
timeout: 5s
retries: 3
start_period: 5s
restart 설명
- no: 재시작하지 않음
- always: 항상 재시작
- on-failure: 프로세스가 0 외 의 상태로 종료되면 재시작
- unless-stopped: 종료 시 재시작하지 않으며 그 외에는 재시작
services 외에 정의 가능한 것
config, secrets 은 Docker Swarm 에서 쓰인다.
- volumes: 컨테이너에서 사용할 볼륨 정의
- networks: 컨테이너에서 사용할 네트워크 정의
- configs: 컨테이너에서 사용할 config 정의하며, config는 기본적으로 컨테이너 내부의 /<config-name>에 마운트 되며 애플리케이션의 설정 파일을 관리하고 암호화된 형태로 전달할 수 있음
- secrets: 컨테이너에서 사용할 secret 정보를 정의하며 민감한 정보를 안전하게 보관하고 전달하는데 사용되며 암호, API 키, 인증 토큰 등과 같이 민감한 정보를 안전하게 관리함
Docker Compose 명령어
- docker-compose up : 모든 서비스 실행
- docker-compose up -d : 백그라운드에서 모든 서비스 실행
- docker-compose up service1 service2 : 특정 서비스만 실행
- docker-compose down : 모든 서비스 중지하고 제거
- docker-compose stop : 모든 서비스 중지
- docker-compose start : 모든 서비스 시작
- docker-compose restart : 모든 서비스 재시작하기
- docker-compose pause : 모든 서비스 일시 정지
- docker-compose unpause : 일시 중지된 서비스 다시 시작
- docker-compose ps : 현재 실행중인 서비스 상태 확인
- docker-compose logs : 서비스 로그 확인하기
- docker-compose config : YAML 파일의 설정 확인
'DevOps > 도커 (Docker)' 카테고리의 다른 글
[Docker] - 007. Docker Swarm Port 열기 (2376/2377/7946/4789) (0) | 2024.05.06 |
---|---|
[Docker] - 006. Docker Swarm 이란 (0) | 2024.05.06 |
[Docker] - 004. Multi Stage Build 와 Base 이미지 만들기 (0) | 2024.04.19 |
[Docker] - 003. DockerFile 캐싱 전략 (0) | 2024.04.19 |
[Docker] - 002. Docker CLI 와 이미지 만들기 (0) | 2024.04.17 |