Post

[Docker] Docker 정리 및 GCMC 다운로드 정리본

현장실습 기관에 제출용으로 작성한 문서. 앞의 두 도커 관련 게시물

을 좀 더 간결하게 정리한 거라고 생각하면 좋을 듯 싶다!

Docker

image

도커는 컨테이너 기반의 오픈소스 가상화 플랫폼으로, 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해준다. 백엔드 프로그램, 데이터베이스 서버, 메시지 큐등 어떤 프로그램도 컨테이너로 추상화할 수 있고 조립PC, AWS, Azure, Google cloud 등 어디서든 실행할 수 있다. 본 문서에서는 도커의 기본적인 내용과 사용법을 정리하고, 추가적으로 GCMC R&D 이미지의 push과정과 pull 및 사용법에 대해 소개하고자 한다.

Container

image

컨테이너는 격리된 공간에서 프로세스가 동작하는 기술이다. 주로 추가적인 OS를 설치하여 가상화하는 방법의 성능 문제를 개선하기 위해 도커에서는 프로세스를 격리하는 방식을 사용한다. 단순히 프로세스를 격리시키기 때문에 가볍고 빠르게 동작하며, CPU나 메모리는 프로세스가 필요한 만큼만 추가로 사용하고 성능적으로도 거의 손실이 없다.

하나의 서버에 여러개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행된다. 실행중인 컨테이너에 접속하여 명령어를 입력할 수 있고 apt-get이나 yum으로 패키지를 설치할 수 있으며 사용자도 추가하고 여러개의 프로세스를 백그라운드로 실행할 수도 있다. CPU나 메모리 사용량을 제한할 수 있고 호스트의 특정 포트와 연결하거나 호스트의 특정 디렉토리를 내부 디렉토리인 것처럼 사용할 수도 있다.

Image

image

이미지는 컨테이너 실행에 필요한 파일과 설정을 포함하고 있는 것으로 상태값을 가지지 않고 변하지 않는다.

컨테이너는 이미지를 실행한 상태이다.

추가되거나 변하는 값은 컨테이너에 저장된다. 같은 이미지에서 여러 개의 컨테이너를 만들 수 있고 컨테이너의 상태가 바뀌거나 삭제되어도 이미지는 변하지 않고 그대로 남아있다. 도커 이미지는 Docker hub에 등록하거나 Docker Registry 저장소를 직접 만들어 관리할 수 있다. 도커 이미지의 용량은 보통 수백 MB ~ 수 GB이지만 가상머신에 비하면 작은 용량이다

이미지는 다음과 같은 특징이 있다.

  • 상태값을 가지지 않고 변하지 않는다
  • 하나의 이미지를 통해 여러 컨테이너를 생성할 수 있고, 컨테이너를 삭제해도 이미지는 변하지 않는다
  • 이미지들은 Docker Hub를 통해 버전 관리 및 배포가 가능하다
  • 도커는 Dockerfile이라는 파일로 이미지를 만든다

도커 이미지는 Docker hub에 등록하거나 Docker Registry 저장소를 직접 만들어 관리할 수 있다. 현재 공개된 도커 이미지는 50만개가 넘고 Docker hub의 이미지 다운로드 수는 80억회에 이른다. 누구나 쉽게 이미지를 만들고 배포할 수 있다.

Dockerfile

image

도커 이미지를 만들기 위해 Dockerfile이라는 파일에 DSL(Domain Specific Language) 언어를 이용해 이미지를 생성할 수 있다. 단순 텍스트 파일로 일반적으로 소스와 함께 관리한다. 서버에서 프로그램을 설치하려고 할 때 Dockerfile 을 통하여 관리하면 된다. Dockerfile에서 사용할 수 있는 키워드는 20개 정도 있으며, 소스와 함께 버전이 관리 되고 원한다면 누구나 이미지 생성과정을 보고 수정할 수 있다.

Docker 설치

윈도우/맥

도커 데스크탑 다운로드(Link)

설치 방법 관련 블로그(Link)

리눅스

curl -fsSL https://get.docker.com/ | sudo sh

추가적으로, 도커에서 GPU를 사용하기 위해서는 Nvidia docker를 설치해주어야 한다.

Nvidia driver, cuda 설치방법(Link)

Nvidia docker 설치 방법(Link)

명령어

도커

docker run 커맨드의 기본 포맷은 다음과 같다.

image

자주 사용되는 옵션을 정리하면 다음과 같다.

옵션설명
-d<p>컨테이너를 백그라운드에서 실행</p><p>detached 모드에서 실행, 실행결과로 컨테이너 ID만을 출력</p>
-it<p>-i 옵션과 -t옵션을 같이 쓰는 경우</p><p>두 옵션은 컨테이너를 종료하지 않은 상태로 터미널의 입력을 계속해서 컨테이너로 전달하기 위해 사용</p>
–name컨테이너 이름을 부여하여 식별하기 용이
-e컨테이너 내에서 사용할 환경변수 설정
-p<p>호스트와 컨테이너 간의 포트 배포(publish)/바인드(bind)를 위해서 사용</p><p>호스트 컴퓨터에서 컨테이너에서 리스닝하고 있는 포트로 접속할 수 있도록 설정</p><p>host os의 포트 하나에는 하나의 컨테이너만 연결 가능</p>
-v<p>호스트와 컨테이너 간의 볼륨 설정을 위해 사용</p><p>호스트 컴퓨터의 파일 시스템의 특정 경로를 컨테이너의 파일 시스템의 특정 경로로 마운트 해줌 -> 호스트 파일을 컨테이너에 공유</p><p>docker -v [호스트 경로]:[컨테이너 경로] [이미지이름]</p>
-wDockerfile의 WORKDIR 설정을 덮어쓰기 위해 사용
–entrypointDockerfile의 ENTRYPOINT 설정을 덮어쓰기 위해 사용
-rm<p>컨테이너를 일회성으로 실행할 때 사용</p><p>컨테이너가 종료될 때 컨테이너와 관련된 리소스(파일 시스템, 볼륨)까지 깨끗이 제거</p>
-link컨테이너 연결 [컨테이너명:별칭]

run 명령어를 사용하면 사용할 이미지가 저장되어 있는지 확인하고 없으면 다운로드를 한 후 컨테이너를 생성하고 시작한다.

도커 파일 복사 (로컬 <-> 컨테이너)

  • 로컬의 파일을 컨테이너로 복사
    • docker cp [로컬 파일 주소] [컨테이너ID]:[컨테이너 폴더 주소]
  • 컨테이너의 파일을 로컬로 복사
    • docker cp [컨테이너ID}:[컨테이너 파일 주소] [로컬 폴더 주소]

도커 폴더 복사 (로컬 <-> 컨테이너)

  • 로컬의 폴더를 컨테이너로 복사
    • docker cp [로컬 폴더 주소+/.] [컨테이너ID]:[컨테이너 폴더 주소]
      • /. <- 폴더 내의 모든 파일을 뜻함
      • 컨테이너 안에 새로운 폴더 생성하여 폴더 내의 모든 파일을 복사하는 것이 가능
  • 컨테이너의 폴더를 로컬로 복사
    • docker cp [컨테이너ID}:[컨테이너 폴더 주소+/.] [로컬 폴더 주소]

이미지

이미지 설치

  • **docker pull [OPTIONS] NAME[:TAG@DIGEST]**

ex) docker pull bitnine/agensgraph

이미지 목록 출력

  • docker images [OPTIONS] [REPOSITORY[:TAG]]

이미지 삭제

  • docker rmi [이미지 이름]:[태그] / docker rmi [이미지ID]
  • docker rmi -f [이미지ID] - 이미지와 컨테이너까지 삭제

컨테이너

컨테이너 생성

  • docker run –name [컨테이너 이름] -it [이미지 이름]

컨테이너 실행

  • docker run -i -t [이미지 이름] /bin/bash
  • docker exec -it [이미지 이름] /bin/bash

  • 옵션
    • -i : 사용자가 입출력을 할 수 있는 상태
    • -t : 가상 터미널 환경을 에뮬레이션함
    • -d : 컨테이너를 백그라운드 형태로 계속 실행하게 함

(+에뮬레이션: 완전히 똑같은 방법으로 다른 대상을 하드웨어 동작까지도 흉내내는 것)

컨테이너 목록 출력

  • docker ps - 실행ㅇ 중인 컨테이너 목록 출력
  • docker ps -a,-all - 모든 컨테이너 목록 출력

컨테이너 시작(정지한 컨테이너를 다시 시작)

  • docker start [컨테이너이름]**

컨테이너 재시작(os 재부팅처럼 컨테이너 재시작)

  • docker restart [컨테이너이름]

컨테이너 접속

  • docker attach [컨테이너 이름 or ID] - 시작한 컨테이너에 접속

컨테이너 정지

  • docker stop [컨테이너 이름]

컨테이너 삭제

  • docker rm [컨테이너 이름]
  • docker rm docker ps -a -q - 컨테이너 전체 삭제

외부에서 컨테이너 안의 명령 실행

  • docker exec [컨테이너이름] [명령] [매개변수]

컨테이너 종료

  • exit / Ctrl + d

컨테이너 중지 및 종료. 종료 후 컨테이너의 status가 Exited가 된다. (docker pa -a로 확인)

  • Ctrl + p, Ctrl +q

컨테이너를 백그라운드 실행시킨 상태로 종료. status가 Up이다.

(docker ps -a로 확인)

컨테이너 연결

웹 서버 컨테이너와 DB컨테이너가 있을 때, 웹 서버 컨테이너에서 DB컨테이너에 접근할 수 있어야 함

DB 컨테이너 생성

  • docker run –name [DB컨테이너이름] -d [DB이미지이름]

web 컨테이너 생성 및 db 컨테이너와 연결

  • docker run –name [Web컨테이너이름] -d -p 80:80 –link [DB컨테이너이름]:[별칭] [Web이미지이름]

web 컨테이너 안에서 db 컨테이너로 접속

  • mongodb://[별칭]:[포트번호]/exampledb

주피터 노트북 컨테이너 생성 예시

컨테이너 생성

  • docker run –name jp -d -p 8080:8888 -it jupyter/datascience-notebook

주피터 컨테이너 쉘 실행

  • docker exec -it jp /bin/bash

주피터 컨테이너 초기 비밀번호 확인

  • docker logs jp

주피터 컨테이너 웹 실행

  • jupyter notebook —allow-root
  • localhost:8080로 접속

리눅스

Linux commands cheat sheet 검색 시 더욱 많은 명령어를 확인할 수 있다.

파일 시스템 탐색을 위한 리눅스 명령어

  • pwd (Print Work Directory)

현재 작업 중인 디렉토리를 보여줌

  • ls (list segments)

파일과 디렉토리의 모든 정보를 제공

특정 디렉토리와 특정 파일의 내용도 제공

  • cd (change directory)

현재 디렉토리를 기준으로 해당 디렉토리로 이동하는 방법

  • mkdir (make directory)

새 디렉토리(새 폴더)를 만듦

  • rmdir (remove directory)

빈 디렉토리를 삭제할 때 사용 (디렉토리가 비어있지 않을 경우 삭제x)

  • lsblk

linux 시스템에서 사용 가능한 블록 장치를 나열해야 하는 경우 사용

블록 장치의 트리 구조를 나타냄

  • mount

기존 파일 시스템으로 마운트

  • df

파일시스템의 디스크 공간에 대한 필수 정보를 표시

시스템 조작을 위한 리눅스 명령어

  • uname

이름, 버전 및 기타 시스템 특정 세부 사항과 같은 시스템 정보를 얻기 위한 명령어

  • ps

현재 시스템에서 실행 중인 프로세스 시각화

  • kill

자원 제한으로 인해 멈춘 프로세스를 중지하는 방법

  • service

시스템 전체 서비스를 호출하기 위한 명령어

  • batch

미리 정의된 일정에 따라 시스템 서비스를 실행하는 깔끔한 도구

자동화 쉘 스크립트 작성을 위한 명령어

  • shutdown

시스템을 종료하는 명령어

현재 접속 중인 모든 사용자에게 시스템이 종료된다는 메시지를 보낼 수 있음

파일 관리를 위한 리눅스 명령어

  • touch

유효한 빈 파일을 작성하기 위한 명령어

  • cat

새 파일을 작성하고 터미널에서 파일내용을 보고 출력을 다른 명령행 도구나 파일로 리디렉션하는데 사용

  • head

터미널에서 직접 파일 또는 파이프 된 데이터의 시작을 볼 수 있음

  • tail

파일의 마지막 행을 기준으로 지정한 행까지의 파일 내용 일부를 출력

  • cp (copy)

시스템에서 파일이나 디렉토리를 한 폴더에서 다른 폴더로 복사하도록 지시하는 명령어

  • mv (move)

하나 또는 여러 파일을 한 위치에서 다른 위치로 이동하는 명령어

  • comm

두 개의 파일을 공통 행과 구별되는 행으로 비교

터미널에서 많은 양의 파일을 처리해야할 때 필수적인 명령어

  • less (cat이랑 유사)

파일의 내용을 볼 때 편리

터미널 세션을 방해하지 않으면서 파일 내에서 양방향으로 탐색

  • ln

특정 파일에 대한 심벌릭 링크를 만들기 위한 가장 편리한 명령어

디스크 공간의 특정 파일이나 디렉토리에 대한 심벌릭 링크의 여러 인스턴스를 생성할 수 있음

  • cmp (comm이랑 유사)

두 파일을 비교하고 결과를 표준 출력 스트림에 인쇄

  • dd

파일을 한 유형에서 다른 유형으로 복사 및 변환하기 위해 사용

  • alias

터미널에서 직접 파일의 다른 문자열로 단어를 바꿀 수 있음

쉘을 사용자 정의하고 환경 변수를 조작할 수 있음

리눅스 명령어 검색 및 정규 표현식

  • find

터미널에서 파일을 검색하는데 가장 많이 사용되는 명령어

파일 권한, 소유권, 수정 날짜, 크기 등과 같은 특정 기준에 따라 파일 검색

  • which

검색하려는 모든 파일이 실행 파일인 경우 유용

특정 매개 변수를 취하여 $ PATH 시스템 환경 변수에서 이진 파일을 효과적으로 검색

  • locate

특정 파일의 위치를 찾는데 사용되는 명령어

  • grep

대량의 텍스트 파일에서 패턴을 검색할 때 사용할 수 있는 정규식 터미널 명령

찾고자 하는 패턴을 입력 받아 특정 패턴에 대해 지정된 파일 검색

  • sed

지정된 부분을 교체하여 파일 또는 스트림의 각 줄을 조작하는데 가장 많이 사용되는 명령어

많은 양의 텍스트 데이터를 다루고 이동 중에도 변경할 때 사용

I / O 및 소유권을 다루는 리눅스 명령어

  • clear

기존 터미널 화면을 지우는데 사용

  • echo

터미널 콘솔에 특정 텍스트를 출력할 수 있는 명령어

출력을 다른 터미널 명령으로 파이프 할 수 있음

  • sort

사전 순, 역순으로 파일을 정렬할 때 사용

  • sudo

권한이 없는 사용자를 권한이 필요한 파일에 액세스하고 수정할 수 있게 해줌

일반 사용자 계정에서 루트에 액세스함

  • chmod

시스템 파일 or 객체의 액세스 권한을 변경하거나 수정하는데 사용

사용자로부터 매우 다양한 매개 변수 세트를 취하는게 가능

  • chown

chmod와 유사, 사용자가 파일 or 디렉토리의 소유권을 변경

chmod 및 chown 터미널 명령은 모두 루트 권한이 필요

일상적인 사용을 위한 기타 명령어

  • man

manual을 나타냄

  • tar

파일을 아카이브하고 추출하는데 사용

파일을 압축하는데 사용되는 명령

  • whatis

사용자가 제공한 간단한 설명으로 데이터베이스 세트를 순회하며 해당 데이터베이스 명령과 일치하는 시스템 명령을 인쇄

GCMC 이미지

분석 환경

  • pytorch 1.10.0
  • cuda 11.1(로컬 cuda 환경 또한 같은 버전이어야 실행 가능)
  1. pytorch 1.10.0 이미지 pull
    • docker pull pytorch/pytorch:latest
  2. 포트 연결해 컨테이너 생성
    • docker run -it –name gcmc -p [호스트 포트 번호]:[도커 포트 번호] pytorch/pytorch:latest
  3. 필요 패키지 설치
    • pip install torch-scatter -f https://pytorch-geometric.com/whl/torch-1.10.0+cu111.html
    • pip install torch-sparse -f https://pytorch-geometric.com/whl/torch-1.10.0+cu111.html
    • pip install torch-cluster -f https://pytorch-geometric.com/whl/torch-1.10.0+cu111.html
    • pip install torch-spline-conv -f https://pytorch-geometric.com/whl/torch-1.10.0+cu111.html
    • pip install torch-geometric
    • pip install comet-ml==3.0.2
    • pip install pyyaml==5.4
  4. github 소스코드 파일 컨테이너로 복사

    github은 아직 업로드하지 않아 로컬에서 컨테이너로 파일을 복사함

` `++ 컨테이너 내부에 주피터 설치하기(Link)

이미지 생성

이미지 생성 전 컨테이너 멈추기

docker stop [컨테이너명]

컨테이너를 이미지로 만들기

docker commit [options] <container name> [image name[:tag name]]

옵션

  • -a, –author=”” : 생성자 정보
  • -m, –message=”” : 이미지 메시지
  • -p, –pause=true/false : 이미지를 생성할 때 컨테이너를 중지(stop) 한 뒤 commit 여부

docker hub에 이미지 push하기

  • docker hub에 로그인하기
    • docker login
    • 오류시 docker login -u [id]
  • docker hub에 이미지 올리기
    • docker push [ 생성했던 tag]

GCMC 이미지 사용법

GCMC 분석 수행을 위한 환경은 이미 docker hub에 이미지로 push 해두었으므로, 위의 과정은 직접 수행하지 않아도 된다.

이미지 내려받기

docker pull yeonseo/gcmc

gcmc 수행

  • gcmc 이미지로 컨테이너 생성 후 cd gcmc로 폴더 접근
  • !python train.py (cpu로 수행 시 용량이 매우 큰 경우 killed됨)

image

라인 커맨드

다음과 같이 라인에 인수를 직접 주어 분석을 수행할 수 있다.

예를 들어 epoch 50, hidden size 100으로 분석을 수행하고 싶다면 !python train.py -e 50 -hi 100을 실행하면 된다.

데이터 변경

현재 gcmc코드는 url을 통해 데이터셋을 다운로드 받는 형식으로 진행된다.

분석을 위해 필요한 데이터셋 형식은 user-item-rating이며 예시는 다음과 같다.

image

feature vector가 존재하는 경우 함께 압축하여 구글 드라이브에 업로드한다.

zip파일을 구글 드라이브에 업로드 한 뒤, 우클릭을 하면 링크 생성이 가능하다.

image

이때 ’링크가 있는 모든 사용자에게 공개’로 옵션을 변경해주어야 한다.

이 링크를 복사해 다음의 사이트(Link)에서 한번 더 변환해 준다.

데이터셋 파일(Dataset.py) 변경

image image

  • 복사한 url을 1에 덮어씌운다.
  • 2, 3의 파일명을 새 데이터셋과 동일한 파일명으로 변경한다.
  • 특징 벡터 파일이 존재하는 경우 적절하게 4,5를 변경한다.
  • 특징 벡터와 관련한 argument는 train.py 에서 추가 및 수정이 가능하다.
  • 6의 root 또한 적절하게 변경해준다.

기타 소프트웨어 설치

Git 설치

  • apt update
  • apt install -y git

Apt-get 설치

  • curl https://raw.githubusercontent.com/dvershinin/apt-get-centos/master/apt-get.sh -o /usr/local/bin/apt-get
  • chmod 0755 /usr/local/bin/apt-get

Nano 설치

  • apt-get update
  • apt-get install nano

참조 목록

  • 도커 이해하기(Link)
  • 초보를 위한 도커 안내서(Link)
  • Docker 기본 사용법(Link)
  • Docker 명령어 사용법(Link)
  • Linux 명령어 사용법(Link)
  • 윈도우 폴더 공유(Link)
  • 포트 개념(Link)
This post is licensed under CC BY 4.0 by the author.