
Linux 컨테이너를 기반으로 하여 특정한 서비스(어플리케이션)을 패키징하고 배포하는데 유용한 프로그램.
간단히 말해, 어플리케이션을 패키징할 수 있는 도구이다.
애플리케이션을 환경에 구애받지 않고 실행할 수 있는 기술이다.
Docker를 사용하는 장점은 여러 가지가 있는데, 그 중에서도 중요한 세 가지가 있다.
1. 일관된 환경을 제공한다
2. 이식성이 좋다
3. 신속한 배포와 편리한 서버 확장이 가능하다
4. 자원적, 성능적으로 우수하다
VM 이란? : VM = Virtual Machine, 한 마디로 내 컴퓨터는 window인데 Linux나 Mac OS를 쓸 수 있게 하는 것이다. 하나의 컴퓨터에서 여러 대의 컴퓨터를 사용하는 느낌으로 이해하면 된다. 만약 VM을 사용하다가 바이러스에 걸린다면 해당 VM을 삭제해버리면 그만인 것이다.
둘의 차이점을 한 마디로 이야기하자면, '운영체제(OS)를 포함하고 있느냐, 없느냐' 이다.

[이미지 왼쪽] 기존의 가상화 방식(VM)은 각 가상 환경마다 독립된 커널 OS가 존재하여 매우 무겁고 느릴 수 밖에 없었다. 또한 각 환경마다 쓸 수 있는 자원이 고정으로 정해져 있기 때문에 컴퓨터의 성능과 환경이 제한된다.
[이미지 오른쪽] 그래서 이 VM을 경량화시킨 것이 바로 컨테이너(Container)이다. 각 컨테이너는 호스트 OS 커널을 공유하여 사용하고, Container Engine이라는 SW가 개별적인 컨테이너를 만들어 각각의 어플리케이션을 고립된 환경에서 구동할 수 있게 한다. 또한 각 환경마다 사용할 수 있는 자원이 고정으로 정해져 있지 않아 유동적으로 변할 수 있다.
따라서 컨테이너가 기존의 가상화 방식(VM)보다 자원적, 성능적으로 뛰어난 것이다.
이미지에서 보다시피 Container는 구동되려면 Container Engine을 필요로 한다.
(Container Engine = 컨테이너 이미지를 기반으로 컨테이너를 생성하는 소프트웨어 프로그램)
그리고 이 Container Engine 중에 가장 많이 사용되는 것이 바로 "Docker" 이다.
Docker 컨테이너를 만들기 위해서는 총 3가지가 필요하다.
👉 Dockerfile | Image | Container
1. Dockerfile
도커파일이란, Docker에서 이미지를 생성하기 위한 용도로 작성하는 파일이다.
즉, 만들 이미지에 대한 정보를 기술해 둔 템플릿(요리로 치면 레시피)이라고 보면 된다.
도커 이미지를 만들 때,
docker build [옵션] [작성한 dockerfile 경로]
위와 같이 명령어를 입력하면 작성한 도커파일의 내용을 기반으로 이미지가 빌드된다.
2. Image
어플리케이션을 실행하기 위해 필요한(=컨테이너 생성(실행)에 필요한) 모든 코드, 파일, 설정값(환경)을 지닌 것을 말한다.
즉, 더 이상의 의존성 파일을 컴파일하거나 이것저것 설치할 필요 없는 상태의 파일이다.
3. Container
이미지(Image)를 실행한 상태로, 어플리케이션의 종속성과 함께 어플리케이션 자체를 패키징 or 캡슐화하여 격리된 공간에서 어플리케이션을 동작시키는 기술이다.
Image는 생성했을 당시의 상태를 불변의 상태로 가지고 있으며, 컨테이너에서 각각 동작하는 어플리케이션은 개별적 수정이 가능한 상태이다.
각 컨테이너에서 수정된 사항은 Image에는 아무런 영향을 끼치지 않는다.

과정
➕ Docker vs Docker Hub 의 차이점?
- Docker : 어플리케이션을 컨테이너로 패키징해 일관된 환경에서 실행할 수 있게 해주는 플랫폼
- Docker Hub : Docker Image를 저장하고 공유할 수 있는 클라우드 레지스트리 서비스
=> 즉, Docker는 어플리케이션을 컨테이너로 만들고 관리하는데 사용하는 것이고, Docker Hub는 Docker Image를 저장하고 배포하는데 사용하는 것이다.
아래 링크는 GitHub Actions을 사용하여 Docker와 CI/CD를 구축하는 실습 내용이 담겨있습니다👩💻
🧷 Docker와 CI/CD 파이프라인 구축 - 실습편