[WebDevCurriculum] 도커/컨테이너

개요

Cotainer 기술과 Docker 프로그램에 대해 이해한다.

Checklist

  • 컨테이너는 어떻게 동작하나요?

Docker에서 동작할 프로그램을 이미지화(추상화)하면, OS Kernel을 추상화한 분리된 프로세스(Container)에서 해당 프로그램을 동작한다.

  • 다른 배포판(운영체제 환경)을 사용할 수 있게 하는 원리가 무엇일까요?

Container 런타임 환경을 제공하는 OS(리눅스나 WSL이 설치된 윈도우 등)가 있다면, 어떤 장치에서든 Docker 및 해당 추상화된 프로그램을 실행할 수 있다.

Docker의 Container는 Host OS에 연결하는 것이 아니라, 해당 시스템의 프로세스를 분리하고 이 환경에서 실행되므로 OS와 상관없이 실행이 가능하다.

다만 플랫폼 간 차이는 있기 때문에, 리눅스에서 만든 실행파일을 윈도우에서 실행할 수는 없다. 그 반대도 마찬가지이다.

  • 도커 컨테이너에 호스트의 파일시스템이나 네트워크 포트를 연결하려면 어떻게 해야 할까요?

컨테이너 생성

docker run -i -t docker_image_name

host 연결

docker run -d -p OS_port:container_server_port
  • 도커 컨테이너에서 런타임에 환경변수를 주입하려면 어떻게 해야 할까요?

Container를 생성할때 환경변수를 넣어주거나, 별도의 파일을 담아 설정해줄 수 있다.

option

-e : Runtime할 때 환경변수 직접 지정
--env-file : 환경변수가 담겨져 있는 파일로 환경변수 등록

docker run -e env_variable=value_variable
  • 도커 컨테이너의 stdout 로그를 보려면 어떻게 해야 할까요?

streaming

container의 스트리밍을 지속 감지한다.

docker logs --follow container

tail

docker logs --tail {the_number_of_stdout_lines} container
  • 실행중인 도커 컨테이너에 들어가 bash 등의 쉘을 실행하고 로그 등을 보려면 어떻게 해야 할까요?

attach

container의 root process에 console 접근

docker attach container_ID

exec

container의 특정 환경을 통한 접속(접근)

docker exec -it container_ID /bin/bash(script_environment)

참조개념

  • 가상화

물리적인 컴퓨터 자원을 논리적인 객체로 표현하는 기술을 말한다.

하나의 하드웨어를 여러 하드웨어가 있는 것처럼 표현(동작)할 수도 있고, 여러 하드웨어를 하나의 하드웨어처럼 묶어서 표현(동작)할 수도 있다.

  • 가상화 등장 배경

CPU, memory, server, storage, DB 등 한정된 하드웨어 자원을 효율적으로 사용하기 위한 방안으로 등장하였다.

기존의 시스템 자원과 server는 반드시 물리적인 장치를 필요로 하였는데, 사용자 수요가 늘어나면 이에 대응하여 장치를 추가적으로 구성해주어야 했다.

즉 기존에는 하드웨어의 성능이 좋아져도, 하나의 물리적인 장치(server 등과 같은 하드웨어)가 하나의 어플리케이션(사용자)에 1:1 대응하여 요청을 처리하는 비효율적인 상황이 발생하였다.

이러한 비효율적인 문제를 해결할 방안으로 가상화(Virtual Interface Solution)가 등장하게 되었고, 이후 별도 물리장치의 추가없이 기존 자원을 공유하면서 사용자 수요에 대응할 수 있게 되었다.

물리적인 저장소나 자원의 가상화를 통해 자원을 절약하고, 효율적으로 데이터 처리를 할 수 있게 되었다(적은 리소스로 많은 데이터(사용자)를 대응 가능).

  • 가상화의 종류와 발전과정

컴퓨팅 가상화

컴퓨터 자원(하드웨어)을 가상화하여 논리객체로 이용하는 기술로, 하나의 체계(컴퓨터)에서 논리화된 자원을 사용하는 가상화 방법이다.

여러 대의 컴퓨터(OS, 운영체제)가 있는 효과를 볼 수 있는데, 이때 이 컴퓨터를 가상머신(Virtual Machine)이라 한다.

가상머신은 추상화된 객체라고 표현하기도 하며, 보통 여러 가상머신에 독립적인 어플리케이션들을 실행한다.

컴퓨팅 가상화 - Hypervisor Architecture

초월하여(Hyper) 덮는다(visor), 즉 HW level을 논리 객체로 만든 후 실제 자원에 덮는 방식의 가상화이다.

일단 컴퓨팅 가상화는 하드웨어(컴퓨터 자원)의 추상화에서 시작한다.

이 추상화 객체, 가상머신이라고도 불리우는 이 layer는 소프트웨어의 일종이며 별도의 설치가 필요하다.

이 layer를 통해 실제 시스템 자원을 덮는 layer 형태로 표현할 수 있고, 실제 직접적으로 접근이 가능하기 때문에 자원활용 및 시스템 확장에 용이하다.

컴퓨팅 가상화 - Host/Guest(Hosted) Architecture

주인을 맡다(Hosted), 실제 자원(Host Environment)에 대해 가상머신(Virtual layer)을 덮고 Guest처럼 주인의 자원을 활용하는(=빌려쓰는) 방식의 가상화이다.

Hypervisor 형식과는 다르게 추상화 객체가 실제 하드웨어가 아닌, OS(운영체제)이다.

시스템 자원에 직접적으로 접근할 수는 없기 때문에, 직접 접근을 하기 위해선 실제 운영체제를 통해 해야한다.

즉 실제 구동부는 Host 운영체제 하나이고, Hosted, Guest Environment라 불리는 이유이다.

Docker, Container의 배경

컴퓨팅 가상화의 가장 큰 단점은 용량이다.

가상머신의 용량은 GB급인데, 컴퓨터 자체적으로 메모리를 활용하기 위해 필요한 공간이 4GB이기 때문이다.

큰 용량문제로 소프트웨어 업데이트, CI/CD의 기술적 한계 등의 문제가 지적되었고, 이를 해결하기 위한 작고 가벼운 가상환경을 고민하게 되었다.

또한 가상머신은 운영체제의 인스턴스(추상화 객체)를 어플리케이션에 할당하는 방식으로 환경분리를 구현하지만, 인스턴스에 상당한 메모리와 이를 가동하기 위해 많은 프로세싱이 소모된다.

Container

이러한 배경으로 탄생한 것이 Container 기술이다.

Container라는 분리된 가상환경을 활용하는 것인데, 가상머신의 추상화된 OS인스턴스보다 훨씬 가볍고 작은 환경에서 어플리케이션 실행을 분리할 수 있다.

Container는 MB급 환경에서 운영체제 커널을 공유하므로 가상 머신보다 실제 리소스를 적게 활용할 수 있고, 이를 기반으로 적은 리소스와 비용으로도 공유/확장이 용이하다는 장점이 있다.

컴퓨팅 가상화가 어플리케이션에 추상화된 자원객체(VM)를 할당해주는 방식이라면, Docker Container는 어플리케이션이 자원으로 부터 분리된 세그먼트를 사용한다.

따라서 Container를 이용하면, 기존 운영체제를 최소한으로 공유받으면서 분리된 환경(프로세스)에서 어플리케이션을 실행하고 이와 동시에 사용자는 운영체제를 운영할 수 있다.

쉽게 말하면 운영체제와 어플리케이션을 분리한 환경을 구성하므로, 운영체제에서 Container를 지원한다면 해당 환경을 그대로 옮기는 것(확장)도 가능하다.

※ Container는 기본적으로 리눅스 Kernel 환경을 이용하는 기술이고, Window의 경우 WSL을 설치해야 한다.

Docker

Docker는 리눅스 Container 기술을 발표한 Solomon Hykes가 Container 기술에 집중하게 되면서 만든 회사이자 소프트웨어이다.

컨테이너 기반의 가상화 플랫폼으로, 어플리케이션을 추상화하여 Docker의 Container에서 실행될 수 있도록 해주는 기능을 제공한다.

Docker의 가장 큰 장점이자 강력한 기능은 Docker를 통해 어플리케이션을 추상화하는 과정에 대한 인터페이스가 일관되기 때문에, 프로그램의 개발 및 빌드 등을 단순화하고 자동화할 수 있다는 점에 있다.

어플리케이션이 Docker에 의해 추상화되면 이미지파일(Docker image)로 변환되는 것이고, 이때 각 Container들은 자원을 공유받아 마치 하나의 운영체제(OS)처럼 동작한다.

기존 가상화와의 차이점

Docker는 리눅스 Container를 효과적으로 사용하기 위해 개발된 소프트웨어 프로그램이다.

쉽고 빠르게 Container에서 실행할 Docker image(추상화) 작업을 진행할 수 있고, 그만큼 프로그램의 간단한 배포, 복제, 빌드 등이 가능해진다.

또한 Container 간 동작을 조율할 수 있고, 서로 연결하는 등 기존 리눅스 Container 기술을 더 발전시킨 기능을 제공한다.

  • 리눅스 Container의 등장

우리가 알고있는 기존 가상화 개념(VMWare)들은 보통 Host OS 가상화를 지칭한다.

이때 VMWare의 용량이나 Guest OS의 누적 등으로 인한 시스템 과부하 문제가 발생하게 되었고, 이를 개선하기 위해 CPU 가상화(Kernel-based-Virt.)가 등장하게 되었다.

그러나 guest OS를 덧붙히는 개념 자체가 시스템 성능 이슈를 발생할 수 있으므로, 최종적으로는 리눅스 Kernel에서 실행되는 프로세스를 분리하는 기술이 고안되었다.

이 분리된 프로세스를 리눅스 Container라 하고, 실제 OS에서 필요한 만큼의 자원만 이용하기 때문에 전체 시스템 성능 면에서도 손실이 거의 없었다.

따라서 OS Kernel을 control하여 시스템자원과 시스템함수를 활용할 수 있고, Host 운영체제의 sybsystem 및 storage 등을 control할 수 있다.

정리

0. why

  • 가상화가 왜 도입되었는지, 현대 IT기술에서 왜 반드시 필요한지에 대해 알아본다.

1. what

  • 가상화의 종류에 대해 알아본다.
  • 가상화를 통해 어떤 점을 기대할 수 있고, 어떤 분야(백엔드? 데이터분석?)에서 활용할 수 있는지 생각해본다.

2. how

  • 여러 가상화들이 어떤 배경으로 탄생하였고, 특히 Docker는 어떻게 세상에 나오게 되었는지 이해한다.
  • Docker는 CI/CD 자동화에 핵심적으로 쓰일 수 있는 도구인데, 어떻게 실무에 활용할 수 있을지 고민해본다.

3. 참조링크

리눅스 Container / Docker의 등장과 기본 개념
https://www.itworld.co.kr/insight/110748

Container / Docker 개념
https://tpcable.co.kr/45
https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html

벨로그 작성 글 참조(가상화/세그먼트/프로세스 개념)
https://velog.io/@gyrbs22/%EC%A0%84%EC%82%B0%ED%95%99-%EA%B0%80%EC%83%81%ED%99%94Virtual-Machine-DockerContainer
https://velog.io/@gyrbs22/%EC%A0%84%EC%82%B0%ED%95%99-%EC%84%B8%EA%B7%B8%EB%A8%BC%ED%8A%B8
https://velog.io/@gyrbs22/%EC%A0%84%EC%82%B0%ED%95%99-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%BD%9C%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8

Docker 엔진 실행
https://m.blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=powerlinedd&logNo=221813858736&proxyReferer=

Docker container 네트워크/포트 설정
https://blog.d0ngd0nge.xyz/docker-container/

Docker stdout
https://velog.io/@taesunny/Docker-STDOUTSTDERR-%ED%99%95%EC%9D%B8%ED%95%98%EA%B8%B0-docker-logs-%EC%82%AC%EC%9A%A9-%EB%B0%A9%EB%B2%95

Docker shell환경 접근
https://oboki.net/workspace/system/docker/%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EC%97%90-shell-%ED%99%98%EA%B2%BD%EC%9C%BC%EB%A1%9C-%EC%A0%91%EA%B7%BC%ED%95%98%EA%B8%B0/

좋은 웹페이지 즐겨찾기