Docker 설치 및 컨테이너 실행 옵션 사용방법

Docker? nvidia-docker2? 

이번 포스팅에서는 Docker에 대해 알아보려고 합니다. 사실 이미 오래전부터 사용되었던 Docker이지만 모르는 분들을 위한 글이기에 또한 저의 기록이기에 조금은 가볍게 소개하고자 합니다.

 

Docker란 무엇인가?

도커는 컨테이너 기반의 오픈소스 가상화 플랫폼인데요. 그래서 컨테이너가 뭔데? 가상화? VM이랑 뭐가 다르지? 할텐데요. Docker는 애플리케이션을 신속하게 구축 및 배포할 수 있는 플랫폼입니다.

 

Docker는 소프트웨어를 컨테이너라는 표준화 된 유닛으로 패키 징하여, 컨테이너에 시스템 도구, 코드, 런타임 등 필요한 모든 것이 바로 사용할 수 있도록 포함되어 있는 가상 환경이라고 보시면 될 것 같습니다.

 

Docker vs VM

vm ware와 docker는 예전부터 비교예시가 참 많습니다. 제가 글로 설명하는 것보다 위에 구조를 보게 되면 이해하기 참 편할 텐데요. 

 

vm ware는 Host OS가 설치 되고 그 위에 Hypervisor가 가상화 기능을 제공해 주는데요. 독립된 커널 공간에 Guest OS 설치가 되기 때문에 운영 자체가 무거워질 수밖에 없는데요. 이럴 때 시스템에 overhead가 발생하게 됩니다.

 

 

반면에 Docker는 Host OS위에 프로세스를 격리시켜 독립된 서버로 구성할 수 있는데요. 컨테이너끼리 격리되어 있으며, 같은 커널공간을 공유하기 때문에 linux 자원만 호스트와 공유하게 되므로 훨씬 가볍습니다.

 

아래서부터는 docker 설치를 진행해 볼 생각입니다. 이 포스팅은 초보 위주의 글을 작성하는 것이니 아래 설치 과정을 잘 확인하시고 마지막에 간단하게 설치하는 방법을 공유드리도록 하겠습니다.

 

Ubunut Docker 설치

이전 버전 remove

$ sudo apt-get remove docker \
docker-engine docker.io containerd runc

기존 설치되어 있는 구버전 docker를 삭제 해주고 시작하면 되는데요. 아무것도 설치되어 있지 않은 서버에서는 지나쳐도 무방합니다.

 

저장소 설정

$ sudo apt-get update

$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

HTTPS를 통해 저장소를 사용할 수 있도록 apt 패키지 색인을 업데이트하고 패키지를 설치합니다.

 

Docker 공식 GPG키 추가

$ curl -fsSL https://download.docker.com/\
linux/ubuntu/gpg | sudo apt-key add -

마지막 8자리 검색하여 확인

$ sudo apt-key fingerprint 0EBFCD88

pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]

 

repository 추가

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

 

Docker Engine 설치

 $ sudo apt-get update
 $ sudo apt-get install docker-ce docker-ce-cli containerd.io

위와 같이 복잡한 다소 복잡한 과정을 통하면 Docker가 설치 되는데요. 제 생각에는 이 복잡한 과정을 그냥 지나칠 수 있지만 도커를 처음 설치하거나 저처럼 초보인 경우에는 정석대로 설치해 보는 방법도 나쁘지 않다고 생각합니다.

 

과정도 모른체 나중에 Docker 설치 스크립트가 없다면 헤매게 될 경우도 있기 때문에 마지막에 공개를 하게 되었습니다. 아래에서 한 줄로 Docker를 설치하기로 하겠습니다.

 

 

Docker 설치 스크립트

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

멀리 돌아왔지만 이제는 위에 명령어 한줄로 도커 설치는 간단하게 하실 수 있습니다. 그냥 지나치지 마시고 https://get.docker.com 들어가서 확인 해보세요. 

 

Docker 설치 후 사용자 권한

sudo groupadd docker
sudo usermod -aG docker $USER
sudo usermod -aG docker <your-user>

Docker를 루트가 아닌 사용자로 사용하려면 docker 그룹에 사용자를 추가하여야 하며, 이를 적용하려면 로그 아웃 후 다시 로그인하셔야 합니다.

 

위에 모든 설치가 끝났다면 이제 docker container 사용 방법에 대해 알아보도록 하겠습니다.

 

Docker version

# docker version

Docker version 확인하는 명령어로 client와 server 정보가 정상적으로 출력이 되었다면 이제 Docker를 마음껏 사용할 수 있습니다. 

 

$ sudo systemctl enable docker

재부팅 후에도 docker를 사용해야 하기 때문에 systemd에 enable 시켜 놓는 작업을 진행합니다.

 

도커 이미지 컨테이너

고수분들은 위에 도커 architecture만 봐도 알겠지만 저와 같은 분들이 이 포스팅을 본다면 조금 어려워하실 수 있을 것 같습니다. docker image는 docker bulid란 명령어로 dockerfile형태로 작성이 되어 image로 만들어집니다. 

 

이 이미지를 실행하게 되면 복수의 container들이 생성이 되는것이며, 저희는 이미지에 접근하는 것이 아니라 컨테이너에 접근하여 작업을 하게 됩니다.

 

좀 더 고급스럽게 얘기하자면 컨테이너는 이미지의 실행 가능한 인스턴스라고 합니다. 자세히 알고 싶으시다면 해당 페이지를 통해 확인하시면 도움이 되실 것 같습니다.

 

 

컨테이너 실행 옵션

Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

options

-it

-i + t를 같이 같이 사용한 옵션으로 터미널 입력을 위한 옵션

 

-p

호스트와 컨테이너의 포트를 연결함(포워딩)

 

-v

호스트와 컨테이너의 디렉토리 연결 (mount)

 

-d

detached mode 백그라운드 모드

 

-e

컨테이너 안에서 사용할 환경변수 설정 

 

-name

컨테이너 이름 설정

 

-rm 

컨테이너 프로세스 종료시 사용 중이던 컨테이너 제거

 

-link

컨테이너 연결 [컨테이너명:별칭]

 

위 docker options는 기본적으로 가장 많이 사용되는 옵션들입니다. 

 

docker image 받아오기

docker를 이용하기 위해서는 새로운 이미지를 download 하여야 합니다. 위와 같이 기본적인 이미지가 아닌 원하는 이미지가 있다면 docker hub에 가입하셔서 이미지를 찾아보실 수 있습니다.

 

또한 위에 pull 명령어를 통해 docker image를 받아오는 것인데요. 사실 이미지가 없을때 docker pull명령어를 사용하여도 되지만 docker run명령어를 사용하셔도 무방합니다.

 

docker run 시 로컬에 없는 이미지면 알아서 docker hub사이트에서 이미지를 다운로드 후 실행해 줍니다.

 

위는 이미 제가 TEST중이던 image들이 몇 개 있기 때문에 3가지의 이미지가 존재하는데요. 처음 설치하셨다면 ubuntu에 18.04 TAG한개만 존재하게 됩니다.

 

위에서 자주 사용하는 option중에 -v를 한번 사용해 보도록 하겠습니다.

 

 

docker -v 옵션 사용

root@ubuntu:~# ls
123.txt                             fio
1.txt                               fio4krandrw.txt
3600s-last4124-4krdrw.txt           fio_optane.txt
anaconda3                           gpu-burn
Anaconda3-2020.11-Linux-x86_64.sh   IPMICFG_1.32.0_build.200820
benchmarks                          IPMICFG_1.32.0_build.200820.zip
cuda                                last.txt
cuda_11.0.3_450.51.06_linux.run     NVIDIA_CUDA-11.0_Samples
cuda_11.1.0_455.23.05_linux.run     nvidia_docker2.sh
cudnn-11.0-linux-x64-v8.0.4.30.tgz  nvidia_docker2.sh.1
docker.sh                           test
docker.sh.1                         tfbench.sh
root@ubuntu:~# docker run -it -v /root:/root ubuntu:18.04
(base) root@f0088d796f63:/# ls /root/
1.txt                              cudnn-11.0-linux-x64-v8.0.4.30.tgz
123.txt                            docker.sh
3600s-last4124-4krdrw.txt          docker.sh.1
Anaconda3-2020.11-Linux-x86_64.sh  fio
IPMICFG_1.32.0_build.200820        fio4krandrw.txt
IPMICFG_1.32.0_build.200820.zip    fio_optane.txt
NVIDIA_CUDA-11.0_Samples           gpu-burn
anaconda3                          last.txt
benchmarks                         nvidia_docker2.sh
cuda                               nvidia_docker2.sh.1
cuda_11.0.3_450.51.06_linux.run    test
cuda_11.1.0_455.23.05_linux.run    tfbench.sh

기존 로컬 서버의 /root 폴더와 아래 컨테이너의 /root 폴더가 같은 게 확인되시나요? container는 작업 중 나가게 되면 작업내용이 휘발성으로 없어지기 때문에 작업 중 저장을 해야 하는 내용이 있다면 -v 옵션으로 마운트 후 작업하시는 게 마음에 안정을 찾을 수 있습니다.

 

docker exec

exec는 외부에서 컨테이너 안의 명령을 실행하는 커맨드입니다.

root@ubuntu:~# docker ps -a
CONTAINER ID   IMAGE                                     COMMAND                  CREATED          STATUS                        PORTS     NAMES
f3f9bcfbd1b1   ubuntu:18.04                              "/bin/bash"              46 seconds ago   Exited (130) 38 seconds ago             frosty_yonath
f0088d796f63   ubuntu:18.04                              "/bin/bash"              3 minutes ago    Exited (130) 53 seconds ago             eager_black
33f3f89e3f4d   ubuntu:18.04                              "/bin/bash"              11 minutes ago   Exited (0) 4 minutes ago                nervous_robinson
10ad9abde5e7   ubuntu:18.04                              "/bin/bash"              13 minutes ago   Exited (0) 12 minutes ago               magical_chaplygin
7c10f48a213e   nvcr.io/nvidia/tensorflow:20.12-tf1-py3   "/usr/local/bin/nvid…"   9 days ago       Exited (129) 8 days ago                 laughing_noyce
09dafb66233d   nvcr.io/nvidia/tensorflow:20.12-tf1-py3   "/usr/local/bin/nvid…"   9 days ago       Exited (0) 9 days ago                   zen_benz
root@ubuntu:~# docker start f0088d796f63
f0088d796f63
root@ubuntu:~# docker exec -it f0088d796f63 bash
(base) root@f0088d796f63:/#

사실 휘발성은 아닙니다. 사용중인 컨테이너 이름만 f0099d796f63 만 잘 기록하셨다면 docker ps를 통해 확인 후 다시 접근이 가능합니다.

 

docker ps -a를 통해 Exited중인 container를 start 시켜준 후 exec 명령어를 통해 접근해 주시면 기존에 사용하셨던 컨테이너에 무사히 접근하실 수 있습니다.

 

docker? nvidia-docker?

docke와 nvidia-docker는 큰 차이가 없는데요. 기본적인 Docker image로 생성된 container내에서는, HOST OS가 사용하는 GPU 자원을 사용할 수가 없는데요. 그렇기 때문에 nvidia-docker를 설치합니다.

 

nvidia-docker2는 nvidia container toolkit을 설정하여 사용하려는 용도인데요. nvidia의 ngc의 컨테이너들을 nvidia-docker를 통하여 GPU를 할당하여 설정할 수가 있습니다.

 

nvidia-docker2 사용법은 해당 포스팅에 계속 이어간다면 페이지가 지저분해지고 산만할 듯 하여 다음 포스팅에서 자세히 다루도록 하겠습니다.

 

 

2020/12/29 - [linux] - Anaconda 다운로드 설치 및 파이썬 가상환경 사용하기

2020/12/24 - [linux] - 쿠버네티스(kubernetes)란 ? 기본 개념부터 알아보자

2020/12/19 - [linux] - nvidia smi 꼭 알아야 할 TIP - temp,serial,topology matrix

2020/12/18 - [linux] - NVIDIA-SMI 확인방법 및 활용하기

2020/12/20 - [supermicro] - 슈퍼마이크로 AS-4124GS-TNR 상세정보 PCI-E 4.0

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기

댓글을 달아 주세요

">
  1. thumbnail
    겨울
    2021.09.03 23:31

    감사합니다