Docker container 환경 구축하기, 서버 간 파일 전송

Jomii·6일 전
0

기타 에러&방법

목록 보기
4/6
post-thumbnail

사용하고 있는 서버에서 다른 서버로 프로젝트 옮기기..

상황

  • ssh접속으로 사용하고 있는 서버에서 gpu사양이 더 좋은 다른 서버로 코드 및 파일 전체, conda 가상환경을 이동하고자 함
  • 현재 사용 서버에는 도커 없음, 루트계정 권한 없음 (일반사용자계정)
  • 이동하려는 새로운 서버에는 도커 컨테이너 환경을 만들고자 함

➤ 기존에 사용하던 서버에서 루트 권한이 없어 도커를 설치할 수 없기 때문에, vscode에서 Dockerfile을 작성하는 대신 코드를 서버에서 서버로 보내는 방법을 사용하려고 한다.


<Conda freezing & 프로젝트 디렉토리 서버에서 서버로 전송>

requirements.txt 생성

일단 conda 가상환경을 저장해준다.

pip freeze > requirements.txt

프로젝트 코드 압축

터미널에서 tar -czfg [압축할 폴더명] [경로]

tar -czfg project_code.tar.gz /project/path

server to server 파일 및 코드 이동

scp -P [옮길 서버의 포트번호] [압축한 폴더명] [사용자계정]@[옮길 서버의 IP]:[저장할 경로]

scp -P 22 project_code.tar.gz requirements.txt user@server:/path/target/directory


<Docker 컨테이너 환경 구축 및 실행>

이동한 서버에는 도커가 이미 설치되어 있어, 아래는 도커 설치 이후 컨테이너를 빌드하는 과정이다.

a. Base image

https://hub.docker.com/_/docker
해당 링크에서 여러 베이스 이미지를 검색할 수 있다. 원하는 베이스 이미지를 사용하면 되는데, 나는 컨테이너에서 conda를 이용해 파이썬 버전을 따로 관리할 예정이라 우분투와 설치되어있는 cuda 드라이버 버전에 맞추어 주었다.


태그란을 클릭하면 cuda 드라이버와 우분투 버전별로 베이스이미지들이 있고,
dockerfile에서 사용할 베이스 이미지를 새로 사용할 서버에 맞게 선택해준다.

b. Dockerfile 작성

도커파일은 설치가 필요한 것들과 config를 설정해주면 되는데, 나는 이런식으로 작성해주었다. conda 환경도 같이 구축한다.

# 예시
FROM nvidia/cuda:11.1.1-cudnn8-devel-ubuntu20.04
#FROM nvidia/cuda:12.2.0-base-ubuntu22.04
#FROM spped2000/dinov2manyproblem:lastest
ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Seoul

# Updating Ubuntu packages
RUN apt-get update && yes|apt-get upgrade
RUN apt-get install -y emacs wget bzip2 git vim gcc g++ libgl1-mesa-glx
RUN apt-get install -y tzdata

RUN wget https://repo.continuum.io/archive/Anaconda3-2021.04-Linux-x86_64.sh
RUN bash Anaconda3-2021.04-Linux-x86_64.sh -b
RUN rm Anaconda3-2021.04-Linux-x86_64.sh

# Set path to conda
ENV PATH /root/anaconda3/bin:$PATH

# Updating Anaconda packages
RUN conda config --remove channels defaults
RUN conda config --add channels conda-forge
RUN conda config --set channel_priority strict

c. Docker 이미지 빌드

작성한 Dockerfile을 기반으로 이미지를 빌드한다. 만든 이미지의 빌드는 터미널에서 다음 커맨드를 입력한다.
docker build -t [태그명] -f [도커파일 경로]

docker build -t tagname -f dockerfilepath/Dockerfile .

그럼 이미지가 만들어진다.

d. Docker 컨테이너 생성

컨테이너 생성은 아래 커맨드를 사용해 생성한다.
-it는 터미널 연결이 끊겨도 컨테이너에서 코드가 계속 돌아갈 수 있도록 하는 옵션이고, 딥러닝 코드를 돌릴 예정이므로 gpu를 사용하는 옵션도 지정해주었다. 그다음 --name [컨테이너명] [이미지이름]:[태그명]이렇게 arg들을 주면 된다. run 옵션은 다음 글을 참고하자. run명령어옵션

docker run -d -it --name containername --gpus all imagename:tag

나는 docker run -d -it --name hj --gpus all docker-ai-image:latest 커맨드를 사용하여 hj라는 컨테이너를 생성해주었다.

e. Docker 컨테이너 Attach

컨테이너를 생성했으면 ssh 접속한 것처럼 터미널을 붙일 수 있다.

방법 1)

docker attach containername

다음 커맨드를 사용하여 터미널을 컨테이너 환경의 터미널로 변경할 수 있고,

방법 2)
vscode에서 Docker 익스텐션을 설치하였으면 사이드바의 도커에서 해당 컨테이너를 우클릭하여 컨테이너에 접속할 수도 있다. Attach shell 또는 attach vscode를 사용하면 된다.

방법 3)
command palette에서 attach까지 검색하면 컨테이너 터미널로 변경하는 커맨드가 나온다.

*첫번째 CLI방법으로 도커에서 빠져나올때 exit나 CTRL+C로 나오면 컨테이너가 종료되기 때문에, 터미널을 종료하더라도 컨테이너에서 실행중인 코드를 계속 유지하고 싶다면 CTRL+P+Q로 나와야만 유지할 수 있다.


생성한 컨테이너에 접속하면 사용자이름이 root계정으로 바뀌고 conda도 잘 설치되어있는 모습을 볼 수 있다.



@
서버에서 다른 서버의 도커 컨테이너로 파일을 직접 전송하는 방법은 없기 때문에, 서버로 전송한 프로젝트 파일을 다시 컨테이너로 옮겨주어야 했다.
프로젝트 파일을 컨테이너로 복사해준다.
docker cp [프로젝트 압축파일 경로] [container_id]:[컨테이너에서 프로젝트파일을 저장할 경로]
*container_id는 docker ps를 치면 확인할 수 있다.

docker cp /path/project/file container_id:path/container/destination

나는 컨테이너를 혼자 사용할 예정이어서 컨테이너의 root 디렉토리에 복사했는데 여러명이서 함께 사용하는 컨테이너 환경이라면 본인의 user 디렉토리에서 저장하고자 하는 경로를 지정하길 바란다.

아무튼 컨테이너에서 파일 압축을 풀고 conda requirements 파일을 이용해 가상환경을 다시 구축해주었다.


끝!

profile
📩 qtly_u@naver.com

0개의 댓글