도커(Docker)는 데이터 또는 프로그램을 격리 시키는 기능을 제공하는 소프트웨어이다.
주로 '서버 컴퓨터'에서 사용하며 클라이언트 컴퓨터(개인 컴퓨터)에서도 사용 가능하지만 서버에서 사용하는 것이 주 용도이다.
컨테이너(Container)와 도커 엔진(Docker Engine)
컴퓨터 안의 환경을 코스트코에서 판매하는 조립형 창고 같은 작은 방으로 분할하여 작게 쪼갠 독립된 창고에 데이터나 프로그램을 두는 것을 생각해보자. 이 조립형 창고를 '컨테이너'라고 한다.
이 컨테이너를 다루는 기능을 제공하는 소프트웨어를 '도커'라고 한다.
도커 소프트웨어의 본체를 '도커 엔진'이라 하고 도커 엔진으로 컨테이너를 생성하고 구동시킨다.
컨테이너는 여러개 만들 수 있으며 용량이 되는한 하나의 도커에서 여러 개의 컨테이너를 만들 수 있다.
컨테이너를 만들기 위한 필수 재료 이미지(Image)
컨테이너를 만들려면 도커 엔진뿐만 아니라 빵틀과도 같은 역할을 할 '이미지'가 필요하다.
이미지 종류는 엄청 많으며 소프트웨어의 종류에 따라 다양한 이미지를 사용한다.
예를들어 구글 크롬 컨테이너를 만드려면 구글 크롬 이미지가 필요하고, 엣지 컨테이너를 만드려면 엣지 이미지가 필요하다.
도커는 리눅스 전용
윈도우나 macOS에서도 도커를 사용할 수 있지만 내부적으로는 '리눅스'가 사용된다.
컨테이너를 동작시킬 프로그램도 리눅스용 프로그램이다.
어떤 형태로든 리눅스 운영체제가 개입되기 때문에 리눅스에서 동작하는게 좋다.
애초에 서버 컴퓨터에서는 보통 리눅스 운영체제를 사용한다.
데이터나 프로그램을 왜 격리할까?
AI를 공부하는 입장에서 설명하면 아마 아나콘다를 사용하는 이유와 같을 것이다.
github에는 여러 개발자들이 공개한 오픈소스가 있다.
문제는 오픈소스마다 필요한 파이썬 패키지가 다르고 같은 파이썬 패키지여도 패키지 버전이 다르고 심지어는 파이썬 자체 버전도 다를 수가 있다.
예를들어 오픈소스1과 2를 다운했다 가정해보자. 오픈소스1은 파이썬 패키지 pytorch 1.13.1 버전에서 문제 없이 실행이 가능하고 오픈소스2는 pytorch 1.11.0 버전에서 문제 없이 실행이 가능하다.
이럴 경우 pytorch 1.13.1과 pytorch 1.11.0을 동시에 다운해서 사용하면 디렉터리를 공유하기 때문에 충돌이 발생할 것이다.
그외에도 오픈소스1은 파이썬 3.8을 기준으로 개발되었고 오픈소스2는 파이썬 3.10을 기준으로 개발된 경우에 파이썬을 내 컴퓨터에 프로그램 실행할 때마다 버전을 바꿔야한다.
어쨋든 대부분 프로그램 간 라이브러리를 공유하기 때문에 충돌이 발생할 확률이 높다.
따라서, 서로 독립된 공간이 필요하고 도커는 이를 컨테이너로 제공해주는 것이다.
프로그램 격리
컨테이너 안의 프로그램은 컨테이너 외부 프로그램 or 다른 컨테이너 내부 프로그램과 완전히 분리된다.
즉, 다른 프로그램과 완전히 격리된 상태가 된다.
컨테이너는 완전히 독립된 환경이므로 여러 컨테이너에서 같은 프로그램이지만 다른 버전, 서로 완전히 다른 개발 환경을 구축해도 충돌이 발생하지 않는다.
서버의 두 가지 의미
'서버'란 무엇일까? 서버(Serever)는 이름 그대로 어떤 서비스(Service)를 제공(Serve)하는 것을 말한다.
개발 현장에서 서버는 '기능적 의미의 서버'와 '물리적 컴퓨터로서의 서버' 두가지 의미를 갖는다.
기능적 의미의 서버는 우리가 ~~서버라고 부르는 서버들을 의미한다. 예를들어 웹서버는 웹 기능을 제공하는 서버이고 메일서버는 메일 기능을 제공하는 서버이다.
물리적 컴퓨터로서의 서버는 회사같은데 실제 커다란 본체안에 실물로 있는 서버를 의미한다. 물리적 컴퓨터로서의 서버는 여러 개의 기능적 의미의 서버를 함께 둘 수 있다. 웹 서버이자 메일 서버일 수도 있다.
서버는 일반 개인용 컴퓨터와 똑같다. 다만 여러 사람이 원격으로 접근해 사용하기 때문에 개인용 컴퓨터 보다는 성능이 좋아야 한다. 서버 컴퓨터도 개인 컴퓨터와 마찬가지로 서버용 운영체제 위에 여러 소프트웨어를 실행한다. 그리고 이 소프트웨어가 서버의 기능을 의미한다.
예를들어 웹 서버용 소프트웨어를 설치하면 웹 서버가 된다. 즉, 무슨서버를 만든다는 것은 그 기능을 하는 소프트웨어를 설치하여 기능을 추가하는 것이다.
당연히 소프트웨어를 여러개 설치하면 여러 기능적 의미의 서버가 하나의 물리적 컴퓨터 서버에서 작동할 수 있다.
기능적 서버의 대표적인 예로는 웹 서버, 메일 서버, 데이터베이스 서버, 파일 서버, DNS 서버, DHCP 서버, FTP 서버, 프락시 서버, 인증 서버가 있다.
서버의 운영체제는 주로 리눅스
서버용 운영체제는 리눅스(Linux) 또는 유닉스(Unix) 계열을 주로 사용하며, 서버용 소프트웨어도 대부분 리눅스용 소프트웨어가 대다수이다. 윈도우 서버용도 따로 있지만 대부분 리눅스를 사용한다.
아래 그림은 유닉스 계열을 나타낸다.
유닉스가 가장 상위 집합이고 리눅스는 유닉스 안에 포함된 계열이다. BSD계열에는 Apple에서 사용하는 macOS도 확인할 수 있다.
아래 그림은 유닉스 안에 있는 리눅스 계열들의 배포판 운영체제들이다.
리눅스 계열 안에서도 레드햇 계열, 맨드리바/마제야 계열, 데비안 계열 등 여러가지로 나뉘고 데비안 계열에는 자주 쓰는 우분투(Ubuntu)도 있다.
컨테이너를 이용해 여러 가지 서버 기능을 안전하게 함께 실행하기
일반적으로 한 대의 서버 컴퓨터에는 웹 서버를 한벌밖에 실행하지 못한다.
그러나 도커의 컨테이너 기술을 사용하면 여러개의 웹 서버를 한 대의 컴퓨터에 올릴 수 있다.
이 말은 즉 여러대의 물리 컴퓨터를 사용해야할 것을 도커를 사용한다면 한 대의 물리 컴퓨터만을 사용해도 되기 때문에 돈을 절약할 수 있다.
쉽게 옮겨 다닐 수 있는 컨테이너
도커 컨테이너는 자유롭게 옮겨다닐 수 있다.
예를들어 물리 컴퓨터1의 도커 엔진에서 사용하던 컨테이너를 물리 컴퓨터2의 도커 엔진에 복사 or 옮기고 싶을 때 도커만 설치되어 있다면 운영체제가 달라도 쉽게 컨테이너를 옮길 수 있다.
도커를 이용하면 물리적 환경의 차이, 서버의 구성의 차이를 무시할 수 있다. 따라서, 운영 서버와 개발 서버의 환경 차이로 인한 문제를 원천적으로 방지할 수 있다.
'도커' 카테고리의 다른 글
Ubuntu 서버 설정 (0) | 2025.02.27 |
---|---|
[3] 도커 컨테이너의 통신 (0) | 2024.02.28 |
[2] 도커 명령어 (1) | 2024.02.27 |