Docker 개념

둥냥둥냥둥·2024년 1월 1일
0
post-thumbnail

도커

개발을 하면서 많이 듣는 단어 도커(Docker)는 대체 무엇일까?

개발 당초에는 도커가 서버 엔지니어를 중심으로 개발환경에서 사용됐으나 지금은 운영 환경은 물론이고 프로젝트 엔지니어의 개발환경에도 널리 도입되기에 이르렀다.

이 때문에 "도커를 배워야겠다"고 초조하면서도 정작 도커가 무엇인지 잘 모르는 개발자 들이 많다.


도커란?

도커를 한마디로 정의하자면 "데이터 또는 프로그램을 격리시키는 기능" 을 제공하는 소프트웨어이다.

이 기능은 주로 서버에 사용된다. 클라이언트 컴퓨터에서도 사용 할 수 있지만 현 시점으로는 서버에서 주로 사용하는 것이 주 용도이다.

개인용 컴퓨터나 서버에는 여러 가지 프로그램을 함께 동작한다. 예를 들자면 우리들의 컴퓨터에 있는 엑셀, 메일 프로그램과 혹은 서버에서의 아파치, MySQL 등 여러 프로그램이 함꼐 동작한다.

도커는 이렇게 다양한 프로그램과 데이터를 각각 독립된 환경에 격이하는 기능을 제공한다. 그것도 운영체제 통째로 격리가 가능하다.

  • 왼쪽 그림
    • 개인용 컴퓨터나 서버에서는 여러 가지 프로그램이 동시에 돌아간다.
  • 오른쪽 그림
    • 도커는 데이터나 프로그램을 독립된 환경에 격리하는 기능을 제공한다.

컨테이너와 도커 엔진

예를 들어, 개인용 컴퓨터 또는 서버 상의 환경을 마치 코스트코에서 판매하는 조립형 창고 같은 작은 방으로 분할히면 어떻게 될까? 그리고 이렇게 작게 쪼갠 독립된 창고에 데이터나 프로그램을 두는 것이다.

이 조립형 창고를 컨테이너(container) 라고 한다. 그리고 이 컨테이너를 다루는 기능을 제공하는 소프트웨어가 도커(Docker) 이다.

도커를 사용하려면 도커 소프트웨어의 본체인 도커 엔진을 설치해야 한다. 그리고 도커 엔진을 사용해 컨테이너를 생성하고 구동시킬 수 있다.

  • 컨테이너는 독립된 조립형 창고와 같다.
    • 도커 엔진을 설치하면 컨테이너를 생성하거나 구동시킬 수 있다.

컨테이너와 이미지

도커 엔진이 있어야 컨테이너를 만들 수 있다고 설명한다. 그러나 컨테이너를 만들려면 도커 엔진 외에도 컨테이너의 빵틀과도 같은 역할을 할 이미지 가 필요하다.

이미지는 종류가 아주 많다. 담고 있는 소프트웨어의 종류에 따라 다양한 이미지를 사용한다. Apache 컨테이너를 만들면 Apache 이미지를 사용하고, MySQL 컨테이너를 만들려면 MySQL 이미지를 사용해야 한다.

컨테이너는 여러 개를 만들 수도 있다. 용량이 허락하는 한 하나의 도커에서 여러 개를 만들 수 있다.

  • 컨테이너를 만들려면 이미지가 필요하다.
    • 용량이 허락하는 한 컨테이너를 얼마든지 올릴 수 있다.
    • Penguin (ver.5.6) 컨테이너를 만들기 위해서는 이미지가 필요하다.
이미지

이미지는 광디스크의 전체 내용을 그대로 파일에 담은 ISO 파일 등을 생각하면 이해하기 쉽다.
ISO 파일을 사용해 원래의 CD나 DVD를 복원할 수 있으므로 서버에서 운영체제나 소프트웨어를 설치하는 데 많이 쓰인다.

현재도 리눅스 운영제체 배포에 널리 쓰인다.

도커 리눅스 컴퓨터에서 사용

도커를 사용하는 데 몇 가지 제약 사항이 있다.

우선 종류와 상관없이 리눅스 운영체제가 필요하다. 윈도우나 macOS에서도 도커를 구동할 수도 있지만 이 경우 내부적으로 리눅스가 사용된다.

또, 컨테이너에서 동작시킬 프로그램도 리눅스용 프로그램이다.

이는 도커가 리눅스 운영체제에서 사용하는 것은 전제로 만들어졌기 때문이다. 윈도우나 macOS에서 도커를 사용하다 보면 이를 잊기 쉬운데, 이런 경우에도 내부적으로는 리눅스 운영체제가 사용된다는 점을 기억해 두자.

  • 윈도우나 macOS에서도 도커를 사용하려면 내부적으로 리눅스 운영체제가 사용된다.
    • Penguin : 컨테이너 안에서 동작하는 프로그램도 리눅스용 프로그램이다.
    • 리눅스 운영체제 : 어떤 형태로든 리눅스 운영체제가 개입된다.


데이터나 프로그램을 독립된 환경에 격리 이유

도커는 주로 서버 환경으 격리하기 위해 사용된다고 말했다. 그렇다면 데이터나 프로그램을 독립된 환격에 격리해야 하는 이유는 뭘까?

데이터는 둘째치고 프로그램을 독립된 환경에 격리해야 하는 이유는 잘 이해가 가지 않을 수 있다.

대부분의 프로그램은 프로그램 단독으로 동작하는 것이 아니라 어떤 실행 환경이나 라이브러니, 다른 프로그램을 이용해 동작한다.

예를 들어, PHP로 동작된 프로그램을 실행하려면 PHP 실행 환경이 필요하고, 파이썬으로 작성된 프로그램은 다른 라이브러리를 사용하는 경우가 많다.

소프트웨어 역시 단일 프로그램이 아니라 여러 개의 프로그램으로 구성된 경우가 많다. 예를 들어, 워드프레스는 MySQL 데이터베이스를 갖추지 않으면 사용할 수 없다.

또한 다른 프로그램과 특정한 폴더 또는 디렛터리를 공유하거나 같은 경로게 설정 정보를 저장하는 경우도 있다.

  • 소프트웨어는 여러 프로그램으로 구성되며, 다른 프로그램과 정보를 공유하기도 한다.

    • 왼쪽 그림
      • 왼쪽 : 워드프레스 프로그램 본체
      • 오른쪽 : 데이터베이스
      • 워드프레스를 실행하려면 데이터베이스가 필요하다.
    • 오른쪽그림
      • 왼쪽 : 시스텝 A, B
      • 오른쪽 : 서로 다른 시스템이지만 같은 디렉터리를 공유하기도 한다.

이 때문에 프로그램 하나를 업데이트하면 다른 프로그램에도 영향을 미치게 된다.

쉽게 예를 들면, (시스템 A)(시스템 B) 모두 '무슨무슨 프로그램'과 연동되는 상황을 생각해보면 된다. (시스템 A) 가 '무슨무슨 프로그램'이 5.0 버전이어야만 동작하도록 만들어졌는데 (시스템 B) 을 위해 '무슨무슨 프로그램'을 8.0 버전으로 업데이트했다면?

시스템 A가 동작하지 않게 될 것이다.

이 예는 공통으로 함께 연동되는 소프트웨어를 예를 들었지만 실행 환경이나 라이브러리, 디렉터리나 설정 파일에서도 같은 일이 일어날 수 있다. 공유 대상을 어느 한쪽만을 위해 수정하면 다른 쪽에서 오류가 발생하게 된다.

  • 프로그램은 단독으로 동작하지 않는다.

이러한 문제가 업데이트할 때만 발생하는 것도 아니다.

서버에서는 여러 프로그램이 함께 동작하므로 서버를 구축할 때부터 신중하게 따져보지 않으면 안 된다.

설계할 때는 문제가 없었던 프로그램끼리도 실제로 설치해보면 오류 일으키는 경우도 있다. 이러한 문제의 원인은 대부분 프로그램 간 공유에 있다.

프로그램에 따라가서는 한 서버에 한 버전밖에 설치할 수 없으므로 최소 번전을 같이 맞춰놓으면 문제가 되지 않는다. 그러나 신규 개발이라면 모를까, 기존 프로그램을 함께 설치하려는 상황이라면 연동 프로그램의 번전을 맞추지 못할 수도 있다.

디렉터리 역시 시스템 A, B가 같은 디렉터리를 사용하게 돼 있어서 설정 파일이 섞이거나 설정에 충돌이 발생할 수도 있다.

프로그램도 한 서버에서 함께 지내려면 사람이 함께 지내는 것 이상으로 신경 쓸 것이 많이 생긴다.

도커 컨테이너는 다른 컨테이너와 완전히 분리된 환경이라고 설명했다. 즉, 컨테이너 안에 들어있는 프로그램은 다른 프로그램과 격리된 상태가 된다.

도커 컨테이너를 사용해 프로그램을 격이하면 여러 프로그램이 한 서버에서 실행되면서 발생하는 문제를 대부분 해경할 수 있다.

예를 들어, 시스템 A가 무슨무슨 프로그램의 5.0 번전을 사용하고, 시스템 B는 무슨무슨 프로그램의 8.0 버전을 사용해야 하는 상황이라면 이들을 세트로 묶어 따로 격리하면 된다.

  • 프로그램의 격리

일반적인 환경에서는 안 대의 서버 혹은 컴퓨터에서 한 번만 설치할 수 있는 소프트웨어가 대부분이다. 워드나 엑셀처럼 버전별로 여러 번을 설치할 수 있는 경우도 있으므로 가능하지 않을까 싶기도 하지만 원칙적으로는 불가능하다고 보는 것이 옳다.

그러나 도커 컨테이너는 완전히 독립된 환경이므로 여러 컨테이너레서 같은 프로그램을 실행할 수 있다. 버전이 완전히 동일해도 상관없다.

profile
Java 먹자

0개의 댓글