Docker 정리

구명규·2023년 7월 21일
0

etc.

목록 보기
3/4
post-thumbnail

$ docker run -it -d -v ~/ZERO123:/workspace -p 7860:7860 -u kmk --name zero123 --gpus all jameskoo0503/zero123:v1.2 bash

개요

  Docker란, container라는 소프트웨어 유닛 안에 어플리케이션과, 어플리케이션을 구동하기 위해 필요한 환경설정 및 필요 라이브러리 등을 하나로 묶어 어느 PC에서도 안정적으로 구동되도록 도와주는 패키징 툴.

  가상머신(VM)과 다른 점은, 무거운 운영체제(OS)를 포함하지 않는다는 것. 각 guest OS를 포함하는 VM과는 달리, host OS위에 설치된 단일 container engine을 통해 별도의 OS 없이도 각 container는 host OS를 공유하여 구동됨. 그 원리에 대해선 운영체제와 커널에 대한 구체적인 이해 필요. 그러한 container engine 중에 업계 표준으로 사용되고 있는 것이 바로 Docker.

  Docker는 container를 1) 만들고, 2) 배포하고, 3) 구동함. Container를 만드는 과정은, 1-a) Dockerfile을 작성하고, 이를 이용해 1-b) image를 만들어, 1-c) container를 구동하는 순서로 요약됨.


Creating Containers

Dockerfile

  Container를 어떻게 만들어야 하는지에 대한 설명서. 아래와 같이 구성.

  • Copy files: 어플리케이션을 구동하기 위해 필요한 파일들은 무엇이 있는지.
  • Install dependencies: 어떤 프레임워크나 라이브러리를 설치해야 하는지.
  • Set environment variables: 필요한 환경변수는 무엇이 있는지.
  • Run setup scripts: 어떻게 구동해야 하는지.

Image

  어플리케이션을 실행하기 위해 필요한 코드, 런타임 환경, 시스템 툴, 시스템 라이브러리 등의 모든 환경에 해당. 실행되고 있는 어플리케이션의 상태를 일종의 스냅 샷으로 저장해 두는 것.

Container

  잘 캡쳐해둔 어플리케이션의 이미지를 고립된 환경에서 실행할 수 있도록 구성된 공간. Image는 캡쳐했을 당시의 불변하는 상태, container에서 각각 동작하는 어플리케이션은 개별적으로 파일을 만들거나 수정이 가능한 유동적인 상태. Container에서의 수정사항은 image에 영향을 미치지 않음. Image는 class, container는 instance의 개념에 대응.


Shipping Containers

  Local machine에서 image를 만들어 GitHub과 같은 container registry에 push한 후, 필요한 (Docker와 같은 container engine이 설치되어 있는) 다른 서버에서 pull하여 그대로 실행.

  • Public container registry: dockerhub, RED HAT, GitHub Packages
  • Private container registry: AWS, Google Cloud, Microsoft Azure

Commands

Image 불러오기 및 container 생성

  • 새로운 image pull (tag를 인식하지 못하는 경우 latest version을 불러옴)
$ docker pull {IMAGE}[:TAG]
  • 설치된 모든 image 확인
$ docker images
  • Docker 실행 (container 생성)
$ docker run -it {IMAGE}
$ docker run -it --name {NAME} {IMAGE}
$ docker run -it --gpus all --name {NAME} {IMAGE}
$ docker run [OPTIONS] {IMAGE} [COMMAND] [ARG...]
  • 실행 중인 container 객체 확인
$ docker ps -a
  • 실행 중인 container 접속
$ docker exec -it [CONTAINER_NAMES] bash
  • 새로운 container의 볼륨 지정 및 실행 (container volume을 host volume으로 mapping)
$ docker run -it -v {HOST_VOLUME}:{CONTAINER_VOLUME} {IMAGE}
ex. $ docker run -it --gpus all -v ~/FILM:/workspace pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime
  • 공유메모리 부족 시(insufficient shared memory error)
$ docker run -it ... --shm-size=8G
  • Background에서 실행 중인 ('-d' option) container의 로그 확인
$ docker logs -f {CONTAINER_NAMES}

Container 및 image 관리

  • Container를 image로 commit
$ docker commit {CONTAINER ID} {IMAGE NAME}[:TAG]
  • Container 중지 및 재시작
$ docker stop/start {CONTAINER ID}
  • Container 삭제
$ docker rm {CONTAINER ID}
  • status=exited인 모든 container 삭제
$ docker rm $(docker ps -a -q -f status=exited)
  • image name = pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime인 모든 container 삭제
$ docker rm $(docker ps -a -q -f ancestor=docker ps -a -q -f ancestor=pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime)
  • Image 삭제
$ docker rmi {IMAGE ID}
$ docker rmi {IMAGE NAME}[:TAG]

Docker hub 활용

  • Docker hub에 image 업로드
$ docker login --username={DOCKERHUB_USERNAME}
$ docker tag {CONTAINER_ID} {DOCKERHUB_USERNAME}/{REPOSITORY_NAME}[:TAG]
$ docker push {DOCKERHUB_USERNAME}/{REPOSITORY_NAME}
  • Docker image transfer
$ docker save -o {PATH_FOR_GENERATED_TAR_FILE} {IMAGE_NAME}
(docker image file transfer)
$ docker load -i {PATH_TO_IMAGE_TAR_FILE}

DockerFile

Nvidia Pytorch images

Multistage parallel build

DOCKER_BUILDKIT=1 docker build -t myapp --target runtime -f docker/Dockerfile .

Issues

  • (SOLVED) $ 'docker pull pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime' 실행 과정에서 아래의 저장 공간 오류 발생. (Docker image를 저장하는 공간이 어디로 설정되어 있는지 확인 요망)

    failed to register layer: Error processing tar file(exit status 1): write /opt/conda/lib/libmkl_intel_thread.so.1: no space left on device

    \Rarr Docker의 data root directory를 다른 디스크가 마운트된 디렉토리로 옮겨주어야 함.

    1. $ docker info | grep 'Docker Root Dir' 커맨드로 현재 data root directory 확인. \rarr 기본값인 '/var/lib/docker'로 설정되어 있었음.
    2. $ df -h /var/lib/docker 커맨드로 해당 디렉토리가 마운트된 디스크 확인. \rarr 거의 꽉 차있는 엄한 디스크였으며, 현재 작업 중인 큰 디스크로 옮겨야 함.
    3. '/lib/systemd/system/docker.service' 파일 열어 ExecStart로 시작하는 라인에 '--data-root=/mnt/xvdb/docker' 추가.
    4. $ mkdir /mnt/xvdb/docker
    5. $ cp -R /var/lib/docker /mnt/xvdb/docker 커맨드로 기존 파일 이동.
    6. $ sudo systemctl daemon-reload
    7. $ sudo systemctl restart docker 커맨드로 docker 재시작.
  • (SOLVED) $ 'docker run -it --gpus all pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime' 실행 과정에서 아래의 gpu 에러 발생.

    docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].
    ERRO[0000] error waiting for container: context canceled

    \Rarr Docker container 내에선 GPU를 실행할 수 없기에 host gpu driver와 Docker를 연동시켜주는 Nvidia-docker를 설치해 주어야 함.

    1. $ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
      && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
      && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

      커맨드로 nvidia repository 추가.
    2. $ sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit 커맨드로 nvidia-container-toolkit 추가.
    3. $ sudo systemctl restart docker 커맨드로 docker 재시작.
  • (SOLVED) Container를 실행하면 기본적으로 root 계정으로 실행되어 pip install 등의 커맨드 입력 시 아래와 같은 warning 발생.

    WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv

    \Rarr 실행 중인 container에서 새로운 user를 추가해준 뒤 image를 만들고, 해당 user로 새로운 container를 실행('-u {USERNAME}' 옵션 추가)하여 해결.

    1. $ docker exec -it zero123 bash
    2. $ adduser kmk
    3. $ exit
    4. $ docker commit zero123 jameskoo0503/zero123:v1.2
    5. $ docker run -it -u kmk -v ~/ZERO123:/workspace --gpus all --name zero123 jameskoo0503/zero123:v1.2 bash
  • (SOLVED) 'zero123/gradio_new.py' 실행 시 public URL(https://3865d9589035b13189.gradio.live)으로는 연결되나 local URL(http://127.0.0.1:7860)으로는 연결되지 않는 문제 발생.
    : Container에 '-p 7860:7860' 옵션을 추가해준 뒤 실행하면 '127.0.0.1에서 전송한 데이터가 없습니다.' 에러 발생.

    \Rarr Gradio launch 코드에 server ip 번호 명시해주어 해결. (기본값으로 실행되는 127.0.0.1은 docker에서만 local로 인식하여 외부와 연결되지 않음)

    demo.launch(server_name='0.0.0.0', enable_queue=True, share=True)

  • RealFusion의 'raymarching' 라이브러리 설치 중 아래와 같은 에러 발생.

    OSError: CUDA_HOME environment variable is not set. Please set it to your CUDA install root.

    'export CUDA_HOME=/usr/local/cuda' 커맨드로 지정해주면 아래의 에러 발생.

    error: [Errno 2] No such file or directory: '/usr/local/cuda/bin/nvcc'

    : 'which nvcc' 커맨드 입력해도 cuda 경로가 출력되지 않음. (container 외부의 root 권한으론 출력됨)

    \Rarr Unsolved...

    Unsolved...


Examples

  • environment.yaml 파일로 conda 가상환경 설치 및 실행
FROM continuumio/miniconda3:latest

WORKDIR /app
COPY environment.yaml /app/environment.yaml

RUN conda update -n base -c defaults conda
RUN conda env create -f environment.yaml

WORKDIR /workspace
RUN echo "source activate midas" >> ~/.bashrc
SHELL ["/bin/bash", "--login", "-c"]
CMD ["bash", "--login"]
$ docker run -it -d -v ~/MiDaS:/workspace -p 7860:7860 --name midas_gradio --gpus all jameskoo0503/midas:latest bash

  • FILM 실행 (저장된 image 불러와 실행)
$ docker pull gcr.io/deeplearning-platform-release/tf2-gpu.2-6:latest

$ docker run -it -v ~/FILM:/workspace --name film gcr.io/deeplearning-platform-release/tf2-gpu.2-6
$ docker run -it -v ~/FILM:/workspace --name film jameskoo0503/film:v1.1

$ docker exec -it film bash
$ cd workspace

# One mid-frame interpolation
$ python3 -m eval.interpolator_test \
   --frame1 photos/one.png \
   --frame2 photos/two.png \
   --model_path checkpoints/film_net/Style/saved_model \
   --output_frame photos/output_middle.png

# Many in-between frames interpolation ('photos/01/one.jpg' 형태로 파일 저장)
$ python3 -m eval.interpolator_cli \
   --pattern “photos/*” \
   --model_path checkpoints/film_net/Style/saved_model \
   --times_to_interpolate 6 \
   --output_video

  • ZERO-1-to-3 실행 (Python image부터 새로 container 구축)
$ docker pull python:3.9.17

$ docker run -it -v ~/ZERO123:/workspace --gpus all --name zero123 python:3.9.17 bash

$ cd zero123
$ pip install -r requirements.txt
$ git clone https://github.com/CompVis/taming-transformers.git
$ pip install -e taming-transformers/
$ git clone https://github.com/openai/CLIP.git
$ pip install -e CLIP/
$ pip uninstall gradio
$ pip install gradio

$ docker commit 1020a1fe04f0 jameskoo0503/zero123:v1.1

  • StableSR 실행 (Dockerfile로 image 생성)
[Dockerfile]
FROM nvcr.io/nvidia/pytorch:23.06-py3
RUN apt-get update && apt-get install -y wget curl bzip2

RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh \
&& bash miniconda.sh -b -p /opt/conda \
&& rm miniconda.sh

ENV PATH /opt/conda/bin:$PATH

COPY environment.yaml .

RUN conda create -n stablesr && conda env update -n stablesr --file environment.yaml
$ docker build -t myapp --target runtime -f docker/Dockerfile .
profile
K'AI'ST 학부생까지의 기록

0개의 댓글