현대 소프트웨어 개발의 세계에서 효율성과 일관성은 중요합니다. 개발자와 운영팀은 서로 다른 환경에서 애플리케이션을 원활하게 관리, 배포 및 실행하는 데 도움이 되는 솔루션이 필요합니다.

컨테이너와 도커는 소프트웨어가 구축, 테스트 및 배포되는 방식을 혁신적으로 변화시킨 기술입니다.

기술 세계에 새로운 분야에 들어가거나 도커의 기본을 이해하려는 경우, 본 기사는 기초를 안내해 드릴 것입니다.

목차

컨테이너란 무엇인가?

Docker에 대해 알아보기 전에 먼저 컨테이너를 이해해 봅시다. 프로젝트를 작업 중이라고 상상해보세요. 응용 프로그램이 노트북에서 완벽하게 작동하는 것을 상상해보세요. 그러나 동일한 응용 프로그램을 다른 기계에서 실행하려고 하면 실패합니다. 이는 종종 환경의 차이 때문입니다: 다른 운영 체제, 설치된 소프트웨어 버전 또는 구성의 차이 때문입니다.

컨테이너는 응용 프로그램 및 라이브러리, 프레임워크 및 구성 파일과 같은 모든 종속성을 하나의 표준화된 단위로 패키징하여 이 문제를 해결합니다. 이를 통해 응용 프로그램이 배포된 위치에 관계없이 동일하게 작동함이 보장됩니다. 노트북, 서버 또는 클라우드 등

컨테이너의 주요 기능:

  • 가벼움: 컨테이너는 가상 머신(VM)과 달리 호스트 시스템의 커널을 공유하여 별도의 운영 체제 인스턴스가 필요하지 않으므로 더 빠르고 효율적입니다.

  • 휴대용: 한 번 구축된 컨테이너는 다양한 환경에서 일관되게 실행될 수 있습니다.

  • 격리됨: 컨테이너는 격리된 프로세스에서 실행되며, 동일한 시스템에서 실행 중인 다른 응용 프로그램에 영향을주지 않습니다.

도커란 무엇인가요?

이제 컨테이너에 대해 이해했으니, 컨테이너를 주류로 만든 플랫폼인 도커에 대해 이야기해 보겠습니다.

도커는 컨테이너를 생성, 관리 및 배포하는 프로세스를 간소화하기 위해 설계된 오픈 소스 도구입니다. 2013년 출시된 도커는 사용 편의성, 커뮤니티 지원 및 강력한 도구 생태계로 인해 컨테이너화의 대표 솔루션이 되었습니다.

도커의 주요 개념

  1. 도커 이미지: 도커 이미지를 컨테이너의 청사진으로 생각해보세요. 코드, 라이브러리 및 시스템 종속성을 포함하여 애플리케이션을 실행하는 데 필요한 모든 것이 포함되어 있습니다. 이미지는 Dockerfile에 작성된 일련의 명령으로 작성됩니다.

  2. Docker Containers: 컨테이너는 도커 이미지의 실행 중인 인스턴스입니다. 컨테이너를 생성하고 시작하면 도커가 이미지를 격리된 환경으로 런칭하여 응용 프로그램을 실행할 수 있습니다.

  3. Dockerfile: 이는 도커 이미지를 생성하는 데 필요한 단계가 포함된 텍스트 파일입니다. 여기서 컨테이너가 어떻게 보일지, 기본 이미지, 응용 프로그램 코드 및 추가적인 종속성을 정의합니다.

  4. Docker Hub: 도커 허브는 개발자들이 미리 빌드된 이미지를 공유하고 액세스할 수 있는 공개 레지스트리입니다. 일반적인 응용 프로그램이나 기술 스택을 사용 중이라면 도커 허브에 이미지가 이미 존재할 가능성이 높아 시간을 절약할 수 있습니다.

  5. Docker Compose: 여러 컨테이너가 필요한 애플리케이션(예: 웹 서버 및 데이터베이스)에 대해 Docker Compose를 사용하면 간단한 YAML 파일을 사용하여 다중 컨테이너 환경을 정의하고 관리할 수 있습니다.

왜 Docker를 사용해야 하는가?

Docker의 인기는 다음과 같은 다양한 개발자가 오늘날 직면하는 문제를 해결할 수 있는 능력에서 비롯됩니다:

  • 환경 간 일관성: 개발자들은 “한 번 빌드하고 어디에서나 실행”하여 로컬 개발부터 프로덕션까지 다양한 환경에서 동일한 애플리케이션이 동일한 방식으로 작동함을 보장할 수 있습니다.

  • 속도: Docker 컨테이너는 시작 및 중지가 빠르기 때문에 테스트 및 배포 파이프라인에 이상적입니다.

  • 리소스 효율성: 컨테이너는 가상 머신보다 호스트 시스템의 리소스를 더 효율적으로 공유하기 때문에 오버헤드를 줄이고 배포에서 더 높은 밀도를 가능하게 합니다.

  • 애플리케이션 버전 관리: Docker를 사용하면 코드뿐만 아니라 코드가 실행되는 환경도 버전 관리할 수 있습니다. 이는 특히 이전 버전으로 롤백하거나 프로덕션에서 문제를 디버깅하는 데 유용합니다.

Docker 아키텍처

Docker를 처음 사용할 때는 단순히 “작동하는 상자”로 취급할 수 있습니다. 시작하기에는 괜찮지만 Docker의 아키텍처에 대한 깊은 이해는 문제를 해결하고 성능을 최적화하며 컨테이너화 전략에 대해 정보를 제공하는 데 도움이 될 것입니다.

Docker의 아키텍처는 효율성, 유연성 및 확장성을 보장하도록 설계되었습니다. 여러 구성 요소로 구성되어 있으며 이러한 구성 요소가 함께 작동하여 컨테이너를 생성, 관리 및 실행합니다. 각 구성 요소를 자세히 살펴보겠습니다.

Docker 아키텍처: 주요 구성 요소

Docker의 아키텍처는 다음 구성 요소를 포함하는 클라이언트-서버 모델을 중심으로 구축되어 있습니다.

  • Docker 클라이언트

  • Docker 데몬 (dockerd)

  • Docker 엔진

  • Docker 이미지

  • Docker 컨테이너

  • Docker 레지스트리

1. Docker 클라이언트

Docker 클라이언트는 사용자가 Docker와 상호 작용하는 주요 방법입니다. REST API를 사용하여 Docker 데몬에 명령을 보내는 명령줄 도구입니다. docker build, docker pull, docker run과 같은 명령은 Docker 클라이언트에서 실행됩니다.

docker run nginx과 같은 명령을 입력하면 Docker 클라이언트가 Docker 데몬이 이해하고 처리할 수 있는 요청으로 번역합니다. 기본적으로 Docker 클라이언트는 Docker의 보다 복잡한 백엔드 구성 요소와 상호 작용하기 위한 프론트 엔드 역할을 합니다.

2. Docker 데몬 (dockerd)

Docker 데몬인 dockerd는 전체 Docker 작업의 핵심입니다. Docker 클라이언트에서 요청을 수신하고 컨테이너, 이미지, 네트워크 및 볼륨과 같은 Docker 개체를 관리하는 백그라운드 프로세스입니다.

다음은 Docker 데몬이 책임지는 내용입니다.

  • 컨테이너 빌드 및 실행: 클라이언트가 컨테이너를 실행하는 명령을 보내면 데몬이 이미지를 가져와 컨테이너를 생성하고 시작합니다.

  • 도커 자원 관리: 데몬은 네트워크 구성 및 볼륨 관리와 같은 작업을 처리합니다.

  • 도커 데몬은 호스트 머신에서 실행되며 REST API, Unix 소켓 또는 네트워크 인터페이스를 사용하여 도커 클라이언트와 통신합니다. 또한 컨테이너 런타임과 상호 작용하는 것도 책임집니다. 컨테이너 런타임은 실제 컨테이너 실행을 처리합니다.

3. 도커 엔진

도커 엔진은 도커의 핵심 부분입니다. 클라이언트, 데몬 및 컨테이너 런타임을 결합하여 전체 플랫폼을 작동시킵니다. 도커 엔진은 Linux, Windows, macOS 등 다양한 운영 체제에서 실행할 수 있습니다.

도커 엔진에는 두 가지 버전이 있습니다.

  • 도커 CE (커뮤니티 에디션): 개인 및 소규모 프로젝트에 널리 사용되는 무료 오픈 소스 도커 버전입니다.

  • 도커 EE (엔터프라이즈 에디션): 유료 엔터프라이즈 수준의 도커 버전으로, 향상된 보안, 지원 및 인증과 같은 추가 기능을 제공합니다.

Docker 엔진은 컨테이너 오케스트레이션의 복잡성을 간단하게 만들어주며, 빌드, 실행 및 관리에 필요한 다양한 구성 요소를 통합합니다.

4. Docker 이미지

Docker 이미지는 코드, 라이브러리, 종속성 및 구성을 포함하는 읽기 전용 템플릿으로, 응용 프로그램이 실행하는 데 필요한 모든 것을 담고 있습니다. 이미지는 컨테이너의 구성 요소입니다. 컨테이너를 실행하면 사실상 Docker 이미지 위에 쓰기 가능한 레이어가 생성됩니다.

Docker 이미지는 일반적으로 Dockerfile에서 작성되며, 이미지를 빌드하는 방법에 대한 지침을 포함하는 텍스트 파일입니다. 예를 들어, 기본 Dockerfile은 nginx 또는 ubuntu와 같은 베이스 이미지로 시작하고 파일 복사, 종속성 설치 또는 환경 변수 설정과 같은 명령을 포함할 수 있습니다.

다음은 Dockerfile의 간단한 예시입니다.

dockerfileCopy codeFROM nginx:latest
COPY ./html /usr/share/nginx/html
EXPOSE 80

이 예시에서는 공식 Nginx 이미지를 베이스로 사용하고 로컬 HTML 파일을 컨테이너의 웹 디렉터리로 복사합니다.

이미지를 빌드한 후에는 Docker 레지스트리에 저장하고 다른 사람과 공유할 수 있습니다.

5. Docker 컨테이너

Docker 컨테이너는 Docker 이미지의 실행 중인 인스턴스입니다. 가벼우며 다른 컨테이너와 격리되어 있지만, 호스트 운영 체제의 커널을 공유합니다. 각 컨테이너는 자체 파일 시스템, 메모리, CPU 할당 및 네트워크 설정을 갖추어 이식성이 있고 재현 가능하도록 합니다.

컨테이너는 생성, 시작, 중지 및 삭제할 수 있으며, 재부팅 사이에 지속될 수도 있습니다. 컨테이너는 이미지 기반으로 작동하므로 애플리케이션이 실행되는 위치에 관계없이 동일한 방식으로 작동합니다.

도커 컨테이너의 몇 가지 주요 특성:

  • 격리: 컨테이너는 서로 및 호스트와 격리되어 있지만, 여전히 동일한 OS 커널을 공유합니다.

  • 이식성: 컨테이너는 로컬 머신, 가상 머신 또는 클라우드 제공업체 등 어디에서나 실행될 수 있습니다.

6. 도커 레지스트리

도커 레지스트리는 도커 이미지가 저장되고 배포되는 중앙 집중식 장소입니다. 가장 인기 있는 레지스트리는 도커 허브로, 수백만 개의 공개 이미지가 호스팅되고 있습니다. 조직은 또한 자신들의 이미지를 안전하게 저장하고 배포하기 위해 개인 레지스트리를 설정할 수 있습니다.

도커 레지스트리는 몇 가지 주요 기능을 제공합니다:

  • 이미지 버전 관리: 이미지는 태그를 사용하여 버전 관리되며, 애플리케이션의 다양한 버전을 쉽게 관리할 수 있습니다.

  • 접근 제어: 레지스트리는 공개 또는 비공개일 수 있으며, 역할 기반 접근 제어를 통해 누가 이미지를 가져오거나 푸시할 수 있는지를 관리합니다.

  • 배포: 이미지는 레지스트리에서 가져와 어디에서나 배포할 수 있어, 컨테이너화된 애플리케이션을 쉽게 공유하고 재사용할 수 있습니다.

도커의 컨테이너 런타임: containerd

도커 아키텍처의 최근 중요한 발전 중 하나는 containerd의 사용입니다. 도커는 이전에 자체 컨테이너 런타임을 가지고 있었지만, 이제는 산업 표준을 따르는 컨테이너 런타임인 containerd를 사용하며, 이는 Kubernetes와 같은 다른 플랫폼에서도 사용됩니다.

  1. containerd는 다음을 담당합니다

    • 컨테이너 시작 및 중지

    • 컨테이너의 저장소 및 네트워킹 관리

    • 레지스트리에서 컨테이너 이미지 가져오기

컨테이너 런타임을 도커의 상위 수준 기능에서 분리함으로써 도커는 모듈화가 더욱 가능해져 다른 도구들이 컨테이너를 사용하고 도커는 사용자를 직면한 기능에 집중할 수 있게 되었습니다.

도커를 사용하여 간단한 컨테이너 만들기 방법

리눅스 이미지 다운로드

먼저 도커 허브에서 alpine 이미지를 다운로드합니다. alpine 이미지는 경량이고 빠른 것을 목표로 하는 최소한의 리눅스 배포판입니다.

다음 명령을 실행합니다:

docker pull alpine

이렇게 하면 alpine 이미지가 로컬 시스템에 다운로드됩니다.

컨테이너 실행

alpine 이미지를 사용하여 컨테이너를 생성하고 시작합니다. 또한 컨테이너 내에서 터미널 세션을 실행할 것입니다.

docker run -it alpine /bin/sh

각 옵션이 의미하는 바는 다음과 같습니다:

  • docker run: 새로운 컨테이너를 생성하고 시작합니다.

  • -it: 컨테이너와 상호작용할 수 있게 합니다 (대화형 모드 + 터미널).

  • alpine: 사용할 이미지를 지정합니다.

  • /bin/sh: 컨테이너 내에서 실행할 명령을 지정합니다 (이 경우 셸 세션).

컨테이너 탐색

컨테이너가 실행되면 다음과 같이 보이는 셸 프롬프트가 표시됩니다

/ #

이것은 알파인 리눅스 컨테이너 내부에 있다는 것을 나타냅니다. 이제 Linux 명령을 실행할 수 있습니다. 예를 들면:

현재 디렉토리 확인:

pwd

디렉토리의 파일 목록 표시:

ls

출력: 경량 이미지인 알파인의 최소한의 디렉토리 구조입니다.

또한 패키지를 설치할 수도 있습니다 (알파인은 패키지 관리자로 apk을 사용합니다):

apk add curl

컨테이너에서 나오기

탐색을 마치면 세션을 종료하고 컨테이너를 중지하려면 exit를 입력하세요

bashCopy codeexit

중지된 후에 컨테이너에 액세스하기

중지한 후에 다시 컨테이너에 액세스하려면 모든 컨테이너를 나열하는 이 명령을 사용할 수 있습니다 (중지된 것 포함):

docker ps -a

컨테이너의 ID와 상태가 포함된 컨테이너 목록이 표시되며, 그런 다음 중지된 컨테이너를 시작할 수 있습니다:

docker start <container-id>

이 명령을 사용하여 컨테이너의 셸에 연결할 수 있습니다:

docker exec -it <container-id> /bin/sh

더 이상 컨테이너가 필요하지 않은 경우 삭제할 수 있습니다

  1. 컨테이너를 중지합니다 (아직 실행 중인 경우):

     docker stop <컨테이너 ID>
    
  2. 컨테이너 제거:

     docker rm <컨테이너-id>
    

중요 도커 명령어 개요

명령어 설명
docker pull alpine Alpine Linux 이미지를 다운로드합니다.
docker run -it alpine /bin/sh 대화식 컨테이너를 생성하고 시작합니다.
docker ps -a 모든 컨테이너(실행 중인 것과 중지된 것)를 나열합니다.
docker start <container-id> 중지된 컨테이너를 시작합니다.
docker exec -it <container-id> 실행 중인 컨테이너에 첨부합니다.
docker stop <container-id> 실행 중인 컨테이너를 중지합니다.
docker rm <container-id> 중지된 컨테이너를 제거합니다.

마무리

기본적인 이해를 갖게 되었으니, 지식을 활용해보는 시간입니다. Docker를 실험해보고 첫 번째 컨테이너를 작성하고 그 방대한 생태계를 탐험해보세요.

곧 현대적인 데브옵스와 소프트웨어 엔지니어링의 중심 요충지가 된 이유를 알게 될 것입니다.

저를 팔로우할 수 있습니다.