무효 클릭 IP 추적 중...
리눅스

[Docker] 도커 컴포즈(docker-compose) 사용법

꼬예 2022. 12. 19.

이번 포스팅에서는 docker compose 사용법에 대해 알아보겠습니다.

 

사용법을 알아보기 전 도커 컴포즈를 왜 써야 하는지에 대한 당위성부터 확보하고자 합니다.

 

 

이 글을 읽기 전 선수 지식 포스팅

 

1) Docker-compose 필요성?

  jupytertest 라는 이미지를 컨테이너화 하고 싶습니다.

 

jupytertest 이미지 확인

 

이미지를 run할때 gpu세팅과 쥬피터노트북을 사용하고자 하는데요.

 

명령어는 아래와 같이 입력할 수 있습니다.

 

docker run -it --rm --gpus all --ipc host -p 5000:8888 -v "/home/user/Object Detection":/workspace jupytertest

 

해당 명령어가 이해가 안 되시는 분은 선수지식 포스팅을 읽고 와주시기 바랍니다.

 

뭔가 느껴지시는 게 있나요?

 

명령어가 상당히 길다는 겁니다.

 

이러한 문제를 해결하기 위해 도커 컴포즈를 사용해보도록 하겠습니다.

도커 컴포즈는 우리가 앞서 작성하였던 긴 명령어를 하나의 파일로 작성해놓고 필요할 때마다 그 파일을 실행시키는 방식으로 진행됩니다.

 

2) Docker-compose 사용

도커 컴포즈는 도커를 설치를 하였다고 해도 기본적으로 설치가 되어 있지 않기 때문에 설치를 해줘야 하는데요.

(1) docker-compose 설치

sudo curl -L "https://github.com/docker/compose/releases/download/v2.14.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

 

최신 버전 확인

https://github.com/docker/compose/tags

 

<명령어 세부 설명>

 curl  => remote server로부터 file을 다운로드할 때 사용

 -L => url 주소가 변경되어 주소가 redirect 되도록 설정되어 있다면, redirect 된 주소를 사용하도록 하는 option

 

 uname  => 시스템 정보 표시를 의미   -s 옵션 추가 시 운영체제 이름 출력,   -m 옵션 추가시 machine hardware 이름 출력

 

uname 예시

 

명령어는 실제로 아래와 같이 출력됨.

 

실제출력 값

 

다운로드한 후 해당 파일을 권한을 확인해보면 실행할 수 없는 상태로 되어 있습니다. 

 

실행권한 없는 docker-compose

 

(권한 관련 부분이 낯선 분은 해당 포스팅 참조)

 

실행 권한을 주기 위해   chmod +x 명령어를 실행하였습니다.

 

<설치확인>

  docker-compose version 

도커컴포즈 설치 확인

 

(2) docker-compose 설치

도커 컴포즈의 파일명은  docker-compose.yml 로 작성해주시면 됩니다.

 

예제 파일은 아래와 같습니다.  

version: '3'

services:
  app:
    image: jupytertest
    volumes:
      - /home/user/Object Detection:/workspace
    ports:
      - 5000:8888
    runtime: nvidia
    ipc: host
    tty: true
    restart: always

 

  version:'3' 

=> docker-compose 버전을 가리킵니다. 일반적으로 '3'을 적어주시면 문제가 없습니다.

 

 app: 

=>사실 정해진 이름은 없습니다. 다만 indentation만 신경 써주시면 됩니다.

이 부분은 추후 도커 컴포즈 Name에 사용되는데요.

 

가령  app 대신  abcdefghijklm 으로 이름을 작성했다면

 

version: '3'

services:
  abcdefghijklmn:
    image: jupytertest
    volumes:

 

컨테이너 이름이 아래와 같은 형태로 생성됩니다.

 

app이름 표시되는 방식

 

중요한 건 그 밑에 있는  image 입니다. 

이곳에 사용할 이미지 명을 작성해줍니다.

 

 volumes 는 앞서 run 명령어를 실행할 때   -v 부분을 의미합니다.

주의할 점은 경로에 스페이스가 포함되어 있을 경우인데요.

ex)  /home/user/Object Detection:/workspace

 

run 명령어를 사용할 때는 /Object Detection이 부분 때문에 전체 경로를 ""(쌍따옴표)로 감싸줘야 했지만 docker-compose에서는 쌍따옴표 없이 작성해야 에러가 발생하지 않습니다.

 

 ports: 

포트를 지정하여 컨테이너 내부 특정 앱에 접속 가능하도록 세팅합니다.

 

 runtime: nvidia 

이 부분은 run 명령어를 사용할때  --gpus all 를 의미합니다.

 

 ipc : host 

딥러닝 학습을 하다 보면 memory가 부족하다가 뜨는데요. host의 shared memory를 사용하고자 하는 세팅입니다.

 

 -tty : true 

run 명령어에서  -it 역할을 합니다. 

 

  restart : always 

우리 예시에선 필수적 부분은 아니지만  예상치 못한 사건으로 인해 컨테이너끼리 충돌이 나면 컨테이너가 중지되는 경우가 있습니다. 

이럴 경우 자동으로 재시작시키는 옵션입니다.

 

(3) docker-compose 파일 실행

 

<실행 명령어>

yml 파일이 있는 디렉토리에서   docker-compose up 을 입력하면 됩니다.

 

<background 실행>

  docker-compose -d  

 

<container 내부 접속>

  docker exec -it [CONTAIENR ID] /bin/bash  

 

<도커 컴포즈 종료>

  docker-compose down  

 

 

 

 

  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오톡 공유하기
이 컨텐츠가 마음에 드셨다면 커피 한잔(후원) ☕

댓글