목차 |
---|
...
1. Container 란
보통 IT인이 아니라면 ‘컨테이너’ 라는 말에 다음의 그림을 상상하실 겁니다.
...
1.1 Container
사전적 의미로 컨테이너는 어떤 물체를 격리하는 공간을 뜻합니다. 하지만 우리에게 컨테이너는 어떤 의미일까요?
...
컨테이너는 OS의 기능을 활용하여 프로세스를 격리하고, 격리된 프로세스가 CPU, 메모리, 스토리지, 네트워크 리소스를 쉽게 공유할 수 있게 해줍니다.
컨테이너는 격리된 프로세스 형태로 실행되므로 환경에 상관없이 빠르고 안정적이며 일관된 배포를 보장합니다.
1.2 VM
VM은 하이퍼바이저라는 가상화 소프트웨어 계층을 사용하여 하드웨어를 가상화하고, 각 VM을 서로 분리하여 상호작용할 수 있는 가상 컴퓨팅 환경을 구축하는 기술입니다.
VM에는 애플리케이션, 관련 라이브러리 및 종속 항목과 함께 게스트 OS가 포함됩니다.
1.3 Container와 VM 비교
가상 환경에 익숙하다면 컨테이너를 가상 머신(VM)에 비교하여 생각하면 이해하기 쉽습니다.
...
컨테이너를 사용하면 개발자와 IT 운영팀이 훨씬 작은 단위로 업무를 수행할 수 있으므로 그에 따른 이점도 많습니다.
1.4 컨테이너 살펴보기
...
정보 |
---|
|
컨테이너
컨테이너는 애플리케이션을 실행하는 데 사용될 수 있는 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로 제어할 수 있는 일반적인 리소스는 다음과 같습니다.
|
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의 등장
사용자가 컨테이너와 더 쉽게 소통할 수 있도록 컨테이너 관리하는 새로운 도구가 탄생했는데, 도커도 그 중 하나입니다.
정보 |
---|
|
2.3 OCI (Open Container Initiative)는?
컨테이너 포맷과 런타임에 대한 개방형 업계 표준을 만들기 위한 목적으로 Linux Foundation 의 지원으로 구성된 오픈 거버넌스 조직 (프로젝트)입니다.
OCI는 2015년 6월 22일에 Docker 사와 CoreOS 사가 각각 별도로 표준화를 진행하고 있던 컨테이너의 규격을 통일하는 것을 목적으로 Docker, CoreOS 그리고 AWS, Google, Microsoft, IBM 등 주요 플랫폼 벤더가 참여하여 2015 년 6 월에 발족 한 단체입니다.
=> 컨테이너 규격을 통일하는 것을 목적으로 만들어진 조직
2.4 도커를 이용한 앱 개발
...
개발 순서
코드개발
Dockerfile 생성
Dockerfile Image 생성
Container Orchestrator를 통한 배포
Container run
Container image Push
2.5 실습환경 구축 - VM 구성 테스트
정보 |
---|
이전의 모든 vagrant VM을 지우는 방법
이전의 모든 vagrant box를 지우는 방법
|
...
코드 블럭 |
---|
$mkdir -p ~/vagrant/ubuntu $cd ~/vagrant/ubuntu $vagrant init sysnet4admin/Ubuntu-k8s $vagrant up |
1. 기동 된 VM 확인
vagrant 명령어로 확인
$ vagrant box list
코드 블럭 $ 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 |
---|---|---|
|
|
|
|
|
|
3.2 컨테이너 Orchestration의 활용
컨테이너 프로비저닝 및 배포
컨테이너 구성 및 스케쥴링 조정
컨테이너 상태 모니터링 및 장애 복구
컨테이너 추가 또는 제거로 확장 및 축소
실행될 컨테이너를 기반으로 애플리케이션 설정
컨테이너 간 상호 작용의 보안 유지
...
4. 쿠버네티스
쿠버네티스는 컨테이너화된 워크로드와 서비스를 관리하기 위한 오케스트레이션 도구입니다.
4.1 쿠버네티스를 구성하는 3가지 방법
(1) 관리형 쿠버네티스
...
퍼블릭 클라우드 업체에서 제공하는 관리형 쿠버네티스
...
관리형/설치형 쿠버네티스 보다 자유롭게 구성 가능합니다.
예시: kubeadm, kops(Kubernetes operations), KRIB(Kubernetes Rebar Integrated Bootstrap), Kuberspray
4.2 쿠버네티스에서 제공하는 기능
(1)서비스 디스커버리와 로드밸런싱
쿠버네티스는 DNS 이름을 사용하거나 자체 IP 주소를 사용하여 컨테이너를 노출할 수 있습니다.
트래픽이 많아지면, 자동으로 네트워크 트래픽을 로드밸런싱하여 배포가 안정적으로 이루어질 수 있도록 합니다.
...