블록체인
블록체인

Compose : 여러 컨테이너 작동

목차

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
Bash
복사
확장자는 .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
services: webserver: build: . depends_on: - db - redis redis: image: redis db: image: postgres
Bash
복사
depends_on은 컨테이너의 시작 순서만 제어할 뿐 컨테이너상의 애플리케이션이 이용 가능해질때까지 기다리고 제어를 하지 않음
의존 관계에 있는 데이터베이스 서비스의 준비가 끝날때까지 기다리는 것은 아니기 때문에 애플리케이션 측에서 이에 대한 대책을 세워야 함

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

hbeen@DESKTOP-EDC39JU:~/sample/dockertext2/chap07$ docker-compose up
Bash
복사
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
Bash
복사
가동중인 컨테이너 상태 확인 시 다른 터미널에서 명령 실행하여 확인

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
Bash
복사
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
Bash
복사

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 명령어는 다른 시그널과 함께 사용 가능