이전에 있던 연구실은 그냥 linux 서버였고 개인이 알아서 개인 계정에서 콘다 환경을 만들어서 사용했었는데, 지금 연구하는 곳은 도커를 사용한다. 도커 레이어가 한 장 더 추가된 것만 다를테니 콘다를 쓸 도커로 만들어야겠다 싶어서 그 김에 기록한다.
*이 글에서 사용한 계정이 sudo 계정이여서, 명령어에 딱히 sudo를 붙이지 않았는데 접속한 계정에 따라서 sudo docker ...
식으로 사용해야 할 수 있다.
도커 기여엉
Container: Process, a running instance of an application
Image: Program, a static file that defines the behavior of the container
1. 도커 허브에서 사용할 miniconda3 'image'를 검색하기
이미지를 검색하는 곳은 registry로 hub.docker.com에서 검색을 수행한다.
miniconda3가 아닌 다른 세팅을 가지고 시작을 하고 싶다면 허브에서 원하는 이미지를 다운 받으면 된다. 다운받기 이전에 허브에 원하는 이미지가 존재하는지부터 search
를 통해 확인하자.
docker search miniconda3
해당 글에서 사용할 miniconda3 image는 continuumio/miniconda3 이다.
2. miniconda3 image 다운로드
사용할 이미지를 다운로드 하자.
docker pull continumio/miniconda3
3. 다운로드한 이미지 조회
registry(hub)에서 끌어온 이미지 서버에서 확인. 연구실에서 사용하는 서버이기 때문에 다양한 이미지들이 이미 존재한다. (개인이 커스텀해서 commit 해놓은 이미지도 존재한다.)
docker images
그 외 이미지 관련 명령어 모음
# 동작중인 컨테이너 확인
docker ps
# 정지된 컨테이너까지 확인
docker ps -a
# 컨테이너 삭제
docker rm [CONTAINER_ID]
# 컨테이너 전체 삭제
docker rm 'docker ps -a -q'
# 이미지 확인
docker images
# 이미지 삭제
docker rmi [IMAGE_ID]
# 이미지 삭제 & 해당 컨테이너 강제 삭제
docker rmi -f [IMAGE_ID]
4. 컨테이너 시작
run
명령어를 통해 이미지를 바탕으로 실행될 컨테이너를 실행을 합니다. -(하이픈)을 통해 여러가지 옵션을 줄 수 있습니다.
docker run --gpus all --ipc=host -t -d -v $(pwd):/root -p 1234:8888 --name my-container continuumio/miniconda3:latest
- continuumio/miniconda3:latest
가장 최신버전의 miniconda3 이미지를 사용해 컨테이너를 실행합니다.- -t: 최초 프로세스가 끝나도 컨테이너를 유지합니다.
- -d: 데몬프로세스로 실행 >> 컨테이너를 백그라운드에서도 실행, 유지합니다.
- --gpus all --ipc=host
생성하는 컨테이너에서 모든 GPU를 사용할 수 있도록 설정합니다. - -v $(pwd):/root
현재 디렉토리를 컨테이너의 /root 디렉토리에 마운트합니다.- 컨테이너를 삭제하면 컨테이너 내 데이터도 모두 날라갑니다. (가상머신 날리는 것과 동일한 개념)
- 그러나, 마운트 한 곳에 저장한 데이터는 날아가지 않습니다. 그래서 dataset 혹은 학습된 모델같은 경우에는 마운트 한 위치에 저장하는 편이 좋습니다.
- 때문에 서버의 아무위치가 아니라, 본인이 사용할 디렉토리를 mkdir 명령어를 통해 수행을 한 후에 해당 디렉토리에서 작업을 하는게 용이합니다.
- -p 1234:8888
호스트의 1234 포트를 컨테이너의 8888포트로 리다이렉트합니다.- (랩장님 권유) 처음 실행할 때 포트 리다이렉션을 설정 하지 않고 실행하면 나중에 바꾸기 굉장히 귀찮습니다.
- --name my-container
컨테이너 이름을 my-container로 설정합니다.
- 이름을 지어서 서버를 같이 사용하는 인원들이 컨테이너를 잘 식별할 수 있도록.
5. 컨테이너 접속
exec 명령어로 수행합니다.
docker exec -it my-container /bin/bash
- my-container 안에서 bash를 엽니다.
- SSH로 리눅스 서버에 접속한 것과 동일하게 하면 됩니다.
- run 명령어를 실행할 때 -i 옵션을 수행하지 않았는데, 이 글에서는 실행할 때에 수행합니다.
6. 컨테이너 정지, 시작, 제거
docker stop my-container
컨테이너 정지를 수행합니다.
- 서버 점검, 안전점검으로 인한 정전 시에는 컨테이너 정지까지만 수행해도 됩니다.
docker start my-container
멈춘 컨테이너를 다시 실행시킵니다.
docker rm my-container
멈춰있는 컨테이너를 제거합니다.
- 마운트된 곳 이외의 저장된 데이터는 모두 다 날라갑니다.
- 안쓰는 컨테이너는 본인이 바로 지워주지 않으면 저장공간을 차지합니다
7. conda init 수행
bash로 접속을 했고, 최초 접속이기 때문에 conda가 초기화 되지 않은 상태입니다. 따라서 conda 명령어를 사용하기 위해 초기화를 수행합니다.
conda init bash
초기화가 완료되었으면 exit
명령어를 통해 해당 bash를 종료시키고, docker exec
명령어를 통해 해당 컨테이너에 다시 접속합니다. 그러면 아래 그림과 같이 (base)가 활성화 되어 있습니다.
*참고, 초기화 하지 않고 명령어를 치면 아래와 같은 에러가 뜹니다.
이제 conda 환경이 만들어졌습니다. 그 아래에 가상환경을 만들고 하는 건 동일하게 수행할 수 있습니다.
아래는 리눅스 서버 사용할 때 작성했던 글 몇 개입니다. 도움이 되면 좋겠습니다.
https://with-ahn-ssu.tistory.com/42
https://with-ahn-ssu.tistory.com/16
https://with-ahn-ssu.tistory.com/12
https://with-ahn-ssu.tistory.com/7
추가할 사항
컨테이너 밖에서 원격으로 작업하기
SSH 포트 포워딩하기
container commit 해서 이미지로 저장
'개발새발 > 개발 셋업' 카테고리의 다른 글
PyTorch Lightning 소개 및 설명 (0) | 2023.02.13 |
---|---|
[Docker, Linux] GPG에러 해결, public key 수동 설치 (apt-get이 에러가 발생하며 동작하지 않을 때) (0) | 2023.01.19 |
[Conda] 컴퓨터비전을 위한 토치환경 셋업 (0) | 2023.01.18 |
[SSH] Authorized Keys generating (ssh key) | ssh 접속을 위한 key 생성 (0) | 2022.09.21 |
[Linux] Linux, Ubuntu nested cmd 방법 (0) | 2022.01.13 |