PromleeBlog
sitemap
aboutMe

posting thumbnail
컨테이너 개념 완벽 이해와 Docker 첫걸음 - DevOps 컨테이너에서 클러스터까지 1편
Understanding Container Concepts and Starting Docker - DevOps from Containers to Clusters Part 1

📅

🚀

들어가기 전에 🔗

혹시 "내 컴퓨터에서는 잘 되는데, 왜 네 컴퓨터에서는 안 되지?" 라는 말을 들어보거나 해보신 적이 있나요?
팀 프로젝트를 하거나 다른 사람에게 내가 만든 프로그램을 공유할 때 종종 겪는 문제입니다.
개발 환경이 제각각 다르기 때문에 발생하는 일인데요, 이런 문제를 해결하기 위해 등장한 기술이 바로
Docker(도커)
입니다.
이번 시간에는 개발자라면 꼭 알아야 할 필수 기술이 된 Docker의 가장 기초적인 개념부터 차근차근 알아보겠습니다.
가상머신과 컨테이너의 차이점을 시작으로, Docker의 핵심인 이미지와 컨테이너가 무엇인지 배우고, 직접 Docker를 설치해서 첫 번째 컨테이너를 실행해보는 것까지 함께 해보겠습니다.

🚀

가상머신과 컨테이너, 무엇이 다를까요? 🔗

Docker를 이해하려면 먼저 컨테이너라는 개념을 알아야 합니다.
그리고 컨테이너를 제대로 이해하려면, 그 이전에 사용되던 가상머신(Virtual Machine, VM)과 비교해보는 것이 가장 좋습니다.

무거운 가상머신(VM) 🔗

가상머신은 한 대의 컴퓨터(서버) 안에 여러 개의 독립적인 컴퓨터를 만드는 기술이라고 생각할 수 있습니다.
예를 들어, 우리가 가진 컴퓨터의 운영체제가 Windows인데, 그 안에 Linux나 macOS를 설치해서 사용하는 것을 상상해 보세요.

가상머신은 마치
독채 주택
과 같습니다.
집을 짓기 위해 땅(하드웨어)이 필요하고, 그 위에 실제 운영체제(Guest OS)라는 완벽한 집 한 채를 통째로 짓는 방식입니다.
그래서 각 집(가상머신)은 서로 완전히 분리되어 독립적으로 움직이지만, 집을 한 채씩 통째로 지어야 하니 매우 무겁고, 실행하는데 시간이 오래 걸리며, 자원을 많이 차지한다는 단점이 있습니다.
가상머신 구조도
가상머신 구조도

가벼운 컨테이너 🔗

컨테이너는 가상머신과 다르게 운영체제를 통째로 설치하지 않습니다.
대신, 기존 컴퓨터의 운영체제(Host OS)가 가진 자원을 공유하면서, 프로그램과 그 실행에 필요한 모든 것을 하나로 묶어 격리된 공간을 만듭니다.
컨테이너는
아파트의 각 세대
에 비유할 수 있습니다.
하나의 큰 아파트 건물(Host OS)이 있고, 각 세대(컨테이너)는 건물의 수도, 전기, 가스(OS 자원) 같은 기반 시설은 공유하지만, 세대 내부는 각자의 가구와 인테리어(프로그램과 라이브러리)로 채워져 서로 독립적인 생활을 하는 것과 같습니다.
운영체제를 새로 설치하지 않으니 가상머신보다 훨씬 가볍고, 시작하는 속도도 매우 빠릅니다.
👨‍💻
정리하자면, 가상머신은 하드웨어 수준의 가상화이고, 컨테이너는 운영체제 수준의 가상화 기술입니다.
컨테이너 구조도
컨테이너 구조도

🚀

Docker란 무엇일까요? 🔗

앞서 설명한 컨테이너 기술을 아주 편리하게 사용할 수 있도록 만들어주는 도구(플랫폼)가 바로
Docker
입니다.
컨테이너라는 개념은 이전에도 있었지만, Docker가 등장하면서 누구나 쉽고 표준화된 방식으로 컨테이너를 만들고, 배포하고, 관리할 수 있게 되었습니다.
마치 우리가 아파트에 쉽게 입주하고 생활할 수 있도록 도와주는 부동산 중개소나 관리사무소 같은 역할을 Docker가 해주는 것입니다.
Docker 덕분에 "내 컴퓨터에서는 되는데..."라는 문제가 사라지고, 어떤 환경에서든 동일하게 프로그램을 실행할 수 있게 되었습니다.

🚀

이미지와 컨테이너, 핵심 개념 이해하기 🔗

Docker를 사용하다 보면
이미지
컨테이너
라는 두 단어를 가장 많이 듣게 됩니다.
이 둘의 관계를 이해하는 것이 Docker의 핵심입니다.

이미지: 애플리케이션의 설계도 🔗

이미지는 컨테이너를 만드는 데 필요한 모든 것을 담고 있는
읽기 전용 템플릿
입니다.
쉽게 말해, '붕어빵 틀'이나 '집 설계도'에 비유할 수 있습니다.
이미지 안에는 특정 프로그램을 실행하기 위해 필요한 코드, 라이브러리, 설정 파일 등이 모두 들어있습니다.
예를 들어 'Nginx 웹 서버 이미지'에는 Nginx를 실행하는 데 필요한 모든 것이 담겨 있습니다.
이 이미지는 변하지 않는 상태로 존재하며, 우리는 이 설계도를 가지고 실제 집을 짓게 됩니다.

컨테이너: 설계도로 지은 실제 집 🔗

컨테이너는 바로 그 이미지라는 설계도를 바탕으로 만들어진
실제 동작하는 인스턴스(객체)
입니다.
'붕어빵 틀(이미지)'로 찍어낸 '붕어빵(컨테이너)' 또는 '집 설계도(이미지)'로 지은 '실제 집(컨테이너)'이라고 생각하면 정확합니다.
하나의 이미지로 여러 개의 컨테이너를 만들 수 있습니다.
똑같은 붕어빵 틀로 여러 개의 붕어빵을 만들 수 있는 것과 같은 원리입니다.
각 컨테이너는 독립된 공간을 가지며, 실행되고, 중지되고, 삭제될 수 있는 살아있는 프로그램의 실행 상태입니다.
이미지 제안: 하나의 이미지(설계도)에서 여러 개의 컨테이너(집)가 생성되는 관계를 보여주는 그림.

🚀

Docker 설치하고 직접 체험하기 🔗

이제 개념을 배웠으니 직접 Docker를 설치하고 간단한 실습을 해보겠습니다.

Docker 설치하기 🔗

Docker는 Windows, macOS, Linux 등 다양한 운영체제에 설치할 수 있습니다.
설치 과정이 운영체제마다 조금씩 다르기 때문에, 모든 과정을 여기서 설명하기는 어렵습니다.
가장 좋은 방법은 공식 문서를 따라 설치하는 것입니다.
아래 링크에서 자신의 운영체제에 맞는 Docker Desktop을 설치해주세요.
MacOS의 경우 Homebrew를 사용하여 쉽게 설치할 수 있습니다. 터미널을 열고 다음 명령어를 입력하세요.
brew install --cask docker
홈브루 설치하기(링크)
설치가 완료되면 Docker를 실행하고 로그인과 권한설정을 하면, 시스템 트레이에서 Docker 아이콘을 확인할 수 있습니다.

첫 번째 컨테이너 실행하기: hello-world 🔗

설치가 완료되었다면, 터미널(Windows에서는 PowerShell 또는 CMD)을 열고 다음 명령어를 입력해 보세요.
docker run hello-world
이 한 줄의 명령어를 실행하면, 다음과 같은 일이 순서대로 일어납니다.
  1. Docker 클라이언트가 docker run 명령을 Docker 서버(데몬)에게 전달합니다.
  2. Docker 서버는 hello-world 라는 이미지가 내 컴퓨터에 있는지 찾아봅니다.
  3. 아마 처음 실행했기 때문에 이미지가 없을 것입니다. 그러면 Docker 서버는 이미지를 다운로드할 수 있는 Docker Hub라는 기본 저장소에 가서 hello-world 이미지를 찾아 다운로드합니다.
  4. 다운로드가 완료되면, 그 이미지를 설계도 삼아 새로운 컨테이너를 만듭니다.
  5. 만들어진 컨테이너를 실행합니다. hello-world 컨테이너는 화면에 환영 메시지를 출력하고, 자신의 임무를 다한 뒤 종료됩니다.
docker run hello-world
docker run hello-world
성공적으로 메시지가 출력되었다면 여러분의 첫 번째 Docker 컨테이너 실행을 축하합니다.

꼭 알아야 할 기본 명령어 🔗

앞으로 자주 사용하게 될 몇 가지 기본 명령어를 알아보겠습니다.
➡️

docker images: 이미지 목록 확인 🔗

내 컴퓨터에 다운로드된 이미지들의 목록을 보여줍니다.
방금 실행한 hello-world 이미지가 목록에 있는 것을 확인할 수 있습니다.
docker images
➡️

docker ps: 실행 중인 컨테이너 확인 🔗

현재 실행 중인 컨테이너의 목록을 보여주는 명령어입니다.
만약 종료된 컨테이너까지 모두 보고 싶다면 -a 옵션을 추가하면 됩니다.
docker ps -a
➡️

docker run: 컨테이너 실행 🔗

앞서 사용했던 명령어로, 이미지를 바탕으로 컨테이너를 생성하고 실행합니다.
가장 중요하고 많이 사용하는 명령어입니다.
➡️

docker logs: 컨테이너 로그 보기 🔗

컨테이너가 실행되면서 출력하는 메시지(로그)를 확인할 때 사용합니다.
프로그램이 왜 멈췄는지, 어떻게 동작하고 있는지 확인할 때 아주 유용합니다.
docker logs [컨테이너_ID_또는_이름]

🚀

결론 🔗

오늘은 Docker의 세계에 첫발을 내디뎠습니다.
무겁고 큰 가상머신 대신, 가볍고 빠른 컨테이너가 왜 필요한지 알아보았습니다.
그리고 컨테이너를 쉽게 다루게 해주는 Docker가 무엇인지, Docker의 핵심인
이미지(설계도)
컨테이너(실제 집)
의 개념을 이해했습니다.
마지막으로 직접 Docker를 설치하고 hello-world를 실행하며 첫 컨테이너를 만들어보는 경험까지 마쳤습니다.
다음 시간에는 오늘 배운 내용을 바탕으로, 실제 Nginx 웹 서버를 컨테이너로 띄우고 우리가 만든 웹 페이지를 올려보는 실습을 진행하겠습니다.

참고 🔗