Docker는 컨테이너 기반의 오픈소스 가상화 플랫폼이다.
이 Docker라는 것은 상당히 특이한데, 기존의 VM (Virtual Machine)은 특정 Hardware의 Resource를 할당하여
동작시켰지만 Docker는 VM과 다르게 OS (Operating System; 운영체제)를 가상화하여 동작한다는 것이다.
이게 대체 무슨 말이냐...
일단 가상화 기술에 대해서 먼저 알아봐야겠지?
가상화 기술이란 것은 물리적인 하드웨어 자원(CPU, Memory 등)을 논리적인 리소스로 제공하기 위한 기술이라고 일컫는다.
말그대로 물리적인 Machine에 실제 Machine처럼 보이게 만드는 기술, 즉 논리적인 Machine이라고도 하는데
이 가상화 기술도 크게 3종류로 나눌 수 있다.
- 호스트 OS형
호스트 OS형은 물리적인 하드웨어 자원 위에 OS를 설치해서 그 위에서 가상화 소프트웨어와 Virtual Machine을 움직이는 방식을 말한다. 따라서 이 같은 경우엔 호스트 Machine과 Virtual Machine 간의 OS가 서로 다를 수 있다.
대표적인 예로 우리가 흔히 알고 있는 VMware, VirtualBox가 이에 속한다.
- 하이퍼바이저형
하이퍼바이저형은 호스트 OS를 필요로 하지 않는 타입의 가상화 방식을 일컫는다. 즉, 하이퍼바이저라는 소프트웨어를 물리적인 하드웨어 자원 위에 직접 동작하게 함으로써 하이퍼바이저 소프트웨어 위에서 개별로 가상머신을 동작하게 만든다. 주로 VMware ESXi, Linux에서의 Xen/Citrix XenServer Microsoft Hyper-V 등이 있다.
- 컨테이너형
컨테이너형은 좀 독특하다. 호스트 OS위의 Application Layer 에서 개개의 Application 형태로 동작한다. 이 개개의 Application을 컨테이너라고 하며 호스트 OS위에서 동작한다. 역설하자면, 개개의 컨테이너는 OS Kernel을 공유하여 동작하기 때문에 호스트 OS 와 컨테이너 OS는 같을 수 밖에 없다. 근데 여기서 중요한 것은 하나의 컨테이너 내에서 환경변수를 설정했을 땐 다른 컨테이너에서 동일하게 먹히지 않는다는 것이다.
Container와 Virtual Machine의 구조를 보면 훨씬 이해하기 쉽다.
(참조 : Docker Official Site)
일단 Virtual Machine은 Physical hardware을 추상화하여 동작한다. 쉽게 말해서, 하나의 Machine 위에서 여러 개의 VM이 동작하고, 각각 VM은 OS, binary & Library file이 있어야 한다. 그렇기 때문에 이로인해서 저장공간이 하나의 Machine위에 동작하는 VM이 증가할수록 낭비가 심해진다.
하지만, Docker의 Container 구조는 Application Layer에서 종속되는 패키지 코드를 추상화하여 동작한다. 즉, Host OS 위에서 Docker가 동작하여 여러개의 App 형태로 동작을 하는 것이다. 그렇기 때문에 VM의 문제점이었던 자원할당에 대한 문제점도 다른 컨테이너와 함께 OS Kernel을 공유할 수 있어 문제점을 보완할 수 있고 저장공간이 별개로 필요하지 않기 때문에 저장공간 또한 낭비를 막을 수 있다.
특히 이 컨테이너는 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해준다. 지금 현재는 백엔드 프로그램, 데이터베이스 서버, 메시지 큐 등 어떤 프로그램도 컨테이너로 추상화 할 수 있고 조립PC, AWS, Azure, Google Cloud 등 어디에서든 실행할 수 있다고 한다. (오호라...)
그런데, KISTI에서 Internship을 하면서 여기 연구원 분들이 Kubernetes를 자꾸 외치시길래 뭘까하고 계속 고민만 했지 정작 찾아본적은 없었다. 별개로 Kubernetes에 대한 것도 간략하게 언급해보자면,
자, Docker에선 컨테이너를 사용하면 Machine의 자원을 효율적으로 사용할 수 있다고 위에서 언급한 바 있다.
근데 이게... 만약 컨테이너가 기하급수적으로 증가한다면? 컨테이너를 관리하고 운영하는데 상당히 어려워져서 운영상의 효율성이 저하된다. 이러한 배경을 시초로 출현하게 된 것이 바로 Kubernetes인 것이다.
Kubernetes는 Container Orchestration platform 중 하나로 구글이 자사 서비스를 위해 개발했던 Borg에서 얻은 운영 노하우를 오픈소스를 공개한 것이라고 한다.
음... 그래서 Container간 Orchestration을 강조를 하셨던 게로군...
다시 본론으로 돌아와서,
Docker에서 Container 외에 Image 란 것도 중요하다.
Image란 컨테이너 실행 파일과 설정값 등을 포함하는 것으로 상태값을 가지지 않고 변하지 않는 것 (Immutalble)이라고
정의하고 있다.
이제 Docker 설치 절차와 기본적인 명령어에 대해 알아보겠다.
설치 운영체제 환경은 Cent OS 7이다.
0. Docker의 Old version 지우기 (없다면 생략)
# Remove Docker Old version
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
1. Repository 설정
# Repository Set up
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
2. 다운로드
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
3. 설치
sudo yum install docker-ce docker-ce-cli containerd.io
4. List 출력
yum list docker-ce --showduplicates | sort –r
여기서 출력된 메시지 중에 2번째 열 3: 뒤에 보면 버전 정보 18.09.01과 같이 적혀있다.
이거 따로 필기해놓고...
5. Docker-ce 다운로드
#docker-ce download
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
여기서 <VERSION_STRING> 에 해당하는 부분에 4번 항목에서 필기해놓은 버전 정보를 입력한다.
6. Docker 시작
# Start Docker
sudo systemctl start docker
7. Docker engine test
# docker engine test
sudo docker run hello-world
(제 Blog를 보시는 분 중에 Docker 설치에 관한 것만 참고한다면 7번까지만 수행해주세요.
8번부턴 Xilinx Alveo Card와 관련.)
- Xilinx Alveo Card의 성능을 확인하기 위한 예제를 실행시키기 위해서 다음 과정 수행 -
ML Suite Caffe Container 설치 과정
8. Image 압축파일 받기
여기서 해당 압축파일을 받는다. Image 파일이다.
9. Container에 load 하기
# container load
docker load < xilinx-ml-suite-ubuntu-16.04-xrt-2018.2-caffe-mls-1.4.tar.gz
10. script 파일인 docker_run.sh를 생성하여 아래 사항 붙여넣기
[docker_run.sh 파일의 코드 전문]
#!/usr/bin/env bash
user=`whoami`
HERE=`dirname $(readlink -f $0)`
mkdir -p $HERE/share
chmod -R a+rwx $HERE/share
xclmgmt_driver="$(find /dev -name xclmgmt\*)"
docker_devices=""
echo "Found xclmgmt driver(s) at ${xclmgmt_driver}"
for i in ${xclmgmt_driver} ;
do
docker_devices+="--device=$i "
done
render_driver="$(find /dev/dri -name renderD\*)"
echo "Found render driver(s) at ${render_driver}"
for i in ${render_driver} ;
do
docker_devices+="--device=$i "
done
#sudo \
docker run \
--rm \
--net=host \
--privileged=true \
-it \
$docker_devices \
-v $HERE/share:/opt/ml-suite/share \
-w /opt/ml-suite \
xilinx-ml-suite-ubuntu-16.04-xrt-2018.2-caffe-mls-1.4:latest \
bash
11. 이후 Script 실행
sudo chmod 755 docker_run.sh
sudo sh docker_run.sh
docker_run.sh에 권한 부여를 해주고 실행.
docker를 실행시키기까지 모두 끝났다.
허허 근데 그래도 기본 명령어들이 더 남았다...
- Docker network 생성, list 확인, 제거
# To create docker network
sudo docker network create kisti-network \
--ip-range 203.253.235.0/24 \
--subnet=203.253.235.0/24
# To show docker network which I already make it
sudo docker network list
# Remove network
sudo docker network rm kisti-network
- Docker container 생성
docker create \
--name dev01 \
--hostname dev01 \
--net=host \
--privileged=true \
--ip (ip주소) \
--volume $PWD:/docker \
-it \
$docker_devices \
-v $HERE/share:/opt/ml-suite/share \
-w /opt/ml-suite \
xilinx-ml-suite-ubuntu-16.04-xrt-2018.2-caffe-mls-1.4:latest \
bash
- 현재 실행되고 있는 Docker와 관련된 명령어
# To start container
sudo docker start test01
# Login
sudo docker exec --workdir /docker -it test01 bash
# To stop container
sudo docker stop test01 test02
# Check container status
sudo docker ps -a
# Remove container
sudo docker rm test01 test02
# Remove images
sudo docker images
sudo docker rmi docker_name:test01
# MultiUser access to docker container
sudo docker exec -it dev01 bash
4번째의 sudo docker ps -a와 맨 마지막에 sudo docker exec -it dev01 bash 명령어를 자주 사용한다.
처음 Docker 사용했을 때 엄청 혼란에 빠졌었는데 동일한 docker에 여러 개의 세션을 열어 다중 접속하는 방법이
-it (iteractive) 옵션을 주어 접속하는 방법이다. (상당히 중요)
그리고 현재 Container의 Status를 확인하는 명령이 4번째 명령(sudo docker ps -a)다.
다음 번 포스트 땐 docker 위에서 Jupyter Notebook을 올려 동작시키고 example을 실행해보도록 하겠다.
참고문헌 1 : Docker Official Site - What is a Cotainer ?
참고문헌 2 : Docker와 쿠버네티스의 이해
참고문헌 3 : 컨테이너와 쿠버네티스를 쉽게 이해하기
참고문헌 4 : 초보자를 위한 도커 안내서
'개발(Dev) 이야기 > Linux, Unix' 카테고리의 다른 글
[Lua] 주석다는 방법 (0) | 2020.03.18 |
---|---|
Cent OS에 Cmake 3.6.1 설치하기 (0) | 2019.08.08 |
추가 HDD 마운트하는 방법 (0) | 2019.08.07 |
Ubuntu에 원격 데스크톱(Xrdp) 설치하기 (0) | 2019.08.06 |
Xrdp를 사용한 원격 데스크톱 설정 (Windows에서 CENT OS로) (0) | 2019.08.02 |