도커에 대해 처음 사용을 해보면서 도커가 무엇인지, Dockerfile
, Docker compose
, Docker hub
등 여러 개가 있는데 이건 뭐고 어떻게 사용하는지에 대해 공부하고 사용했던 과정을 정리해 보았습니다.
도커란?
도커는 컨테이너 기반의 가상화 플랫폼이다.
WHY 도커?
우리가 도커를 사용하는 이유는 개발을 하다 보면 여러 버전이나 라이브러리, 런타임등을 일관성 있게 관리를 해야 했습니다.
그러다 보니, 만약 윈도우를 사용하고 있었다가 리눅스 환경에서의 설정이 필요하다거나, 배포하려는 서버가 리눅스여서 환경이 달라져서 에러가 발생할 경우도 생기겠죠, 그렇기 때문에 여러 방식으로 해결책이 있었는데 멀티 부팅
과 가상머신
이었습니다.
그리고 도커를 이해하기 위해서는 가상머신의 동작에 대해 이해하고 가는 것이 좋다고 생각하여 먼저 알아보겠습니다!
가상머신
내가 원하는 프로그램을 실행시키기 위해서는 다른 OS가 필요한데 어떻게 할 수 있을까요? 이러한 문제를 해결하기 위한 하나의 방법을 컴퓨터 구조에서 찾을 수 있었습니다.
[ 가상 머신 사용 X ]

가상 머신을 사용하지 않고 일반적으로 우리가 사용할 때의 구성을 간략하게 나타냈습니다.
위 그림에서 주목할 점은 Host OS도 프로세스이다.
입니다. 이러한 특성을 이용하여 또 다른 OS를 하나의 프로세스로 독립적인 환경을 만들어서 사용할 수 있게 한 것이 가상머신입니다.
[ 가상 머신 ]

이렇게 OS를 띄우려다 보니까 문제점이 생깁니다.
지금까지는 Host OS가 프로세스가 사용할 메모리를 할당해 주며 관리를 해줬습니다. 하지만 가상 환경이 생기면서 Host OS가 가상 머신들의 메모리를 직접 관리하려다 보니 각 환경 간 메모리를 공유해서 사용할 수도 있어서 운영체제 간 충돌이 발생하게 됩니다.
따라서 Hypervisor
기술을 사용하여 메모리를 포함한 컴퓨터 시스템의 하드웨어를 가상화하고, 메모리들을 관리하여 독립적인 가상 환경들을 안정적으로 사용할 수 있게 했습니다.
하지만 이러한 VM에서도 아직 문제가 남아있는데, 여러 가지 OS를 가상화하여 프로세스로 사용한다는 점이 결국에는 무거운 프로세스가 된다는 점입니다.
이러한 문제점들을 해결하기 위해 Hypervisor가 Type1과 Typ2로 발전하게 되었습니다.
[ Type1 ]
Host 컴퓨터 하드웨어에 직접 실행되므로 Host 운영체제가 따로 없다는 점에서 리소스의 효율성과 성능 면에서 이점을 가져갈 수 있습니다. (xen 등)
[ Type 2 ]
Host OS위에서 동작하며 게스트 OS와 Host OS를 분리합니다. 대표적으로 VMware와 VirtualBox등이 있습니다.
하지만, 결국 어떤 타입이든 가상OS 부터 메모리나 하드웨어를 사용하기 때문에 성능적인 면에서 문제가 남아있습니다.
Docker의 탄생
또한 여기서 다시 생각해 봐야 할 것은, 우리가 추상화를 하고자 했던 이유입니다. 우리가 이렇게 가상환경을 사용하는 이유는 결국 실행하고 싶은 프로세스
가 내 운영 환경에서 안 돌아가기 때문에, 맞춰주기 위해 환경을 만들어 주는 건데 지금은 가상OS까지 추상화를 해놓으니 효율적이지 않았던 것입니다.
여기서 나오는 개념이 프로세스 격리
인데, 우리가 프로세스만 필요한 것이면 프로세스만 분리를 하자입니다.
이와 비슷한 개념으로 Linux Container
가 존재하고 참고 자료에 링크가 있습니다.

요약하자면, Linux 컨테이너는 linux 운영 체제에서 Host 커널을 공유하여, 각 컨테이너로 분류를 할 수 있는데 이러한 컨테이너 들은 서로 독립적으로 실행되며 자체 파일 시스템과 프로세스 공간을 가지고 있습니다.
이렇다 보니, Linux는 각 컨테이너가 멀티 프로세스를 관리할 수 있게 해 주고, 이러한 멀티 프로세스를 따로 묶어서 관리를 해줘야 했는데 이러한 묶음이 컨테이너라고 하고 합니다. 이러한 컨테이너들을 만들고 관리를 해줘야 하는데 이런 기능을 제공한 것이 Docker라고 할 수 있습니다.
따라서 Docker는 개별 프로세스를 컨테이너화에 특화되었다 할 수 있었습니다. 하지만 Docker가 0.9버전 이후부터 LXC에서 자체 컨테이너로 넘어오면서 컨테이너 기반의 전반 시스템을 구성한 상태입니다.
사실 Docker의 경우 프로세스에 특화하여 컨테이너화 할 수 있게 해주는 회사의 이름이었지만 지금은 하나의 기술 이름이 되었습니다.
Docker란 결국
처음에는 LXC를 위한 컨테이너화에 중접을 뒀다면, 이제는 컨테이너를 빌드하는 것뿐만 아니라 배포와 실행, 관리를 할 수 있는 컨테이너들을 위한 또 다른 운영체제라고 할 수 있습니다.

따라서 Docker에는 LXC와 같은 가상화 기술을 제공하는 Docker Engine
이 존재합니다.
도커가 제공하는 서비스
도커는 사실 하나의 사업체라고 말씀드렸었습니다. 그렇기 때문에 컨테이너화 하는 서비스 말고도 여러 서비스를 제공하는데 이러한 제공하는 서비스들을 보겠습니다.
1. Dockerfile
원하는 환경을 구성하기 위해서는 그에 대한 여러 정보가 필요한데, 이러한 정보를 토대로 도커 이미지 파일을 만들 수 있도록 도와주는 파일입니다.
따로 확장자는 필요 없습니다.
2. Docker Image
Dockerfile이 환경을 만들기 위한 설정 파일이라면, 이 설정 파일로 만들어서 나온 결과물이 Docker Image입니다.
예를 들어, java 파일을 컴파일하면 .class파일이 나오듯, Dockerfile을 빌드하면 Docker Image가 생성됩니다.
Docker Image에는 한 가지 특징이 있는데 바로 Read Only
라는 점입니다. 이 이미지 파일은 오직 읽기만 가능하다는 점 유의해주시기 바랍니다.
이러한 이미지 파일로 실행을 하게 되면 컨테이너가 생성되고, 이미지는 layer를 가지고 있는 상태로 그중에서 read-write 할 수 있는 부분도 있습니다.
3. Docker Hub
우리가 구성한 환경을 빌드한 파일들을 한 사람만이 가지고 있게 되면 공유를 하지 않는 이상 다른 사람이 동일한 환경을 구성하기가 힘들어지게 됩니다. 따라서 이러한 이미지들의 모아두고 공유할 수 있는 저장소가 있는데 바로 Docker Hub이고, github저장소와 같다고 생각하시면 됩니다.
4. Docker Engine
도커 엔진은 도커의 꽃이라고 할 수 있습니다. LXC를 사용하던 과거와 달리 이제는 컨테이너를 만들고 실행까지 가능한 엔진입니다.
[ Docker desktop ]
여기서 주의해야 할 점은 윈도우나 맥의 경우 Docker Desktop을 같이 사용해야 한다는 점인데, docker engine이 실행 가능하게 하는 도구라면, 이러한 가상 환경을 분리해주는 hypervisor가 필요하기 때문이다.
[ 설치시 주의사항]
따라서 window의 경우 windwo10/11 pro의 경우 Hyper-V를 제공하기 때문에 Window desktop을 사용할 수 있지만, window10/11 home의 경우 wsl2를 사용하여 Linux container를 사용할 수 있습니다.
Mac의 경우에도 intel chip은 version11이상 부터 지원한다.
참고 자료
Docker란? What is docker? 도커 컨테이너, docker container 실행 (redhat.com)
'사용기 > 도커' 카테고리의 다른 글
[도커 사용기] 2 - Docker Compose로 배포 환경 구성 (0) | 2023.07.30 |
---|---|
[도커 사용기] 1-2. 도커 이미지 & Volumn & 네트워크 (0) | 2023.07.29 |