컨테이너와 Docker (1) - 도커 시작하기 - 도커 설치 Docker

Share

Last Updated on 1월 21, 2024 by Jade(정현호)

1. 컨테이너(Container)

OS 컨테이너 기술의 개념과 컨테이너의 특징, 개발된 역사 등에 대해서 확인해 보도록 하겠습니다.

1-1 컨테이너란

컨테이너는 소프트웨어 서비스를 실행하는 데 필요한 특정 버전의 프로그래밍 언어 런타임 및 라이브러리와 같은 종속 항목과 애플리케이션 코드를 함께 포함하는 경량 패키지입니다.

컨테이너는 운영체제 수준에서 CPU, 메모리, 스토리지, 네트워크 리소스를 쉽게 공유할 수 있게 해주며 컨테이너가 실제로 실행되는 환경에서 애플리케이션을 추상화할 수 있는 논리 패키징 메커니즘을 제공합니다.

보통이라면 컨테이너라고 하면 이러한 컨테이너 박스를 생각 하실 것입니다 IT의 컨테이너 기술은 말그대로 아래와 같은 의미를 가지고 있으며 구동되는 형태도 이와 유사 합니다.




그리고 이러한 컨테이너는 아래와 같이 아주 큰 화물선에 실려서 이동되게 됩니다. 이처럼 컨테이너란 기술은 OS 위에 다수의 여러 애플리케이션 자원을 공유하면서 구동 되는 환경을 제공하는 기술입니다. 마치 화물선을 OS 로, 화물선 위의 컨테이너 박스를 애플리케이션 컨테이너 로 보면 것 같습니다.



컨테이너는 애플리케이션을 실제 구동 환경으로부터 추상화할 수 있는 논리 패키징 메커니즘을 제공합니다. 이러한 분리를 통해 위의 이미지에서 컨테이너 박스를 내려서 다른 화물선에 그대로 옮겨 실을 수 있는 거서처럼 사설 데이터 센터나 퍼블릭 클라우드, 심지어 개발자의 개인 노트북 컴퓨터에 이르기까지 어떤 환경으로 든 컨테이너 기반 애플리케이션을 쉽게 지속적으로 배포할 수 있습니다. 

또한 컨테이너 화물 마다 안에 들은 물품이 각기 다르고 생산 또는 화물선주가 다른 것처럼 컨테이너는 각각 별개이며 통해 업무 영역을 깔끔하게 분리할 수 있습니다.(격리) 즉, 개발자는 애플리케이션의 로직과 종속 항목에 집중하고, IT 운영팀은 특정 소프트웨어 버전, 개별 앱 구성과 관련한 세부 업무에 시간을 낭비하지 않고 배포 및 관리에 집중할 수 있습니다.

1-2 컨테이너 탄생

컨테이너 기술은 2000년도에 BSD계열의 Unix 인 FreeBSD 를 통해 도입된 Jail 에서 기능이 시작되었습니다. 단어의 의미와 같이 교도소내 여러 개의 개별 감옥이 존재하고 그 감옥 안에 수용자들이 개별적으로 수감되게 되어있습니다. 그래서 다른 감옥과는 소통이나 대화가 단절되지만 교도관(Host) 와는 소통이 가능하며 이러한 모습이 지금의 우리가 알고 있는 컨테이너와 기술과 매우 닮아 있고 이처럼 FreeBSD 에서 도입된 Jail 이란 기능이 Jail 안에서 실행되는 프로세스를 격리화 하고 있습니다.


조금 더 자세하게 기술의 역사를 살펴보면 Jail 이나 컨테이너 기술 이전에 1979 년에 발표된 chroot 라는 기술로 부터 컨셉이나 의미가 시작되게 됩니다. chroot 기능은 사용자나 프로세스가 액세스 할 수 있는 디렉토리 위치를 제한하는 것으로 설정한 디렉토리를 /(루트) 로 인식되어 그 아래 디렉토리에서는 이동이 가능하지만 실제로 더 존재하는 상위 디렉토리로는 이동이 불가한 디렉토리를 제한하는 기능입니다. 이 chroot 라는 것이 사용자 또는 프로세스 마다 격리화를 하고 시스템라이브러리나 개별 라이브러리를 로드 하게 할 수 있는 기능을 제공하였습니다.


다시 2000년도 FreeBSD 로 돌아와서 2001년에는 Linux 커널에도 Linux-Vserver 라는 이름으로 기능이 추가가 되게 됩니다 2004년에 시스템 V 계열의 Solaris(솔라리스)에서 Solaris Zone 이라는 기능을 발표하게 됩니다. 


[twitter.com/bibryam/status/885221134408527872]


2006년 구글에서 Process Container 라는 지금의 cgroup 기능을 발표하고, 2008년 레드햇에서 Namespace 를 발표하게 됩니다 그리고 같은 해 2008년 IBM 에서 LXC(LinuX Containers) 를 발표를 하게되고 LXC는 cgroup 과 Namespace 를 같이 사용한 최초의 리눅스의 컨테이너 엔진입니다.

그리고 LXC(리눅스 컨테이너) 기술을 이용하여 만든 다른 컨테이너 기술로 2013년 3월에 발표된 도커(Docker)는 도커 발표되면서 지금의 컨테이너, 도커, 쿠베네티스 등과 같은 여러 기술이 많이 사용되고 발전될 수 있게 되었습니다.

1-3 리눅스 컨테이너 주요 특징

운영체제 수준의 가상화 : 컨테이너는 운영체제 수준의 가상화입니다. 별도의 하드웨어 에뮬레이트 없이 리눅스의 커널을 공유하며, 가상화 다르게 별도의 게스트 OS 가 필요하지 않습니다.

빠른 속도 와 효율성 : 가상화는 하이퍼바이저를 통해 게스트 OS가 기동 되고 게스트 OS 위에서 어플리케이션이 구동되는 반면 컨테이너는 하드웨어 에뮬레이트가 없으며 게스트 OS 없이 호스트 OS의 위에서 리눅스 커널 과 하드웨어 자원을 공유 받으면서 구동되기 때문에 일반적인 프로세스의 기동과 거의 차이가 나지 않으며 게스트 OS 가 별도로 존재하지 않기 때문에 하나의 컨테이너에서 사용하는 자원의 량이 적어 하나의 머신(OS)에서 가상화와 다르게 또는 가상화 보다 더 많은 컨테이너 프로세스를 구동 하여 사용할 수 있으며 많은 구동에 큰 부담이 없습니다. (경량화)

높은 이식성 : 모든 컨테이너는 호스트의 환경이 아닌 별도의 독자적인 실행 환경을 가지고 있습니다. 이러한 환경은 파일로 구성되며, 이미지 형식으로 쉽게 공유가 가능 하며 다른 리눅스 시스템의 실행 환경에서 손쉽게 사용이 가능 합니다.

격리성 (또는 stateless) : 컨테이너는 별도의 독립적인 환경이기 때문에 다른 컨테이너에게 영향을 주지 않아 격리성이 라는 특징을 가지고 있습니다. 
              

2. 도커(Docker)

이번에는 도커의 역사와 도커와 VM의 차이 등에 대해서 확인해 보도록 하겠습니다.
                     
.   

2-1 도커(Docker)의 역사

도커(Docker) 는 2013년 3월 Santa Clara 에서 열린 Pycon 에서 Solomon Hykes 이 발표한 The future of Linux Containers 세션을 통해 세상에 알려지게 되었습니다.

https://pyvideo.org/pycon-us-2013/the-future-of-linux-containers.html
https://www.youtube.com/watch?v=9xciauwbsuo


영상에서 환호하는 이유는 별도의 가상화 등을 이용하지 않고 아주 쉽고 빠르게 별도의 운영체제(컨테이너)에서 Hello World 를 출력하였기 때문입니다.





위에서 언급한 것과 같이 컨테이너 기술은 도커가 발표되기 이전에도 컨셉과 기능이 리눅스에서 구현 과 사용된 기술이었습니다. 다만 설정과 사용이 복잡하거나 사용 편의성 그리고 접근성이 용의하지 않아서 많은 사용을 하지 않았던 것이지요 단 Docker 가 발표된 이후 아주 손쉽게 컨테이너를 사용, 관리, 배포할 수 있게 되고 또한 Docker Hub 사이트를 통해 좋고 유용한 아주 다양한 도커 컨테이너 이미지가 배포되고 공유 되다보니 더욱더 도커 사용이 늘어 날수 밖에 없는 생태계가 구성되게 됩니다.

그전에 서버, 네트워크(IP), 미들웨어(또는 어플리케이션 서버) , DB 등과 같은 분야는 인프라 전문 담당자(엔지니어)가 담당하고 준비되었던 과정이 컨테이너에 의해 간소화, 간편화 그리고 손쉬워지고 편리성이 높아지다 보니 개발자도 실질적으로 사용이 늘어나고 DevOps 라는 새로운 IT 직군 또는 개념이 나오게도 되었다고 생각 합니다.
              

2-2 도커 vs 가상화(Virtual Machine)

도커(Docker) 와 가상화(Virtual Machine - VM) 간의 비교는 많은 곳에서도 나와 있는 내용이며 사실 정확하게는 Container VS VM 보는 것이 맞긴 합니다 해당 부분은 컨테이너(또는 도커 ) VS VM 에 대한 설명으로 보시면 될 것 같습니다


가상화는 하이퍼바이저 라고 하는 소프트웨어 기술을 통해서 가상화가 구현되는 기능으로 VM 별로 격리된 전용 리소스를 할당 받아 구동되게 됩니다. VM은 물리 서버처럼 보이면서 동작하며 하나의 호스트 머신내에 각자의 리소스를 할당 받아 호스트 머신의 자원의 한정내에서 다수의 게스트 시스템을 동작하게 합니다.

이런 가상화의 종류에는 크게 호스트형(Hosted) 가상화 와 하이퍼바이저 가상화로 나눌 수 있습니다. 표현에 따라서 호스트 하이퍼바이저 그리고 베어메탈 하이퍼바이저 로 표현할 수 있습니다.


아래 그림1) 의 경우 호스트형 가상화 또는 호스트 하이퍼바이저를 사용하였을 때의 형상입니다. Host OS 시스템 위에서 동작하는 가상화 시스템으로 보통적으로 많이 사용되는 하이퍼바이저가 VirtualBox 와 VMWare WorkStation 이 이에 해당합니다

그림2) 의 경우가 시스템(서버) 위에 바로 가상화 시스템이 구성되어 있는 베어메탈 하이퍼바이저로 별도의 OS 없이 하이퍼바이저 자체가 OS의 역할과 가상화의 기능을 직접 수행하게 되며 이러한 가상화로는 XENServer , VMWare EXSi, Windows Server의 hyper-v 가 대표적인 제품입니다.

도커(컨테이너) 와 VM의 차이의 경우 먼저 당연하게 보이는 구성된 Layer 구조에서 차이가 확인이 됩니다.


그림1) 

[redhat.com/ko/topics/containers/containers-vs-vms]



그림2) 

[docker.com/blog/containers-replacing-virtual-machines]



• 도커(컨테이너) 의 장점

VM 은 하이퍼바이저가 존재하고 하이퍼바이저 위에 게스트 OS 가 구성, 구동 되며 그에 따른 필요한 시스템 라이브러리 등도 구동이 되며 최종적으로 사용자가 구성한 어플리케이션 과 프로그램이 동작하게 되는 방식입니다.

도커(컨테이너)는 호스트 위에 컨테이너 엔진(도커 엔진) 을 통해서 바로 어플리케이션과 어플리케이션에서 필요로 하는 파일 과 라이브러리 등을 패키징화 해서 바로 사용할 수 있는 개념으로 VM 에 비해서 Layer 단계가 적으며 VM 에 비해 호스트 OS에서 소모되는 자원이 적습니다. VM은 각각 게스트 OS 를 구동해야 하기 때문에 게스트 OS 구동에 따른 리소스 소모가 컨테이너에 비해 많을 수밖에 없습니다.




도커(컨테이너) 가 VM 에 비해 더 빠릅니다. 일단 IO 측면에서 봐도 IO 를 하기 까지의 거쳐야 하는 통로 또는 레이어 층이 컨테이너에 비해 많습니다. VM 은 호스트OS 와 그리도 다른 VM과 분리된 형태, 즉 격리화는 되어있지만 IO나 네트워킹을 사용할 때에는 결국 하이퍼바이저 와 호스트OS 를 거쳐 가게 될 수밖에 없습니다.
(물론 이부분에서 베어메탈 하이퍼바이저가 호스트 하이퍼바이저에 비해 좋기는 합니다.)

그리고 위에서 언급한 것처럼 게스트 OS 도 별도의 자원을 가지고 사용하고 있으며 그에 따라서 게스트 OS 에 대한 리소스 소모(CPU , IO) 가 같이 발생되게 됩니다.

배포, 공유의 경우도 VM의 경우 다른 시스템에 배포 또는 다른 사용자와 공유하기 위해서는 많은 용량을 주고받아야 합니다. 용량이 크고 그에 따라서 도커에 비해 많은 여러 형태의 이미지의 배포나 공유의 수가 적을 수밖에 없습니다. 또한 용량이 크다보니 다른 시스템에 전송하거나 다운로드 받을 때도 시간이 소요되게 됩니다. 그리고 이렇게 공유 받은 후에도 상황에 따라서 VM 구동 후 네트워크 등을 다시 사용자가 설정 변경이 필요한 경우도 있습니다. 

하지만 도커(컨테이너) 이미지는 이식성이 매우 뛰어나며 Docker hub 를 통해 수많은 이미지가 이미 공유되어 있고 용량이 작기 때문에 아주 빠른 시간안에 다운로드 및 run 을 할수 있으며 도커의 설정과 run 의 옵션에 따라서 네트워크 설정 등도 시스템 상황에 맞게 구동 할 수 있습니다.

버전 관리나 버전업이 더욱 쉽습니다 변경된 사항에 대해서 버전관리를 하면 되며 테스트 및 개발이 완료된 어플리케이션이기 때문에 이미지 변경만 하면 적용도 쉽게 되고 직관적으로 버전에 대한 변경도 확인할 수 있으며 여러 서버, 여러 컨테이너에 대해서도 관리할 수 있는, 즉 이러한 일들을 더욱 쉽고 편리하게 할 수 있는 훌륭한 오케활용하여 인 쿠베네티스를 활용하여 다수의 서버에 다수의 컨테이너가 관리되고 있습니다.


• VM(VirtualMachine) 의 장점

상황에 따라서 VM이 필요한 경우도 많이 있습니다. 1개의 VM내에 다수의 어플리케이션을 설치해서 연동하여 사용하거나 유기적으로 구동하여 사용하거나, 일반적인 서버 자체가 필요한 경우도 다수 상황에서 존재합니다.


컨테이너는 경량화를 위해 해당 어플리케이션을 위한 구동을 위해 필요한 파일과 라이브러리를 담고 있습니다 그런 컨테이너 이미지에 여러 라이브러리, 패키지, 데몬, 유틸리티 등의 사용 필요성이 있을 수 있습니다. 다중의 목적의 다수의 라이브러리나 패키지가 설치해야 하거나 여러 데몬과 유틸리티가 필요할 경우 컨테이너 경량화 맞지 않으며 이러한 상황의 경우도 컨테이너 보다는 VM 이 더 맞을 것 같습니다.


또한 리눅스 도커(컨테이너) 환경에서는 윈도우 환경의 컨테이너를 구동할 수 없습니다. 컨테이너는 호스트OS 를 기반으로 하여 리소스와 드라이버를 공유해서 사용하기 때문에 윈도우 컨테이너는 윈도우 호스트 OS 환경에서만 가능 합니다. 그렇기 때문에 상황에 따라서 윈도우 환경이 필요할 경우 호스트가 리눅스이거나 또는 XEN Server 하이퍼바이저를 사용하더라도 윈도우 게스트OS 를 구동하는데는 아무런 제약이 없습니다. 이렇게 멀티 OS 가 필요한 경우에도 VM를 사용해야 합니다.

그래서 결론적으로는 상황에 맞게 쓰임에 맞게 적절하게 사용하는 것이 중요할 것 같습니다.
      

2-3 도커(Docker) 설치

도커(Docker) 설치를 진행하도록 하겠으며 설치하는 환경은 아래와 같습니다.

VM : VirtualBox
OS : CentOS 7.9 / Ubuntu 20.04
User : devops (설치시 생성)
hostname : docker1, docker2 (2대 구성)
Network : nat , host-only

* OS 설치 이후 부터 내용 부터 기술되어 있습니다.
* devops 계정명은 포스팅에서의 예시 계정명 입니다.


[참고] 도커는 CE 버전 과 EE 버전으로 나뉘게 됩니다.

CE - Community Edition 으로 무료 오픈 소스입니다.

EE - Enterprise Edition 으로 기술지원을 받을 수 있는 상용 버전입니다.
    기술지원 이외 2가지 기능을 더 제공되고 있습니다.
    UCP (Universal Control Plane): container applications management
    DTR (Docker Trusted Registry): image management


2-3-1 기본 패키지 설치 및 구성

도커 설치를 위해 패키지 Repository 추가가 필요하며 그외 추가적인 패키지 설치 및 계정 작업을 같이 진행하도록 하겠습니다
CentOS 는 root 유저로, Ubuntu 는 일반 유저로 진행하였습니다.

•CentOS

-- 기본 필요 패키지 설치
~]# yum install bash-completion \
rsync git vim net-tools tree bridge-utils


-- 일반 계정인 devops 계정에 sudo 권한 추가
~]# echo "devops ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/devops-users


-- 커널 파라미터 일부 설정
~]# sysctl -w net.ipv4.ip_forward=1
~]# sysctl -w vm.swappiness=1

~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.d/docker.conf
~]# echo "vm.swappiness=1" >> /etc/sysctl.d/docker.conf


•Ubuntu(일반 유저로 진행시)

-- 패키지 설치
sudo apt install bash-completion \
rsync git vim ifupdown tree bridge-utils \
software-properties-common build-essential \
zip unzip rsyslog rdate cmake nano \
iputils-ping net-tools ca-certificates \
curl gnupg lsb-release


-- 일반 계정인 devops 계정에 sudo 권한 추가
-- devops-users 파일에 아래 내용을 vi 편집기나 nano 편집기를 통해서 입력 합니다.
sudo vi /etc/sudoers.d/devops-users

# 아래 내용 입력
devops ALL=(ALL) NOPASSWD:ALL


-- 커널 파라미터 일부 설정
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w vm.swappiness=1

-- docker.conf 파일에 아래 2개 커널 파라미터 내용을 vi 나 nano 편집기를 통해서 입력
sudo vi /etc/sysctl.d/docker.conf

net.ipv4.ip_forward=1
vm.swappiness=1



2-3-2 Repository 구성 및 설치

Repository 를 구성 및 도커를 설치합니다.

• CentOS

## Repository 구성
~]$ sudo yum install -y yum-utils
~]$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo


## Docker 설치
~]$ sudo yum -y install docker-ce docker-ce-cli containerd.io


• Ubuntu

-- Add Docker’s official GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null


-- 패키지 정보 업데이트 및 docker 섫치
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io



2-3-3 활성화 및 시작

도커 서비스의 활성화 및 시작합니다.

## 도커 활성화 및 실행
~]$ sudo systemctl enable docker
~]$ sudo systemctl start docker



2-3-4 docker group 에 추가

추가로 일반 계정인 devops 에서도 docker 를 컨트롤 할 수 있도록 docker 그룹에 추가를 합니다. docker 그룹을 부여하면 일반 계정인 devops 에서도 docker 를 시작, 중지, 삭제 등 모든 docker 컨트롤이 가능해집니다.

일반 계정으로 사용하려고 할 때 아직 일반 유저가 생성되어 있지 않은 경우 아래 내용을 참조하여 유저 생성 과 docker group 추가를 한 번에 할 수 있습니다.

• CentOS 에서 유저 생성

-- 그룹 생성
~]# groupadd devops

-- 유저생성 생성
~]# useradd -g devops -G docker devops

-- 패스워드 지정
~]# passwd devops
Changing password for user devops.
New password: [패스워드 입력]
Retype new password: [패스워드 입력]
passwd: all authentication tokens updated successfully.


•Ubuntu 에서 유저 생성

sudo adduser devops
sudo usermod -G docker devops


기존에 생성된 일반 유저에 docker group 추가를 하려고 할 때는 아래와 같이 수행하면 됩니다.

[root]# gpasswd -a devops docker



2-3-5 hello-world 시작


도커의 설치 확인 및 기동을 확인하기 위하여 기본적인 컨테이너 구동을 테스트하도록 하겠습니다.

참고로 도커 컨테이너 이미지는 아래 공식 hub 사이트에서 검색 및 여러 정보를 확인할 수 있습니다.


일반 계정인 devops 를 통해서 컨테이너를 기동하도록 하겠습니다.

## 유저 변경
[root]# su - devops

## hello-world 이미지 기동
devops]$ docker run hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete 
Digest: sha256:9f6ad537c5132bcce57f7a0a20e317228d382c3cd61edae14650eec68b2b345c
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/



기본적인 hello-world 도커 컨테이너 기동까지 확인해보았습니다.
다음 포스팅에서 이어서 진행하도록 하겠습니다.
      

3. Reference

Reference Link

docs.docker.com/install/centos [Link]
pyvideo.org/the-future-of-linux-containers [Link]

docker.com/containers-replacing-virtual-machines [Link]
opennaru.com/history-of-the-container [Link]
https://naleejang.tistory.com/228 [Link]
https://ooeunz.tistory.com/61 [Link]
redhat.com/whats-a-linux-container [Link]
redhat.com/containers-vs-vms [Link]
44bits.io/linux-container [Link]
cloud.google.com/containers [Link]
cloud.google.com/what-are-containers [Link]


이어지는 글




연관된 다른 글

 

 

 

 



9
0
글에 대한 당신의 생각을 기다립니다. 댓글 의견 주세요!x