이번 포스팅에서는 docker compose 사용법에 대해 알아보겠습니다.
사용법을 알아보기 전 도커 컴포즈를 왜 써야 하는지에 대한 당위성부터 확보하고자 합니다.
이 글을 읽기 전 선수 지식 포스팅
1) Docker-compose 필요성?
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 이름 출력
명령어는 실제로 아래와 같이 출력됨.
다운로드한 후 해당 파일을 권한을 확인해보면 실행할 수 없는 상태로 되어 있습니다.
(권한 관련 부분이 낯선 분은 해당 포스팅 참조)
실행 권한을 주기 위해 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:
컨테이너 이름이 아래와 같은 형태로 생성됩니다.
중요한 건 그 밑에 있는 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
'리눅스' 카테고리의 다른 글
[Linux] 리눅스 명령어 chmod 사용법 (0) | 2022.12.15 |
---|---|
[Docker] yaml: did not find expected '-' indicator 에러 해결 방법 (0) | 2022.12.14 |
[Docker] 도커 허브(docker hub)에 이미지 올리기 (0) | 2022.12.13 |
[docker] docker: Error response from daemon: failed to create shim task: OCI runtime create failed: 도커 에러 해결방법 (0) | 2022.12.13 |
[Docker] 도커에서 주피터 노트북 원격 접속 방법 (1) | 2022.12.12 |
댓글