[Docker] Docker 란 무엇이고 왜 사용할까? 🐳

gogori6565·2024년 7월 18일
0

Spring

목록 보기
4/7
post-thumbnail

Docker 란 무엇일까? 🐳

Linux 컨테이너를 기반으로 하여 특정한 서비스(어플리케이션)을 패키징하고 배포하는데 유용한 프로그램.
간단히 말해, 어플리케이션을 패키징할 수 있는 도구이다.

  • Docker는 어플리케이션 실행에 필요한 모든 것들(application, System tools, dependencies 등등)을 도커 컨테이너에 담아 어떠한 런타임 환경에서도 실행 가능하도록 만들어 주는 프로그램.

컨테이너(Container) 란 무엇일까?

애플리케이션을 환경에 구애받지 않고 실행할 수 있는 기술이다.

  • 컨테이너는 서버의 한 종류라고 볼 수 있다.
  • 한 대의 서버에서 여러 개의 SW를 안전하게 사용 가능하게 하고 이는 VM보다 효율적으로 사용된다. (VM vs Container 의 차이)
  • 그리고 이때 Docker는 서버에서 실행되는 컨테이너를 관리하는 역할을 한다고 볼 수 있다.

Docker 를 사용하는 이유?

Docker를 사용하는 장점은 여러 가지가 있는데, 그 중에서도 중요한 세 가지가 있다.

1. 일관된 환경을 제공한다

  • 개발, 테스트, 배포 환경이 동일하게 유지되어 "개발 환경에서는 작동하는데 프로덕션에서는 작동하지 않는" 문제를 방지할 수 있다.
  • 개발을 하다보면 팀원들과 언어나 프레임워크의 버전이 달라 오류가 나는 경우가 있다. 이때 Docker를 사용하면 프로젝트를 설정할 때 각 팀원이 동일한 Docker 이미지를 사용하여 일관된 환경을 갖추게 되므로, 협업 시 환경 차이로 인한 문제를 최소화할 수 있다.
    이는 서버 컴퓨터에서 환경을 만들 때도 같은 장점을 지닌다.

2. 이식성이 좋다

  • Docker 컨테이너는 어디서든 실행 가능하여 로컬, 테스트 서버, 클라우드 환경 등 다양한 환경에서 동일하게 동작한다.

3. 신속한 배포와 편리한 서버 확장이 가능하다

  • Docker 이미지를 이용해 애플리케이션을 빠르게 배포할 수 있으며, 컨테이너의 실행과 확장이 매우 효율적이다.
  • 내가 서버에서 배포하고 있던 서비스의 인기가 많아져 서버를 늘리거나 더 좋은 서버로 옮긴다고 가정해보자. 이때 새로운 서버에 일일이 전 서버에서 쓰던 언어와 프레임워크를 설치하는 건 매우 번거롭다.
    이때 Docker를 사용하면 이미지만 가져와서 새로운 서버에 컨테이너를 만들어 쉽게 동일 환경을 구축할 수 있다. 또한 하나의 물리 서버에서 여러 도커 컨테이너를 돌려 여러 서비스를 배포하는 것도 가능하다.

4. 자원적, 성능적으로 우수하다

  • Docker 컨테이너는 전통적인 가상 머신보다 훨씬 가볍고 빠른 실행 속도를 가진다. (why? VM vs Container 의 차이)

VM 이란? : VM = Virtual Machine, 한 마디로 내 컴퓨터는 window인데 Linux나 Mac OS를 쓸 수 있게 하는 것이다. 하나의 컴퓨터에서 여러 대의 컴퓨터를 사용하는 느낌으로 이해하면 된다. 만약 VM을 사용하다가 바이러스에 걸린다면 해당 VM을 삭제해버리면 그만인 것이다.

VM vs Container 의 차이

둘의 차이점을 한 마디로 이야기하자면, '운영체제(OS)를 포함하고 있느냐, 없느냐' 이다.

이미지 출처 : https://www.netapp.com/ko/blog/containers-vs-vms/

[이미지 왼쪽] 기존의 가상화 방식(VM)은 각 가상 환경마다 독립된 커널 OS가 존재하여 매우 무겁고 느릴 수 밖에 없었다. 또한 각 환경마다 쓸 수 있는 자원이 고정으로 정해져 있기 때문에 컴퓨터의 성능과 환경이 제한된다.

[이미지 오른쪽] 그래서 이 VM을 경량화시킨 것이 바로 컨테이너(Container)이다. 각 컨테이너는 호스트 OS 커널을 공유하여 사용하고, Container Engine이라는 SW가 개별적인 컨테이너를 만들어 각각의 어플리케이션을 고립된 환경에서 구동할 수 있게 한다. 또한 각 환경마다 사용할 수 있는 자원이 고정으로 정해져 있지 않아 유동적으로 변할 수 있다.

따라서 컨테이너가 기존의 가상화 방식(VM)보다 자원적, 성능적으로 뛰어난 것이다.

이미지에서 보다시피 Container는 구동되려면 Container Engine을 필요로 한다.
(Container Engine = 컨테이너 이미지를 기반으로 컨테이너를 생성하는 소프트웨어 프로그램)
그리고 이 Container Engine 중에 가장 많이 사용되는 것이 바로 "Docker" 이다.


Docker 의 3대 구성요소

Docker 컨테이너를 만들기 위해서는 총 3가지가 필요하다.

👉 Dockerfile | Image | Container

1. Dockerfile
도커파일이란, Docker에서 이미지를 생성하기 위한 용도로 작성하는 파일이다.
즉, 만들 이미지에 대한 정보를 기술해 둔 템플릿(요리로 치면 레시피)이라고 보면 된다.

도커 이미지를 만들 때,

docker build [옵션] [작성한 dockerfile 경로]

위와 같이 명령어를 입력하면 작성한 도커파일의 내용을 기반으로 이미지가 빌드된다.

2. Image
어플리케이션을 실행하기 위해 필요한(=컨테이너 생성(실행)에 필요한) 모든 코드, 파일, 설정값(환경)을 지닌 것을 말한다.
즉, 더 이상의 의존성 파일을 컴파일하거나 이것저것 설치할 필요 없는 상태의 파일이다.

  • 쉽게 생각해, 실행되고 있는 어플리케이션의 상태를 snapshot해서 이미지로 만들어둔다고 생각하자.

3. Container
이미지(Image)를 실행한 상태로, 어플리케이션의 종속성과 함께 어플리케이션 자체를 패키징 or 캡슐화하여 격리된 공간에서 어플리케이션을 동작시키는 기술이다.

  • 한 서버는 여러 개의 컨테이너를 가져도 상관없으며, 컨테이너는 독립적으로 실행된다.

Image는 생성했을 당시의 상태를 불변의 상태로 가지고 있으며, 컨테이너에서 각각 동작하는 어플리케이션은 개별적 수정이 가능한 상태이다.
각 컨테이너에서 수정된 사항은 Image에는 아무런 영향을 끼치지 않는다.


Docker Image 를 어떻게 서버 또는 타 PC에 배포하는가?

과정

  1. 내 로컬 머신에서 만든 Dockerfile 을 build 해서 Docker Image 를 생성한다.
  2. Docker Image 를 Container Registry(ex: Docker Hub, Github Packages 등등) 에 push 한다.
  3. Server(혹은 타 PC)에서 Container Registry에 존재하는 Docker Image 를 pull 로 받아온다.
  4. Docker run 명령어로 Docker Image 파일을 실행한다. (Image 실행을 위해서는 Server에도 Docker 같은 Container Engine 을 설치해야 한다.)

Docker vs Docker Hub 의 차이점?

  • Docker : 어플리케이션을 컨테이너로 패키징해 일관된 환경에서 실행할 수 있게 해주는 플랫폼
  • Docker Hub : Docker Image를 저장하고 공유할 수 있는 클라우드 레지스트리 서비스

=> 즉, Docker는 어플리케이션을 컨테이너로 만들고 관리하는데 사용하는 것이고, Docker Hub는 Docker Image를 저장하고 배포하는데 사용하는 것이다.


아래 링크는 GitHub Actions을 사용하여 Docker와 CI/CD를 구축하는 실습 내용이 담겨있습니다👩‍💻
🧷 Docker와 CI/CD 파이프라인 구축 - 실습편

profile
p(´∇`)q

0개의 댓글