안녕하세요! 오늘은 비전공자도 쉽게 알 수 있게 docker의 개념을 블로그에 정리해볼까 합니다! 저도 비전공자이기 때문에 docker의 개념이 많이 어렵더라고요. 이해할 수 있게 쉽게 개념을 풀어 적어보려고 합니다:)
🐋 도커(Docker)는 언제 사용하나?
도커는 저 사람 컴퓨터에서는 되는데 내 컴퓨터에서는 안돼! 와 같은 상황을 해결해주기 때문입니다!
🐋 도커(Docker)란 무엇인가?
Docker는 리눅스 컨테이너 기반의 오픈소스 가상화 시스템입니다.
가상화란 실제 있지 않는 것을 마치 있는 것처럼 보이게 해주는 기술입니다. 다른 블로그를 참고하였는데 가상화의 예시로 "현재 존재하지 않는 애인을 마치 있는 것처럼 화면 속에 띄어주는 것이 가상화이다." 이 말이 가장 적절할 것 같습니다. 뭔가 웃퍼서 예시로 딱 적당할 것 같아서 가져와봤습니다! 이러한 가상화 개념은 클라우드 시장의 핵심 기술로써 큰 환영을 받고 있습니다. 집 하나를 여러 구역으로 쪼개는 것처럼 물리적인 서버 하나를 여러개의 가상 서버로 쪼개서 여러 명한테 각각 빌려줄 수 있게 된 것입니다.
그런데 이렇게 한 컴퓨터에서 독립된 운영체제를 여러개 돌리는 가상화는 문제가 있습니다. 컴퓨터 한 대에서 여러 운영체제를 한꺼번에 돌리다 보니 느려질 수 밖에 없었습니다. 그래서 리눅스 진영에서 고민하기 시작합니다. 그래서 여러 가지 역사를 거쳐 완성된 오픈소스 기술이 바로 Docker 입니다. Docker를 쓰면 굳이 독립된 운영체제를 여러개 띄울 필요가 없습니다.
일상생활에 비유하자면:
- 여러분이 새 아파트로 이사갈 때 상상해봅시다. 가구, 주방용품, 전자제품 등 모든 것을 설치하고 세팅해야 합니다.
- 하지만 Docker를 사용하면 "완벽하게 세팅된 방"을 그대로 가져와서 사용할 수 있습니다.
- 요리사가 요리를 하려면 주방, 도구, 재료, 조리법이 필요합니다.
- 하지만 Docker를 사용하면 모든 것이 갖춰진 "완벽한 주방"을 누구나 쉽게 가져다 쓸 수 있게 해주는 것입니다.
- Docker 장점
- 이식성: 한번 만들어놓은 Docker 상자는 어떤 컴퓨터에서든 동일하게 작동합니다.
- 격리성: 각 프로그램은 자기만의 상자 안에서 실행되어 서로 방해하지 않습니다.
- 효율성: 기존 가상화 기술보다 가볍고 빠릅니다.
- 간편함: 프로그램을 설치하고 실행하는 복잡한 과정 없이 바로 사용할 수 있는 환경을 누구나 쉽게 공유하고 사용할 수 있습니다.
집주인 운영체제 위에다가 Docker만 설치하면 어느 컴퓨터에서든 똑같이 돌아가는 가상 환경을 여러개 띄울 수 있습니다. 운영체제 알맹이는 통일하고 그 위에 나머지 필요한 부분만 묶어 가볍게 가상화한 것이 바로 컨테이너 입니다.
🐋 도커 컨테이너(Docker Container)란?
- 애플리케이션과 그것을 실행하는데 필요한 모든 것(라이브러리, 설정 파일 등)을 포함하는 독립된 실행 환경입니다.
- 호스트 운영체제의 자원을 사용하지만, 다른 컨테이너와 격리되어 있습니다.
🐋 도커 아키텍처(Docker Architecture)란?
- Docker Client => 도커를 설치하면 그것이 Client이며 build, pull, run 등의 도커 명령어를 수행합니다.
- Docker_HOST => 도커가 띄어져 있는 서버를 의미합니다. DOCKER_HOST에서 컨테이너와 이미지를 관리하게 됩니다.
- Docker daemon => 도커 엔진의 핵심 구성 요소 중 하나로 도커 호스트에서 실행되는 백그라운드 프로세스입니다.
- Registry => 외부(remote) 이미지 저장소로 도커 이미지를 저장하고 공유하는 중앙 저장소입니다. 다른 사람들이 공유한 이미지를 내부(local) 도커 호스트에 pull 할 수 있습니다. 이렇게 가져온 이미지를 run하면 컨테이너가 됩니다.
- public 저장소: Docker Hub, QUAY
- private 저장소: AWS ECR 혹은 Docker Registry를 직접 띄워서 비공개로 사용하는 방법 등이 존재합니다.
🐋 도커 이미지(Docker Image)와 도커 컨테이너(Docker Container)
도커 엔진에서 사용하는 기본 단위는 이미지와 컨테이너이며 도커 엔진의 핵심입니다. 도커 이미지와 컨테이너는 1 : N 관계 입니다. 도커 이미지와 컨테이너의 관계는 운영체제에서의 프로그램 <-> 프로세스, 객체지향 프로그래밍에서의 클래서 <-> 인스턴스의 관계와 비슷하다고 생각하면 이해가 더 편합니다.
- Docker File => Docker Image
- Docker File은 도커 이미지를 만들 때 사용하는 파일로 설계도와 같은 텍스트 파일입니다.
- 어떤 운영체제를 기반으로 할지, 어떤 프로그램을 설치할지, 어떤 파일을 복사할지 등을 명시합니다.
- docker build 명령어를 실행시키면 도커 이미지를 만들 수 있습니다.
- Docker Image => Docker Container
- Docker Image를 docker run 명령어를 실행시키면 Docker Container를 만들 수 있습니다.
- Docker Image
- 도커 이미지는 컨테이너를 어떻게 만들어야 하는지에 대한 지침으로 애플리케이션 코드와 실행에 필요한 모든 구성 요소를 포함합니다.
- 가상 머신을 생성할 때 사용하는 iso 파일과 비슷한 개념입니다.
- Docker Container
- 도커 컨테이너는 도커 이미지로 생성할 수 있습니다.
- 애플리케이션과 그것을 실행하는 데 필요한 모든 것(라이브러리, 설정 파일 등)을 포함하는 독립된 실행환경입니다.
- 컨테이너를 생성하면 해당 이미지의 목적에 맞는 파일이 들어 있는 호스트와 다른 컨테이너로부터 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립된 공간(프로세스)이 생성됩니다.
웹 서버 도커 이미지로부터 여러개의 도커 컨테이너를 생성하면 생성된 컨테이너 개수만큼 웹 서버가 생성되고, 이 컨테이너들은 외부에 웹 서비스를 제공하는 데에 사용됩니다. 컨테이너는 이미지를 읽기 전용으로 사용하되 이미지에서 변경된 사항만 컨테이너 계층에 저장하므로 컨테이너에서 무엇을 하든지 원해 이미지는 영향을 받지 않습니다. 또한, 생성된 각 컨테이너는 각기 독립된 파일시스템을 제공받으며 호스트와 분리돼 있으므로 특정 컨테이너에서 어떤 어플리케이션을 설치하거나 삭제해도 다른 컨테이너와 호스트는 변화가 없습니다.
ex) 같은 도커 이미지로 A, B 두 개의 컨테이너를 생성한 뒤에 A 컨테이너를 수정해도 B 컨테이너에는 영향을 주지 않습니다!
🐋 도커(Docker)가 작동하는 방식?
- 개발자가 Dockerfile 작성: 애플리케이션과 필요한 환경을 정의합니다.
- Image build: Dockerfile을 기반으로 Docker 이미지를 생성합니다.
- Image 공유: 이미지를 Docker Hub 같은 레지스트리에 업로드하여 다른 사람과 공유할 수 있습니다.
- Container 실행: 이미지를 기반으로 컨테이너를 실행하면 애플리케이션이 작동합니다.
🐋 Mac에 Docker 설치하기
저는 맥OS 용 패키지 관리자 Homebrew를 통해 Docker Desktop을 설치해보도록 하겠습니다.
1. Homebrew가 설치되어 있지 않다면, 다음 명령어로 설치합니다:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
2. Homebrew로 Docker Desktop 설치:
brew install --cask docker
3. 설치가 돤료되면 응용 프로그램 폴더에서 Docker Desktop을 실행합니다.
4. 설치 확인: Docker Desktop이 실행된 후, 터미널에서 다음 명령어로 설치가 제대로 되었는지 확인합니다:
docker --version
docker run hello-world
"hello-world" 컨테이너가 실행되면 Docker가 정상적으로 설치된 것 입니다!
🐋 Docker로 melon API를 사용할 수 있는 환경 설정하기
1. Docker Hub에서 'danielko8/melonapi'라는 이미지를 검색
2. 검색결과에 나온 'danielko8/melonapi'을 pull 버튼을 클릭해 로컬로 이미지를 다운로드 합니다.
3. run 버튼을 클릭하거나 터미널에 명령어를 입력해 서버를 실행시킵니다.
docker run -p 5000:5000 danielko8/melonapi:master
- -p: "publish" 또는 "port"의 약자로, 포트를 매핑해야겠다는 의미입니다.
- 첫 번째 숫자 5000: 5000은 호스트(여러분의 컴퓨터)의 포트 번호입니다.
- 두 번째 숫자 5000: 5000은 컨테이너 내부의 포트 번호 입니다.
- 콜론(:): 이 두 포트를 연결하겠다는 의미입니다.
- 즉, "-p 5000:5000"은 컨테이너 내부의 5000번 포트를 내 컴퓨터 의 5000번 포트로 연결하겠다는 의미입니다!
- 이렇게 하는 의미는 Docker 컨테이너는 기본적으로 격리된 환경이므로 외부에서 접근할 수 없습니다. 웹 서버와 같은 애플리케이션이 컨테이너 내부에서 실행되면, 포트 매핑 없이는 외부에서 접근할 방법이 없습니다. 포트 매핑을 통해 외부(호스트)에서 내부(컨테이너)로 네트원크 요청을 전달할 수 있게 됩니다.
'인턴' 카테고리의 다른 글
[ Troubleshooting🛠️ ] Next.js 서버사이드 렌더링에서 styled-components 적용하기 (0) | 2025.04.08 |
---|---|
[ Troubleshooting🛠️ ] Invalid URL 오류 및 Next.js 데이터 fetching pattern (0) | 2025.04.08 |
[ Troubleshooting🛠️ ] Tanstack Query의 데이터 로딩 (0) | 2025.04.07 |
[ Troubleshooting🛠️ ] CORS 문제 해결 (0) | 2025.04.07 |
쿠기(Cookie)와 토큰(Token)의 설명 (0) | 2025.04.04 |