컨테이너/도커

Compose : 여러 컨테이너 작동

비니화이팅 2022. 10. 18. 02:04

Docker Compose

  • 여러 컨테이너를 모아서 관리하기 위한 툴(의존 관계에 있는 컨테이너들을 모아서 관리)
  • 웹 애플리케이션을 제품 환경에서 운용할 때는 애플리케이션 서버, 로그 서버, 프록시 서버 등과 같이 여러 개의 컨테이너들을 연계하여 작동시킴
    • 여러 개의 도커 컨테이너가 협력하면서 작동

docker-compose.yml 파일

  • Compose 구성관리 파일
  • 웹 애플리케이션의 의존 관계(데이터베이스, 큐, 캐시, 애플리케이션 등)을 모아서 설정
  • 설정을 바탕으로 docker-compose명령을 실행하면 여러 개의 컨테이너를 모아서 시작하거나 정지
  • 컨테이너의 구성정보를 YAML 파일로 관리하므로 CI나 CD에 있어서 환경 구축에 그대로 이용 가능

compose 파일 작성 및docker-compose 명령어

1. docker-compose.yml 파일 작성

hbeen@DESKTOP-EDC39JU:~/sample/dockertext2/chap07$ cat docker-compose.yml
# 버전 정의
version: '3.3'
services:
  # 웹 서버
# Dockerfile 빌드후 80포트를 공개하여 컨테이너 시작
# Redis 서비스에 의존
  webserver:
    build: .
    ports:
     - "80:80"
    depends_on:
     - redis

  # DB 서버
	# 도커 허브에 공개되어 있는 공식 이미지로 컨테이너 시작
  redis:
    image: redis:4.0

hbeen@DESKTOP-EDC39JU:~/sample/dockertext2/chap07$ ls
Dockerfile  app.py  docker-compose.yml  requirements.txt  static  templates
  • 확장자는 .yaml으로도 작성 가능
  • 다른 파일명 지정 시 -f 옵션을 사용하여 정의 파일명을 지정
  • 버전 지정하지 않으면 기본으로 1.0으로 동작

지정자

  • services : 서비스 이름 지정
    • image : 이미지 지정
    • build : 이미지 빌드
      • context : Dockerfile 경로 지정
      • dockerfile : Dopckerfile 이름
      • args : 이미지 빌드 인수
    • ports : 포트 지정
    • networks : 네트워크 지정
  • networks : 네트워크 정의
  • volumes : 데이터 볼륨 정의
  • command : 컨테이너에서 작동하는 명령(베이스 이미지에서 지정 시 그 명령을 덮어씀)
  • entrypoint : 컨테이너에서 작동하는 명령(베이스 이미지에서 지정 시 그 명령을 덮어씀)
  • links : 컨테이너 간 연결(서비스 또는 서비스:엘리어스명 지정 가능)
  • ports : 컨테이너가 공개하는 포트 지정(컨테이너 포트 번호만 지정 시 호스트 머신의 포트는 랜덤한 값으로 설정)
  • expose : 호스트 머신에 대한 포트를 공개하지 않고 링크 기능을 사용하여 연결하는 컨테이너에게만 포트 공개
  • depens_on : 서비스 의존관계 정의
  • environment : 환경변수 지정
  • env_file : 환경변수 파일 지정
    • 애플리케이션 안에서 사용하는 API 키와 같은 비밀정보의 관리는 컨테이너 오케스트레이션 툴의 기능을 사용하는 것이 좋음
  • container_name : 컨테이너 이름 지정
  • labels : 컨테이너에 라벨 지정
  • volumes : 마운트할 볼륨 지정(호스트 디렉터리 경로:컨테이너 디릭터리 경로 또는 컨테이너 디렉터리 경로 지정)
    • ro 지정 시 읽기전용으로 마운트
    • 다른 컨테이너로부터 모든 볼륨을 마운트 할 때는 컨테이너명 지정
  • volumes_from
    • depends_on은 컨테이너의 시작 순서만 제어할 뿐 컨테이너상의 애플리케이션이 이용 가능해질때까지 기다리고 제어를 하지 않음
    • 의존 관계에 있는 데이터베이스 서비스의 준비가 끝날때까지 기다리는 것은 아니기 때문에 애플리케이션 측에서 이에 대한 대책을 세워야 함
  • services: webserver: build: . depends_on: - db - redis redis: image: redis db: image: postgres

2. 컨테이너 시작(docker-compose up)

hbeen@DESKTOP-EDC39JU:~/sample/dockertext2/chap07$ docker-compose up
  • docker compose에서는 각각의 컨테이너를 작동시키기 위한 이미지의 다운로드나 빌드를 하나의 명령으로 모두 실행
  • 정지 시 Ctrl+C

-d 백그라운드에서 실행

--build 컨테이너 시작 시 도커파일 빌드
--scale [서비스명=수] 컨테이너 생성 개수 지정

3. 컨테이너 확인(docker-compose ps)

hbeen@DESKTOP-EDC39JU:~/sample/dockertext2/chap07$ docker-compose ps
       Name                     Command               State         Ports
--------------------------------------------------------------------------------
chap07_redis_1       docker-entrypoint.sh redis ...   Up      6379/tcp
chap07_webserver_1   python /opt/imageview/app.py     Up      0.0.0.0:80->80/tcp
  • 가동중인 컨테이너 상태 확인 시 다른 터미널에서 명령 실행하여 확인

4. 컨테이너 로그 확인(docker-compose log)

5. 컨테이너 시작/정지/정지(docker-compose start/stop/restart)

hbeen@DESKTOP-EDC39JU:~/sample/dockertext2/chap07$ docker-compose stop
Stopping chap07_webserver_1 ... done
Stopping chap07_redis_1     ... done
  • docker-compose stop [컨테이너명]으로 해당 컨테이너만 정지도 가능

6. 리소스 삭제(docker-compose down)

hbeen@DESKTOP-EDC39JU:~/sample/dockertext2/chap07$ docker-compose down
Removing chap07_webserver_1 ... done
Removing chap07_redis_1     ... done
Removing network chap07_default

7. 컨테이너에서 명령 실행(run)

  • docker compose로 시작한 컨테이너에서 명령 실행
  • docker-compose run [서비스명] [명령]
    • docker-compose run server_a /bin/bash

8. 서비스 구성 확인(config)

9. 서비스 공개용 포트 확인(port)

  • docker-compose port [옵션] [서비스명] [프라이빗 포트 번호]

10. 여러 컨테이너 강제 정지/삭지(kill/rm)

  • kill 명령어는 다른 시그널과 함께 사용 가능