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 댓글