도커 용어 및 개념 정리
Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼입니다. Docker는 앞에서 배운 리눅스 컨테이너를 만들고 사용할 수 있도록 하는 컨테이너화 기술입니다.
이제 우리는 도커 없이 개발하며 이상할지도 모르는 세상입니다. 무조건 알아둬야 하는 개념이고 쓰면 단점이 없는 기술이라고 생각합니다.
그래서 여러분들이 깊게는 몰라도 개념과 자신의 개발환경 정도는 로컬에서 띄어볼 수 있도록 만들어 보는 것은 상당히 중요하다고 생각합니다. 생각보다 어렵지 않으니 개념을 익히고 제가 React 개발 할때, docker 환경 셋팅(정말 간단함)도 보여드리도록 하겠습니다.
이미지
컨테이너 실행에 필요한 파일과 설정 값등을 포함하는 것으로, 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행파일 들을 묶는 형태를 이미지라고 합니다.
예를 들어, 우분투 이미지는 우분투를 실행하기 위한 모든 파일들을 가지고 있고, 이 이미지를 실행하게 되면 우분투 컨테이너가 생성됩니다.
- 도커 이미지는 github와 마찬가지로 버전 관리를 할 수 있으며, DockerHub에서 이러한 서비스를 제공합니다.
- 다양한 API를 제공하기 때문에 자동화가 가능합니다.
- 도커는 Dockerfile이라는 파일로 이미지를 만듭니다. 이 Dockerfile에는 소스와 함께 설정 파일 같은 것들을 버전 관리 하기 쉽도록 명시되어집니다.
만약 저의 경우, React나 Vue 또는 그냥 바닐라 JS 개발을 할텐데 이때 제가 사용해야 할 이미지는 노드 이미지입니다.
사용하는 라이브러리들에 맞춰 node버전을 정확히 명시하여 이미지를 만듭니다.
도커의 이미지는 컨테이너를 만드는 '압축파일'이라고 생각하면 이해가 편합니다.
레이어
기존 이미지에 추가적인 파일이 필요할 때 새로운 이미지를 다시 다운로드 받지 않고 파일을 추가하기 위한 개념입니다.
처음 컨테이너를 만들기 위해서 이미지를 다운로드하는 건 당연합니다.
그런데 이미지의 불변성 때문에 현재 이미지에 수정사항이 생겨 파일을 단 하나 추가된 이미지를 새로 다운로드한다고 가정하면,
기존 이미지에 파일 하나 추가했다고 이미지를 다시 다운 받는건 어떻게 보면 비효율적이기 때문에 도커에서는
레이어(layer)라는 개념을 사용하고 유니온 파일 시스템을 이용하여 여러개의 레이어를 하나의 파일시스템으로 사용할 수 있게 해줍니다.
우분투를 구동하기 위한 라이브러리A, B, C가 있다고 했을 때 이를 레이어A, 레이어B, 레이어C로 구성하여 묶은 것을 이미지로 사용하게 되는 것입니다.
처음으로 만들어진 ubuntu 이미지의 레이어들은 변경할 수가 없습니다(read only)
하지만 nginx라는 라이브러리를 설치한 이미지에는 nginx 레이어가 추가적으로 생성이 된다는 개념으로, ubuntu 이미지에 새로 추가된 레이어를 묶어서 nginx 이미지로 다시 포장할 수가 있습니다.
이때 DockerHub에서 공유된 이미지에서 Pull을 한다면 새로 추가된 nginx의 이미지만 Pull이 된다.
컨테이너
이미지를 실행한 상태
다른 실행환경과의 간섭을 막고, 실행의 독립성을 확보합니다.
- 컨테이너가 종료되어도 메모리에선 삭제가 되지 않고 남아 있습니다. 이를 삭제하려면 명시적으로 삭제해야 합니다.
- 컨테이너를 삭제하는 것은 컨테이너에서 생성한 파일이 사라진다는 것을 의미합니다. 예를 들어, 데이터베이스 스키마를 삭제하면 그 안의 테이블이 모두 사라지는 것처럼요.
- 한 서버는 여러 개의 컨테이너를 가질 수 있고, 이 컨테이너들은 독립적으로 운용이됩니다.
- 마지막으로 컨테이너는 커널 공간과 호스트OS의 자원을 공유합니다.
로컬 머신에서 컨테이너 내부의 서비스에 접근할 때는 localhost 또는 127.0.0.1 대신에 docker.for.mac.localhost를 사용할 수 있습니다. 포트는 컨테이너 내부의 서비스가 사용하는 포트와 동일하게 매핑해주어야 합니다. ( 무조건은 아니지만...)
예를 들어, 로컬에서 8080 포트로 실행 중인 컨테이너 내부의 서비스에 접근하려면 http://docker.for.mac.localhost:8080 또는 127.0.0.1:8080 과 같이 접근할 수 있습니다.
마무리
도커를 사용하기 위한 개념 3가지를 설명했습니다. 사실 도커 네트워크, 도커 컴포즈 등등 도커에 관한 것들은 많지만 우리는 사실 이정도만 알아도 도커를 간단하게 띄우는 것 자체는 무리가 없습니다.
도커 이미지는 Docker Hub에 무수히 많은 이미지가 있기 때문에 사용자가 필요한 것을 다운받아 쓴다고 생각하시면 됩니다.
그래서 내 개발환경을 알고 환경에 맞는 이미지를 다운 받고 컨테이너를 실행시키면 누구나 같은 환경( js라면 같은 노드버전)에서 애플리케이션을 개발하거나 실행시킬 수 있게 됩니다.