[DevOps] Docker 기초

young-gue Park·2024년 1월 18일
0

DevOps

목록 보기
1/13
post-thumbnail

⚡ Docker 기초


📌 Docker란?

🔷 데이터 또는 프로그램을 격리시키는 기능을 제공하는 소프트웨어

  • 주로 서버에 사용되며 클라이언트 컴퓨터에서도 사용할 수 있다.
  • 다양한 프로그램과 데이터를 운영체제(비슷한 것)와 통째로 각각 독립된 환경에 격리하는 기능을 제공한다.

💡 운영체제 비슷한 것이라고 표현한 이유는, 운영체제 비슷한 무언가일 뿐, 실제 운영체제는 아니기 때문이다. 아래에 더 자세히 설명한다.

⚓ 컨테이너(Container)와 도커 엔진(Docker Engine)

🔷 개인용 컴퓨터 또는 서버 상의 환경을 작게 분할하여 데이터나 프로그램을 넣는데, 이 때 분할한 공간을 컨테이너라고 한다.

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

    💡 도커 엔진이라는 배 위에 각각 다른 프로그램이 든 컨테이너를 새로 올려놓는 그림을 연상하면 쉽다.

⚓ 이미지(Image)

🔷 컨테이너를 만들기 위한 틀과 같은 역할을 하는 것을 이미지라고 한다.

  • 이미지의 종류눈 매우 다양하며, 담고 있는 소프트웨어의 종류에 따라 다양한 이미지를 사용한다.
  • 용량이 허락하는 한 하나의 도커에서 여러 개의 컨테이너를 만들 수도 있다.

💡 이미지는 CD나 DVD를 만드는 ISO 파일과 비슷한 개념이다.

⚓ 제약사항

🔷 도커는 종류와 상관없이 리눅스(Linux) 운영체제를 필요로 한다.

  • 윈도우나 macOS에서도 도커를 구동할 수는 있지만 이 경우 내부적으로 리눅스가 사용된다.
  • 컨테이너에서 동작시킬 프로그램도 리눅스용 프로그램이다.
  • 도커가 리눅스 운영체제에서 사용하는 것을 전제로 만들어졌기 때문에 그렇다.

💡 도커 엔진 아래에 반드시 리눅스라는 받침이 있어야하고, 컨테이너 안에서 동작하는 프로그램들도 리눅스용임을 명심하자.


📌 Docker를 사용하는 이유

⚓ 데이터나 프로그램을 독립된 환경에 격리해야 하는 이유

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

  • 대부분의 프로그램은 프로그램 단독으로 동작하는 것이 아니라 어떤 실행 환경이나 라이브러리, 다른 프로그램을 이용해 동작한다.
  • 소프트웨어 역시 단일 프로그램이 아니라 여러 개의 프로그램으로 구성된 경우가 많다.
  • 또한 다른 프로그램과 특정한 폴더 또는 디렉터리를 공유하거나 같은 경로에 설정 정보를 저장하는 경우도 있다.

👉 그래서 하나의 프로그램이 업데이트되면 다른 프로그램에도 영향을 미치게 된다. 이는 소프트웨어 뿐만이 아니라 실행 환경, 라이브러리, 디렉터리, 설정 파일 모두 마찬가지다.

🔷 최소 버전을 같이 맞춰놓지 않는 경우, 프로그램 간 공유에서 문제 발생 확률이 높다.

  • 성격이 맞지않는 사람끼리 동거할 때도 충돌하는 부분이 생기듯이, 버전이 맞지 않는 프로그램 간 공유에서도 문제 발생은 필연적이다.
  • 사람의 성격과 프로그램의 버전을 동일선상에 놓고 생각하면 이해가 갈 것이다.

⚓ 프로그램의 격리

🔷 도커 컨테이너는 다른 컨테이너와 완전히 분리된 환경이다

  • 여러 프로그램이 하나의 서버에서 실행되면서 발생하는 문제를 대부분 해결할 수 있다.
  • 또한 도커 컨테이너는 완전히 독립된 환경이므로 버전까지 동일한 같은 프로그램을 동시에 여러 컨테이너에서 실행할 수 있다.

📌 서버

🔷 도커는 서버에서 사용되는 소프트웨어다. 그래서 도커에서의 서버의 의미를 확실히 알고 넘어가는 것이 좋다.

🔷 기본적으로 서버는 "어떤 서비스(service)를 제공(serve)하는 것"을 의미한다.

⚓ 서버의 두 가지 의미

🔷 기능적 의미의 서버

  • 어떠한 기능을 제공하는 서버

ex) 메일 서버 = 메일 기능을 제공한다.

🔷 물리적 컴퓨터로서의 서버

  • 실물, 어딘가에 물리적으로 존재함을 의미
  • 하나의 물리적 컴퓨터로서의 서버에 여러 개의 기능적 의미의 서버를 함께 둘 수 있다.

🔷 서버는 개인용 컴퓨터와 마찬가지로 운영체제가 동작하고, 그 위에 소프트웨어를 실행하는 것은 똑같다.

  • 그래서 서버의 기능 역시 특별할 것이 없다.
  • 서버의 기능은 소프트웨어가 제공하는 것으로, 소프트웨어를 설치하면 서버의 기능을갖게 된다.
  • 서버를 만든다는 것은 소프트웨어를 설치해 그 기능을 갖춘다는 말과 같다.

👉 여러가지 소프트웨어를 한 컴퓨터에 설치할 수도 있다는 말, 이는 곧 여러 기능적 의미의 서버가 하나의 물리적 컴퓨터에 함께 존재할 수 있는 이유를 보여준다.

💡 서버의 역할 특성상 서버용 운영체제를 사용하게 되는데 여기서 리눅스 또는 유닉스 계열이 주로 사용된다. 서버용 소프트웨어도 리눅스가 다수를 차지한다. 리눅스 계열의 Debian, Ubuntu, CentOS 등이 유명하다. 필자도 한번씩 다뤄본 적 있는 것들이다.

⚓ 도커와 서버

  1. 도커는 예산이 부족해 한 대의 서버에서 실행하던 수 많은 서버를 각각 독립적인 환경에서 안전하게 운용할 수 있다.

  2. 컨테이너 기술을 활용하면 여러 개의 웹 서버를 올릴 수 있어 매우 편리하다. 이를 통해 물리 서버 수를 줄일 수 있다.

🌟 컨테이너를 쉽게 옮길 수 있다는 것은 매우 큰 장점이다.

  • 컨테이너의 정보를 내보내기한 다음, 다른 도커 엔진에서 복원하는 형태로, 이는 그리 어려운 일이 아니다.
  • 이런 특성 덕에 똑같은 상태로 튜닝한 컨테이너를 팀원 전원에게 배포해 모두가 동일한 개발환경을 사용할 수 있다.

👉 도커를 이용하면 물리적 환경의 차이, 서버 구성의 차이를 무시할 수 있으므로 운영 서버와 개발 서버의 환경 차이로 인한 문제를 원천적으로 방지할 수 있다.


📌 도커의 구조

운영체제의 역할을 모른다면 이 파트에서 헤맬 수 있다.
운영체제 1

(직접 제작해서 조금 조악한 그림이지만... 이해 바랍니다...)

🔷 리눅스 운영체제가 2개가 들어가는 구조처럼 보인다.

  • 도커 엔진 아래에 리눅스 운영체제가 있다는 사실은 위에서도 언급했었다.
  • 컨테이너 속에는 리눅스 운영체제와 비슷한 무언가가 항상 들어있다. (진짜 리눅스 운영체제는 아님)

👉 이는 도커의 가장 큰 특징이다!

  1. 본래 운영체제는 커널주변 부분으로 구성되는데 주변 부분이 프로그램의 연락 내용을 커널에 전달하고 커널이 하드웨어를 다룬다.

  2. 도커에서는 컨테이너가 완전히 분리돼 있으므로 밑바탕이 되는 리눅스 운영체제의 주변 부분이 컨테이너 속 프로그램의 명령을 전달받을 수 없다.

  3. 그래서 컨테이너 속에 운영체제의 주변 부분이 들어 있어 프로그램의 명령을 전달받고 이를 밑바탕이 되는 커널에 전달하는 구조로 되어 있다.

(컨테이너 내부)

🔷 커널은 밑바탕에 있는 것을 빌려 쓰고 주변 부분만 컨테이너에 넣은 형태 덕에 도커의 가장 큰 특징인 가벼움을 얻을 수 있다.

💡 주변 부분은 프로그램에서 명령을 전달받거나 커널이 실행한 결과를 프로그램에 다시 전달하는 역할을 한다. 키보드로 입력한 내용을 전달받고 모니터에 데이터를 출력하는 것이 이러한 예다. 이 주변 부분을 커널과 합친 패키지가 배포판이다. 널리 알려진 배포판으로 레드햇과 CentOS, 우분투 등이 있다. 커널만으로 리눅스를 사용하는 경우는 거의 없으며, 배포본 형태로 사용하게 되므로 "난 우분투 리눅스를 써"라고 하듯 배포판의 이름으로 구별하는 경우가 많다.

💡 도커에 대한 이야기가 서버 환경을 전제로 한 것이 많은 이유도 도커는 기본적으로 서버에서 주로 사용되는 운영체제인 리눅스용이기 때문이다.

🤔 그럼 윈도우나 macOS에서는 어떻게 돌림...?
-> VMware 같은 가상 환경 위에 리눅스 운영체제를 설치하고 그 위에서 도커를 실행하는 방법과 '윈도우 or macOS용 도커 데스크톱'을 설치하는 방법이 있다. 후자의 경우에는 도커를 실행하는 데 필요한 리눅스 운영체제를 포함하는 패키지를 설치하기 때문에 가능하다.


📌 도커 컨테이너와 이미지

🔷 하나의 금형으로 공장에서 물건을 대량 생산하듯이, 하나의 이미지로 똑같은 컨테이너를 여러 개 만들 수 있다.

🔷 반대로 만들어진 컨테이너를 개조해서 새로운 이미지를 만들 수도 있다.

  • 이렇게 새로 생성한 이미지를 이용해 다수의 서버를 준비할 수 있다.
  • 또한 이 이미지를 다른 물리 서버에 설치된 도커 엔진의 컨테이너로 만들 수 있으니 마치 컨테이너가 이동한 것과 같은 효과를 얻을 수 있다.

⚓ 도커 허브(Docker hub)

🔗 도커 허브

🔷 이미 우리가 잘 알고 있는 소프트웨어들은 대다수가 도커 허브에 이미지로 등록되어있다.

  • 도커 허브는 공식적으로 운영되는 도커 레지스트리(도커 이미지를 배포하는 서비스)의 이름으로, 공개된 컨테이너 이미지가 모여 있는 곳이다. 이 곳에서 원하는 컨테이너의 이미지를 내려받을 수 있다.

    회사 같은 경우에는 사내 서버로 비공개 도커 레지스트리를 두는 경우도 있다.

  • 안전한 컨테이너 이미지를 고르기 위해 공식 이미지를 사용하는 것을 권장한다.

  • 아니면 커스텀 이미지를 직접 만들어 사용해보아도 좋을 것이다.

💡 이미지를 이용해 한 컨테이너에 여러 개의 프로그램을 넣는 것도 가능하다. 물론 이는 유지보수나 도커의 장점을 누리기 어렵기 때문에 추천되지 않는 방식이지만 모든 프로그램을 넣은 컨테이너는 바로 실행할 수 있다는 장점 덕에 개발자들에겐 자주 쓰인다.

profile
Hodie mihi, Cras tibi

0개의 댓글