버전 비교

  • 이 줄이 추가되었습니다.
  • 이 줄이 삭제되었습니다.
  • 서식이 변경되었습니다.
목차

...

1. Container 란

보통 IT인이 아니라면 ‘컨테이너’ 라는 말에 다음의 그림을 상상하실 겁니다.

...

1.1 Container

사전적 의미로 컨테이너는 어떤 물체를 격리하는 공간을 뜻합니다. 하지만 우리에게 컨테이너는 어떤 의미일까요?

...

  • 컨테이너는 OS의 기능을 활용하여 프로세스를 격리하고, 격리된 프로세스가 CPU, 메모리, 스토리지, 네트워크 리소스를 쉽게 공유할 수 있게 해줍니다.

  • 컨테이너는 격리된 프로세스 형태로 실행되므로 환경에 상관없이 빠르고 안정적이며 일관된 배포를 보장합니다.

1.2 VM

  • VM은 하이퍼바이저라는 가상화 소프트웨어 계층을 사용하여 하드웨어를 가상화하고, 각 VM을 서로 분리하여 상호작용할 수 있는 가상 컴퓨팅 환경을 구축하는 기술입니다.

  • VM에는 애플리케이션, 관련 라이브러리 및 종속 항목과 함께 게스트 OS가 포함됩니다.

1.3 Container와 VM 비교

가상 환경에 익숙하다면 컨테이너를 가상 머신(VM)에 비교하여 생각하면 이해하기 쉽습니다.

...

컨테이너를 사용하면 개발자와 IT 운영팀이 훨씬 작은 단위로 업무를 수행할 수 있으므로 그에 따른 이점도 많습니다.

1.4 컨테이너 살펴보기

...

 

정보
  • Control groups : 리소스 사용량(CPU/Memory/Network/Storage) 결정

  • Namespaces : 자원을 격리(네트워크/프로세스/사용자정보 - 공개 범위를 결정)

  • Union mount file system : 컨테이너 이미지를 효율적으로 관리

컨테이너

컨테이너는 애플리케이션을 실행하는 데 사용될 수 있는 OS 가상화의 한 형태입니다

이를 위해 컨테이너는 리눅스 커널의 몇 가지 새로운 기능으로 제작되었으며, 그 중 두 가지 주요 기능은 "namespace"와 "cgroups"입니다.

리눅스 네임스페이스

네임스페이스는 리눅스 커널의 기능 중 하나이며 리눅스의 컨테이너의 기본적인 측면입니다.반면에 네임스페이스는 격리 계층을 제공합니다.네임스페이스는 한 프로세스 집합은 한 리소스 집합을 보고 다른 프로세스 집합은 다른 리소스 집합을 보도록 커널 리소스를 분할하는 리눅스 커널의 기능입니다.

...

코드 블럭
root@ubuntu-focal:~# exit
exit
root@ubuntu-focal:~# ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.8 102540  8840 ?        Ss   12:04   0:02 /sbin/init
root           2  0.0  0.0      0     0 ?        S    12:04   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   12:04   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   12:04   0:00 [rcu_par_gp]
root           6  0.0  0.0      0     0 ?        I<   12:04   0:00 [kworker/0:0H-kblockd]

Cgroup

리눅스 네임스페이스로 다른 프로세스와는 별도의 프로세스를 만들 수도 있었습니다.

...

정보

cgroups로 제어할 수 있는 일반적인 리소스는 다음과 같습니다.

  • CPU: 프로세스 그룹에서 사용하는 CPU 시간을 제한

  • 메모리: 프로세스 그룹에서 사용하는 메모리 양을 제한합니다.

  • I/O: 프로세스 그룹에서 사용하는 Disk I/O 양 제한

  • 네트워크: 프로세스 그룹에서 사용하는 네트워크 대역폭의 양을 제한합니다.

1.5 컨테이너의 장점

(1) 가벼움

  • 사용자의 Request Traffic 이 증가함에 따라, 가상머신이나 컨테이너를 추가적으로 배포합니다.

  • 가상머신의 크기는 최소 몇 GB이지만, 컨테이너의 경우 Guest OS가 없기에 MB단위의 크기를 가집니다.

  • 가상머신은 배포하는데 수분에서 수 십분의 시간이 소요되지만, 컨테이너는 배포에 소요되는 몇 초 밖에 걸리지 않습니다.

...

컨테이너는 격리된 환경에서 실행되기 때문에, 한 컨테이너에서 발생한 보안/장애 문제가 다른 컨테이너나 호스트 운영체제에 영향을 미치지 않습니다.

...

2. Docker

개발자와 시스템 관리자가 컨테이너로 애플리케이션을 개발, 배포 및 실행할 수 있는 플랫폼입니다.

...

2.1 도커 주요 컴포넌트

  • docker engine
    여러분 모두가 아는 그 엔진, 이 엔진

  • containerd / dockerd /cri-o
    container 런타임

  • runc
    Open Container Initiative (OCI) 규격에 맞게 컨테이너를 실행하고 생성하는 CLI 도구

...

정보

다음과 같은 기능을 제공합니다.

  • 컨테이너 레지스트리에서 컨테이너 이미지를 다운로드합니다.

  • 컨테이너 이미지를 관리합니다.

  • 컨테이너 이미지에서 컨테이너를 실행합니다.

  • 컨테이너 관리.

2.2 Docker의 등장

사용자가 컨테이너와 더 쉽게 소통할 수 있도록 컨테이너 관리하는 새로운 도구가 탄생했는데, 도커도 그 중 하나입니다.

정보
  • 이미지 빌드(도커 파일/도커 빌드).

  • 컨테이너 이미지(도커 이미지)를 관리합니다.

  • 컨테이너 생성, 삭제 및 관리

  • 컨테이너 이미지 공유

  • CLI를 사용하지 않고 사용자가 조작할 수 있는 UI를 제공합니다.

2.3 OCI (Open Container Initiative)는?

  • 컨테이너 포맷과 런타임에 대한 개방형 업계 표준을 만들기 위한 목적으로 Linux Foundation 의 지원으로 구성된 오픈 거버넌스 조직 (프로젝트)입니다.

  • OCI는 2015년 6월 22일에 Docker 사와  CoreOS 사가 각각 별도로 표준화를 진행하고 있던 컨테이너의 규격을 통일하는 것을 목적으로 Docker, CoreOS 그리고  AWS, Google, Microsoft, IBM 등 주요 플랫폼 벤더가 참여하여 2015 년 6 월에 발족 한 단체입니다.

=> 컨테이너 규격을 통일하는 것을 목적으로 만들어진 조직

2.4 도커를 이용한 앱 개발

...

개발 순서

  1. 코드개발

  2. Dockerfile 생성

  3. Dockerfile Image 생성

  4. Container Orchestrator를 통한 배포

  5. Container run

  6. Container image Push

2.5 실습환경 구축 - VM 구성 테스트

정보

이전의 모든 vagrant VM을 지우는 방법

$ vagrant global-status | grep virtualbox | awk '{ print "vagrant destroy -f " $1}' | sh -v

이전의 모든 vagrant box를 지우는 방법

$ vagrant box list | grep virtualbox | awk '{ print "vagrant box remove -f "$1}' | sh -v

...

코드 블럭
$mkdir -p ~/vagrant/ubuntu
$cd ~/vagrant/ubuntu 
$vagrant init sysnet4admin/Ubuntu-k8s
$vagrant up

1. 기동 된 VM 확인

  1. vagrant 명령어로 확인

    1. $ vagrant box list

      image-20240514-034351.png
    2. 코드 블럭
      $ vagrant ssh default
      Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.19.0-28-generic x86_64)
      
       * Documentation:  https://help.ubuntu.com
       * Management:     https://landscape.canonical.com
       * Support:        https://ubuntu.com/advantage
      
       * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
         just raised the bar for easy, resilient and secure K8s cluster deployment.
      
         https://ubuntu.com/engage/secure-kubernetes-at-the-edge
      
      Last login: Sat Mar 20 18:04:46 2021 from 10.0.2.2
      vagrant@k8s:~$


      Docker 기본 명령어에 대해 알아보는 시간을 가지도록 하겠습니다.

2. Image 가져오기

docker image 저장소

...

: 기본 개념에서와 같이 도커는 저장소(registry)에서 이미지를 가져와 사용을 합니다.

...

코드 블럭
# tag를 지정해주지 않으면 default로 latest 버전을 가져옵니다.
# tag를 지정할 경우 
# docker pull nginx:latest 
# 위의 명령어 대로 pull 가능
root@ubuntu-focal:~# docker pull nginx:latest
latest: Pulling from library/nginx
52d2b7f179e3: Pull complete
fd9f026c6310: Pull complete
055fa98b4363: Pull complete
96576293dd29: Pull complete
a7c4092be904: Pull complete
e3b6889c8954: Pull complete
da761d9a302b: Pull complete
Digest: sha256:104c7c5c54f2685f0f46f3be607ce60da7085da3eaa5ad22d3d9f01594295e9c
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
# 이미지 확인
root@ubuntu-focal:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    eea7b3dcba7e   2 weeks ago   187MB

이미지를 가져왔으니 이제 실행시켜봐야죠!

 

...

 

3. Run Container

docker ps

코드 블럭
# docker ps 라는 명령어로 현재 실행중인 컨테이너를 확인합니다.
# docker ps -a -> 중지된 컨테이너까지 모두 출력
root@ubuntu-focal:~# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

...

잘 뜨네요. 기쁩니다.

컨테이너를 실행했으니 내부로 들어가 봅시다.

4. Container 내부탐험

$ docker exec

root@ubuntu-focal:~# docker exec -it nginx /bin/bash

...

코드 블럭
# 내부장벽진입
root@ubuntu-focal:~# docker exec -it nginx /bin/bash
root@1303feec1720:/#
# 진입완료
# 컨테이너의 hostname을 알아봅시다 
root@1303feec1720:/# hostname
1303feec1720
root@1303feec1720:/# cat /etc/issue
Debian GNU/Linux 12 \n \l
root@57c8f50ce8c5:/# 
# Shell을 빠져나오려면 Ctrl + D 혹은 exit를 입력합니다.
# 혹시docker를 daemon으로 설치하지 않고, 아래와같이 bash로 들어갔다면 
root@ubuntu-focal:~# docker run -it  -p 8090:80 --name=nginx80999 nginx:latest bash
# exit로 나왔을 경우 container 도 쉘 종료메세지(exit 0)을 받고 자연스럽게 종료 되기때문에 docker start [컨테이더 ID ] 명령어로 재시작 혹은 ctrl+ pq 로 실행을 유지한 채 터미널로 빠져 나올 수 있습니다.

6. Image 삭제

: 보통은 이미지를 삭제하기 전 컨테이너를 먼저 삭제한 후 진행됩니다.

...

코드 블럭
root@ubuntu-focal:~# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: dncs0725
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded

 

6. Dockerfile 만들기

도커를 설치하고 컨테이너를 실행해봤으니 이제는 도커 이미지를 만들고 서버에 배포해볼 차례!

...

이 밖에 사용되는 ENV VOLUME 같은 명령어는 공식문서 를 참고 바랍니다

7. Build 하기

코드 블럭
docker build --force-rm --tag mynginx:0.1 .

...

여기서 이미지를 저장소에 업로드할때 ‘push’ 명령어를 사용하고, 각 서버에서 저장소에 올려져있는 이미지를 가져올때 ‘pull’이라는 명령어를 사용합니다.
저번시간에 tag에 대하여 스르륵 지나갔었는데 이미지 이야기를 하는김에 같이 다뤄보도록 하겠습니다.

8. 이미지 태그에 관하여

‘docker tag <옵션> <이미지 이름>:<태그> <저장소 주소, 사용자명>/<이미지이름>:<태그>’ 굉장히 복잡해 보입니다…

...

코드 블럭
root@ubuntu-focal:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
mynginx      0.1       03de8991a4f8   11 minutes ago   178MB
ubuntu       20.04     6df894023726   5 weeks ago      72.8MB
root@ubuntu-focal:~# docker tag mynginx:0.1 mynginx:0.2
root@ubuntu-focal:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
mynginx      0.1       03de8991a4f8   12 minutes ago   178MB
mynginx      0.2       03de8991a4f8   12 minutes ago   178MB
ubuntu       20.04     6df894023726   5 weeks ago      72.8MB
root@ubuntu-focal:~#

 

...

3. 컨테이너 Orchestration

Container Orchestration은 애플리케이션을 구성하고 있는 수십 또는 수백 개의 컨테이너와 호스트들을 배포하고 관리하기 위한 도구입니다.

컨테이너 Orchestration은 어떤 환경에서든 사용할 수 있으며, 재설계할 필요 없이 각기 다른 환경 전반에 동일한 애플리케이션을 배포하는데 도움이 됩니다.

3.1 컨테이너 Orchestration 종류

Kubernetes

Docker Swarm

Apache Mesos

  • 구글에 의해 개발된 오픈 소스 프로젝트로 가장 널리 사용되고 있는 오케스트레이션 툴

  • Docker가 공식적으로 만든 오케스트레이션 툴

  • Apache 재단에서 발표된 오픈 소스 프로젝트

  • 컨테이너의 롤링 업그레이드 지원

  • 여러 Host를 묶어 클러스터 구성 및 배포, 자동 복구 지원

  • 컨테이너 추가, 복제, 업데이트, 롤백 지원

  • 베어메탈, VM환경, 퍼블릭 클라우드 등의 다양한 환경에서 작동

  • 호스트 OS에 Agent만 설치하면 간단하게 작동하고 설정이 쉬움

  • Docker 명령어와 Compose를 그대로 사용 가능

  • 수만 대의 물리적 시스템으로 확장할 수 있도록 설계됐으며, 대형 스케일 클러스터에 적합한 도구

  • 하둡, MPI, Hypertable, Spark 같은 응용프로그램을 동적 클러스터 환경에서 리소스 공유와 분리를 통해 최적화 가능

  • Docker 컨테이너를 적극적으로 지원

3.2 컨테이너 Orchestration의 활용

  • 컨테이너 프로비저닝 및 배포

  • 컨테이너 구성 및 스케쥴링 조정

  • 컨테이너 상태 모니터링 및 장애 복구

  • 컨테이너 추가 또는 제거로 확장 및 축소

  • 실행될 컨테이너를 기반으로 애플리케이션 설정

  • 컨테이너 간 상호 작용의 보안 유지

...

4. 쿠버네티스

쿠버네티스는 컨테이너화된 워크로드와 서비스를 관리하기 위한 오케스트레이션 도구입니다.

4.1 쿠버네티스를 구성하는 3가지 방법

(1) 관리형 쿠버네티스

...

퍼블릭 클라우드 업체에서 제공하는 관리형 쿠버네티스

...

  • 관리형/설치형 쿠버네티스 보다 자유롭게 구성 가능합니다.

  • 예시: kubeadm, kops(Kubernetes operations), KRIB(Kubernetes Rebar Integrated Bootstrap), Kuberspray

4.2 쿠버네티스에서 제공하는 기능

(1)서비스 디스커버리와 로드밸런싱

  • 쿠버네티스는 DNS 이름을 사용하거나 자체 IP 주소를 사용하여 컨테이너를 노출할 수 있습니다.

  • 트래픽이 많아지면, 자동으로 네트워크 트래픽을 로드밸런싱하여 배포가 안정적으로 이루어질 수 있도록 합니다.

...