Container 사용 방법

 

Ubuntu에서 Docker 빠르게 시작하기

1. Docker 컨테이너 실행 및 관리

1.1 기존 컨테이너 실행

docker start paul_cuda
docker exec -it paul_cuda
/bin/bash # 컨테이너 실행

1.2 새로운 컨테이너 생성

docker run -it -p 2222:22 --name paul_cuda nvidia/cuda:12.4.1-cudnn-runtime-ubuntu22.04 /bin/bash

1.3 컨테이너 목록 확인

docker ps # 실행 중인 컨테이너 목록
docker ps -a # 존재하는 모든 컨테이너 목록
docker container ls

1.4 컨테이너 중지 및 삭제

docker stop paul_cuda
docker rm paul_cuda

1.5 컨테이너 이미지 저장 및 재실행

docker commit paul_cuda paul_cuda_image
docker rm paul_cuda
docker run -it --name paul_cuda
-p 2222:22 paul_cuda_image

1.6 로컬에 저장된 이미지 확인

docker images

2. 컨테이너 내 앱 설치

2.1 필수 패키지 설치

sudo apt update
sudo apt install -y openssh-server vim sudo python3 python3-pip python3.10-venv curl

2.3 Ollama 설치

curl -fsSL https://ollama.com/install.sh | sh

2.4 Python 가상환경 생성 및 패키지 설치

python -m venv .venv
source .venv/bin/activate
pip install ollama langchain transformers

3. Windows에서 VSCode를 이용한 SSH 접속

Extension 탭에서 "Remote - SSH"를 검색하고 설치

3.1 SSH 키 생성

로컬 머신에서 Power shell 실행 후 SSH 키를 생성
ssh-keygen -t rsa -b 4096 -C "xxx@xxx.com"
C:\Users\User\.ssh\id_rsa 에 저장된다.

3.2 SSH 설정 파일 작성

Command Palette (Ctrl+Shift+P)를 엽니다.
"Remote-SSH: Connect to Host..."를 선택
c:\users\user\.ssh\config 작성
Host xxx.xxx.xxx.xxx
  HostName xxx.xxx.xxx.xxx
  Port 2222
  User root
  IdentityFile C:\Users\User\.ssh\id_rsa
C:\Users\User\.ssh\id_rsa.pub 파일을 ~/.ssh/authorized_keys 파일에 복사한다.
해당 config을 실행해서 서버에 ssh 접속하면 password를 묻지 않는다.

3.3 SSH 서버 설정 및 실행

apt-get update
apt-get install -y openssh-server
nano /etc/ssh/sshd_config

변경할 설정:

PermitRootLogin yes
PasswordAuthentication yes
service ssh start

4. SSH 서버를 설치하고 설정

Docker 컨테이너에 SFTP로 접속하려면 몇 가지 추가 설정이 필요합니다. 
기본적으로 Docker 컨테이너는 SSH 서버가 실행되지 않기 때문에, 
SFTP 접속을 위해서는 컨테이너 내에 SSH 서버를 설치하고 설정해야 합니다. 
아래 단계에 따라 진행할 수 있습니다.

4.1 Docker 컨테이너에 SSH 서버 설치

먼저, Docker 컨테이너에 접속하여 SSH 서버를 설치합니다. stevenyk_cuda 컨테이너에 접속하려면 다음 명령어를 사용합니다:
docker exec -it stevenyk_cuda /bin/bash 컨테이너에 접속한 후, SSH 서버를 설치합니다. 예를 들어, Ubuntu 기반 컨테이너라면 다음 명령어를 사용합니다: apt-get update apt-get install -y openssh-server

4.2 SSH 서버 설정

SSH 서버 설정 파일을 편집하여 필요한 설정을 추가합니다. 기본 설정 파일은 /etc/ssh/sshd_config에 위치합니다. 이 파일을 열어 편집합니다:
nano /etc/ssh/sshd_config 필요한 경우, 다음 설정을 확인하고 수정합니다: • PermitRootLogin yes (루트 사용자로 로그인 허용) • PasswordAuthentication yes (비밀번호 인증 허용) 변경 사항을 저장하고 파일을 닫습니다.

4.3 SSH 서버 시작

SSH 서버를 시작합니다:
service ssh start service --status-all ssh --full-restart 또는 /etc/init.d/ssh start

4.4 Docker 컨테이너의 포트 포워딩 설정

컨테이너의 SSH 포트를 호스트 머신의 포트에 매핑해야 합니다. 이를 위해 컨테이너를 실행할 때 포트 포워딩을 설정합니다. 예를 들어, 컨테이너를 처음 실행할 때 다음과 같이 포트 포워딩을 설정합니다:
docker run -d -p 2222:22 --name stevenyk_cuda <image_name> 여기서 -p 2222:22는 호스트 머신의 포트 2222를 컨테이너의 포트 22에 매핑하는 것을 의미합니다.

4.5 SFTP 클라이언트로 접속

이제 SFTP 클라이언트를 사용하여 Docker 컨테이너에 접속할 수 있습니다. 예를 들어, sftp 명령어를 사용하여 접속하려면 다음과 같이 입력합니다:
sftp -P 2222 <username>@<host_ip> 여기서 <username>은 컨테이너 내의 사용자 이름이고, <host_ip>는 Docker 호스트 머신의 IP 주소입니다. 포트 번호는 -P 2222로 지정합니다.

4.6 예시

sftp -P 2222 root@192.168.1.100
이 명령어를 실행하면 비밀번호를 입력하라는 메시지가 나타납니다. 비밀번호를 입력하면 SFTP 세션이 시작됩니다. 이제 Docker 컨테이너에 SFTP로 접속할 수 있습니다. 필요한 경우, 컨테이너 내에서 추가적인 사용자 계정을 생성하고 설정할 수 있습니다.

5. Nvidia Docker Image 사용법

5.1 GPU 정보 확인

nvidia-smi

5.2 Nvidia Docker 이미지 선택

nvidia docker hub에서 적절한 Ubuntu 및 CUDA 버전 선택, https://hub.docker.com/r/nvidia/cuda/tags
이미지의 base/devel/runtime 차이, https://jybaek.tistory.com/791

5.3 컨테이너 실행 예제

docker run -it --gpus all --name porori --network=host -v /home/user/projects:/root/projects --workdir=/root nvidia/cuda:12.4.1-cudnn-devel-ubuntu22.04
-it:
--gpus all 는 Nvidia cuda를 사용하려면  옵션을 기술해야 한다.
--name xxxx :  의 xxxx는 container의 이름이다. container를 생성할 때 중복되지 않는 이름이어야 한다.  (생략 가능)
--network=host  는 인터넷을 사용하기 위해 필요하다.
nvidia/cuda:12.4.1-cudnn-devel-ubuntu22.04 는 base로 사용될 이미지의 Repository:TAG 이다. 사용할 이미지를 지정하면 된다. 

-v  옵션을 사용하면 container의 디렉토리를 Ubuntu host 의 디렉토리로 마운트 할 수 있다.  
Ubuntu Host의 /home/geromeroh/projects 를 Docker Container /root/projects 에 마운트 했다.

--workdir=/root 는 container 실행 후 current directory  이다.
주의: 
  • run 커맨드는 container를 생성 및 실행하는 명령이 이다. 실행 후에는 container가 생성되었으므로 attach (실행중이면), start (실행)로 container에 접속/실행해야 한다.
  • container를 삭제하면 작업하던 내용도 사라진다. 따라서 필요에 따라 docker commit 으로 작업중이던 내용을 포함한 image를 생성해 두거나 docker volume이나 copy등으로 필요한 내용을 백업해 둬야 한다.
  • 추후 설명에 container의 디렉토리를 host 디렉토리에 마운트하여 데이터를 host에 저장할 수 있게 하는 예제가 있다.
  • 그리고 image나 container를 삭제 할 때 타 사용자의 것을 삭제 하지 않도록 주의.

다른 예제(Nvidia Docker Image)

container 생성 및 실행

0.	base image 선택
$ docker images
로 설치된 이미지를 확인하고 원하는 이미지가 없으면 먼저 docker hub에서 다운로드 받는다.
이번 예제에서는 12.4.1-cudnn-runtime-ubuntu22.04 을 base image로 사용한다.
 
1.	Container에서 마운트할 host의 디렉토리(~/devandroid, ~/dockershare) 를 생성한다.
$ mkdir ~/devandroid
$ mkdir ~/dockershare

~/devandroid에 docker_config.tar 를 다운받아서 압축을 풀어($ tar xvf docker_config.tar) 둔다.
2.	container 생성
$ docker run -it --gpus all --name dhkim_0524 -v ~/dockershare:/root/dockershare/ -v ~/devandroid:/root/devandroid/ --network=host --workdir /root nvidia/cuda:12.4.1-cudnn-runtime-ubuntu22.04 

위 커멘드를 참고해서 자신의 환경에  맞게 값을 바꾼다. (Bold로 표시된 부분 변경 필요)

3.	container에서 필요한 프로그램 설치
container의 ~/devandroid/docker_config/install_init.sh 를 실행해서 필요한 프로그램을 설치
install_python3.sh : python3 설치
install_rust.sh : Rust 설치
install_miniserve.sh : miniserve 설치
참고
.bashrc에 추가 예제
alias rm='rm -i'
alias screen='screen -s /bin/bash'
export PS1='\[\e[30;1m\]\u@container \[\e[37;0m\]\W$ '
4.	
5.	Pytorch 설치
https://pytorch.org/get-started/locally/
에서 원하는 환경 선택 후 설치
 
6.	Container에서
# pip3 install torch torchvision torchaudio

설치 후 동작 확인
(주의: pytorch를 container에 설치 한 후 container 를 다시 시작해야 GPU를 사용할 수 있다. )

Host에서 
$ docker container ls -a 
로 container 확인 후
$ docker container stop  dhkim_0524
$ docker container start -ai dhkim_0524

Container 에서 
 # cd ~/devandroid/docker_config/pytorch/
 # python3 check.py
 
 또는
# nvidia-smi
7.	Container에 새로운 shell 실행 (필요하다면)
$  docker container exec -it dhkim_0524 /bin/bash

5.4 Pytorch 설치 및 실행 확인

pip3 install torch torchvision torchaudio
nvidia-smi

6. 컨테이너를 이미지로 저장

docker commit dhkim_0524 my_pytorch_image

6.1 컨테이너 이름을 프롬프트에 표시하는 방법

docker run -it --gpus all --name paul_prompt -v /dev/nvme1n1p0/paul/dockershare:/root/dockershare/ -v /dev/nvme1n1p0/paul/devandroid:/root/devandroid/ --network=host --workdir /root nvidia/cuda:12.4.1-cudnn-runtime-ubuntu22.04 bash -c "echo \"export PS1='\[\e[30;1m\]\u@paul_prompt \[\e[37;0m\]\W$'\" >> ~/.bashrc && bash"
container 실행이후 해당 container 내부에서는 어떤 container인지 확인하기가 어려우므로, container 실행시 shell prompt에 container 이름을 출력한다.

이상 Docker를 활용한 개발 환경 설정을 간편하게 시작하는 방법을 정리하였습니다. 

댓글 쓰기

0 댓글