
도커란 무엇인가?
기본 개념은 컨테이너(리눅스 컨테이너) 생성 및 관리 도구이다.
그냥 일단은 간단하게 독립된 환경에 애플리케이션과 그가 동작하기 위한 모든 것을 묶어두기 위해 사용되는 기술이라 생각하자.
도커를 쓰는 이유?
먼저 다음과 같은 상황이 있다고 생각해 보자.
- 다양한 의존성이 있는 개발 환경에서 개발을 했고 이제 서버에 배포만 할 일이 남아있다. 내가 로컬에서 돌릴 때 사용했던 애플리케이션들과 의존성을 서버에도 전부 설치를 해야 되는데 일일이 다 설치할 것인가?
- 개발자 여럿이서 하나의 프로젝트를 진행하는데 각 개발자 마자 버전이 일치하지 않는 경우 동일한 버전으로 전부 맞춰야 한다. 일일이 맞출 것인가?
이와 같은 상황은 개발 환경이 로컬 개발 환경에 의존되어 있고 이를 다른 곳에서 돌릴 때 환경이 불일치하여 발생하는 문제이다.
이를 해결하기 위해서는 다음과 같은 존재 하는데,
- 개발 환경 전부 맞춰서 설치하기.
- 가상 머신 VM 위에 똑같은 환경을 구성하여 실행하기.
- 컨테이너 기술을 이용하여 독립적인 실행환경 구성하기.
1번은 사실 말도 안 되게 비효율 적인 방법일 것이다. 프로젝트가 작다면 뭐 나쁘지 않은 방법 일 수도 있지만 지양하자.
2번과 3번은 어떻게 보면 비슷할 수도 있는데 이게 성능의 차이가 심하다.
가상머신에서 프로그램 환경을 구성하고 실행하면 기존의 운영체제 위에 새로운 운영체제를 하나 만들고 그 위에서 돌리는 거라 상당히 무거워질 수밖에 없다. 시스템 자원도 가상화를 해야 하고 하이퍼 바이저를 거치기 때문이다.
우리는 운영체제 위에서 오로지 우리의 애플리케이션 실행환경만 별도로 구성하여서 돌리고 싶은데 그때 사용되는 기술이 컨테이너 기술이다.
컨테이너란 무엇인가?
리눅스 기술이며 표준화된 소프트웨어 유닛이다.
애플리케이션을 동작시키는데 필요한 의존성 및 실행 파일과 코드 들만 들어있는 공간이다.
운영체제의 커널 공간을 공유하여 동작하므로 성능 손실도 거의 적다.
코드 패키지이며 해당 코드를 실행하는데 필요한 종속성 도구가 포함되어 있다.
마지막으로 앞선 가상머신과의 차이점을 사진을 통해 한번 보자

팁: 보안적인 측면에서는 VM 방식이 좀 더 좋다.
도커 이미지란 무엇인가?
코드, 구성 환경, 애플리케이션 설정 환경 등 컨테이너에서 돌아갈 내용을 묶어서 기술한 템플릿이라고 생각하면 된다.
이러한 도커 이미지를 바탕으로 어느 곳에서 몇 개든 해당 이미지의 인스턴스인 도커 컨테이너를 띄울 수 있다.
이미지는 Dockerfile을 빌드하여서 생성할 수 있다.
도커 컨테이너란?
도커 이미지가 동작하고 있는 상태이다. 즉, 실제 프로세스/인스턴스이다.
(요즘 AWS를 공부 중인데 여기로 따지면 AMI의 역할을 하고 컨테이너는 인스턴스이다)
당연하게도 이미지를 가지고 컨테이너를 중복하여서 여러 개 띄울 수도 있다.
그리고 중요한 것은 도커의 컨테이너에는 하나의 프로세스만 포함시키는 것이 권장사항이다.
하나의 컨테이너에 웹서버, 데이터베이스 서버 등 다 넣고 돌려도 가능은 하지만, 어느 한쪽에 수정이 발생하면 컨테이너 자체를 새로 띄워야 하기 때문에 유지보수성이 꽝이다.
즉, 웹서버와 데이터베이스 서버가 있다면 하나의 컨테이너로 실행하지 말고 각각 컨테이너를 나눈 후 이 컨테이너들을 각각 실행시킨다.
대신 얘네는 함께 돌아가야 하는 서비스여야 하기에 한 세트로 묶어서 실행하는데 컨테이너 묶음을 만들어주는 놈이 도커 컴포즈이다.
번외
도커, 컨테이너, 그리고 쿠버네이스 세 개념을 잡기에 이 영상이 정말 최고인 거 같다.
개발자를 위한 쉬운 도커 (2024 NEW) | 컨테이너, 도커, 쿠버네티스의 개념을 엄청 쉽게 알려드려요. - YouTube