오늘은 Docker에 대한 기본적인 개념 및 사용방법에 대해 알아보도록 하겠다.
Docker란 무엇일까를 이야기한다면 빠지지 않고 나오는 얘기가 바로 VM머신이다.
이들은 모두 가상화된 개별공간에 새로운 무언가를 작업함과 동시에 시스템 or 서비스 간의 분리를 도모하기 위해 사용되는 것으로 생각된다.
그렇다면 이들의 차이는 무엇일까?
구조적인 차이를 본다면 위와 같다.
가장 큰 차이점은 눈으로 간단히 찾을 수 있다.
바로 Docker의 Container는 Guest OS를 별도로 생성하지 않는다는 것이다.
기존 VM 머신은 하드웨어 스택을 가상화하는 방식으로 생성된다. 그렇기 때문에 생성하는 인스턴스마다 OS를 계속하여 생성하는 작업이 필요한 것이다.
하지만 Container는 OS(운영체제) 수준에서 가상화를 실행하기 때문에 Host OS의 커널에서 직접 구동하기 때문에 별도의 Guest OS를 두지 않는 것이다.
VM 머신과 Container의 장/단점을 다시 정리한다면 아래와 같다고 볼 수 있다.
그렇다면 VM 머신과 유사하지만 다른 Docker란 무엇일까?
- What is Docker?
컨테이너 기반의 오픈소스 가상화 플랫폼
Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 SW 플랫폼이다.
Docker는 SW를 Container라는 표준화된 유닛으로 패키징하며, Container안에는 Library, System Tool, Runtime 등 SW를 실행하는데 필요한 모든 것이 포함되어 있다.
VM 머신을 사용해본 독자라면 Image라는 녀석은 친숙할 것이다.
Docker에서도 Image의 정의나 용도는 VM 머신의 개념과 유사하다고 생각한다.
Image는 Container 실행에 필요한 모든 파일, 설정 값 등을 가지고 있는 것으로 상태값을 가지지 않으며 불변의 성질을 가지고 있다.
우리가 VM 머신에서 ubuntu 이미지를 설치받아 실행시키면 그 안에 ubuntu OS로 PC를 키기 위한 모든 것들이 들어있는 것들이 들어있어 별도의 추가 설치가 필요없는 것과 동일한 개념이라고 보면 될 것 같다.
Container를 한마디로 정의한다면 Image를 실행시킨 상태라고 볼 수 있다.
가상화 기술의 하나지만 기존 방식과의 차이는 앞서 언급한 것처럼 기존 가상화는 OS를 가상화한다는 점에서 차이가 있다는 것이다.
Image는 무언가를 실행시키기 위한 모든 정보를 가지고 있기 때문에 용량을 무시할 수 없다.
수정할 부분이 지속하여 생겨 기존 Image를 다운받아 띄우고 살을 붙이고 다시 Image로 묶는 작업을 반복하다보면 결국 비효율적이라는 것을 느끼게 될 것이다.
Docker는 당연히 이러한 방식으로 진행되지 않고 Layer라는 개념이 존재한다.
위 그림을 통해 설명하자면 다음과 같다.
- 최초 ubuntu 이미지를 Container로 실행시킨다.
- Container 상에서 nginx를 ubuntu에 추가 설치한다.
- nginx를 설치하면서 발생한 수정본은 모두 layer의 개념으로 묶인다.
- 만약 현재 기준 저장물을 마지막으로 종료한다면 3번 layer를 포함한 image가 새로 생긴다.
- 다음날 새로 만든 이미지를 Container로 실행시키고 이번엔 webapp 소스를 수정한다.
- webapp 소스를 수정한 것에 대한 수정본이 다시 layer 개념으로 묶인다.
- 만약 현재 기준 저장물을 마지막으로 종료한다면 6번 layer를 포함한 image가 새로 생긴다.
Docker 설치법은 Mac(M1) 기준으로 설명하도록 하겠다.
우선 Docker 공식 홈페이지를 통해 Docker Desktop을 설치한다.
Mac에는 두개의 설치 경로가 존재하지만 M1칩이므로 Apple Chip으로 설치한다.
Docker Desktop을 실행한 후, terminal에서 아래 명령어를 통해 잘 설치되었는지 확인하도록 하자.
docker -v
아래와 같이 버전 정보가 정상적으로 떴다면 성공적으로 설치되었다고 볼 수 있다.
앞서 언급한 것처럼 Docker에 Container를 실행시키기 위해선 image가 필요하다.
docker image 목록을 terminal 상에서 보기 위해선 아래 명령어를 사용하면 된다.
현재는 아무것도 없는 것을 확인할 수 있다.
이제 아래 명령어를 통해 ubuntu 이미지를 설치해보도록 하겠다.
docker pull ubuntu
설치가 완료된 후, image 목록을 다시 한번 확인해보자.
이제 ubuntu 이미지가 docker에 올라간 것을 확인할 수 있을 것이다.
이제 설치한 image를 통해 실행시켜보도록 하자.
docker run --it -name <본인이 원하는 컨테이너명> <실행시킬 이미지명> bash
뒤에 bash를 붙이면 Container를 실행시킴과 동시에 해당 Container의 bash 터미널에 연결을 유지하게 된다.
아래와 같이 접속이 정상적으로 되었다면 지금까지 잘 따라왔다고 볼 수 있다.
bash 명령어를 추가했기 때문에 현재 해당 Container에 접속한 상태이므로 새 Termanal을 통해 컨테이너 목록을 확인해보도록 하자.
현재 실행중인 Container 목록: docker ps
실행 정지된 것까지 포함된 전체 Container 목록: docker ps -a
다음과 같이 현재 실행중인 Container가 정상적으로 출력되는 것을 확인할 수 있다.
이제 방금 띄운 Container로 돌아가 git을 설치해보도록 하자.
apt update
apt install git
이제 지금까지의 수정물을 토대로 두번째 image를 만들도록 하자
우선 현재 Container에서 나오도록 한다.
exit
그 다음 commit을 통해 image를 만들도록 한다.
docker commit <현재 컨테이너명> <레파지토리>:<태그>
마지막으로 현재 image 목록을 확인해보도록 한다.
docker images
위와 같이 정상적으로 만들어졌다면 우리는 docker의 기본적인 동작원리를 한 cycle 돌려봤다고 할 수 있다.