도커(Docker)
'데이터 또는 프로그램을 격리시키는 기능'을 제공하는 소프트웨어
- 주로 서버에 사용된다.
- 도커를 사용하려면 도커 S/W의 본체인 도커 엔진을 설치해야 하며, 도커 엔진을 사용해 컨테이너를 생성하고 구동시킬 수 있다.
- 도커 엔진 외에도 컨테이너의 빵틀과 같은 역할을 하는 이미지가 필요하다.
이미지의 종류는 다양하다. 만약 아파치 컨테이너를 만들려면 아파치 이미지를 사용하고, MySQL 컨테이너를 만드려면 MySQL 이미지를 사용해야 한다.
※ 우선 종류와 상관 없이 리눅스 OS가 필요하다. 또, 컨테이너에서 동작시킬 프로그램도 리눅스용 프로그램이다.
이런 이유는 도커가 리눅스 운영체제에서 사용하는 것을 전제로 만들어졌기 때문이다.
도커는 서버에서 사용되는 S/W이다. 따라서 서버에 대해 어느정도 지식이 필요하다.
서버란 무엇일까?
'어떤 서비스를 제공하는 것'이다.
개발 현장에서 '서버'라는 용어는 두 가지 의미를 갖는다. 한 가지는 '기능적 의미의 서버'이고 다른 한 가지는 '물리적 컴퓨터로서의 서버'를 가리킨다.
일반적인 개인용 컴퓨터는 개인이 사용하지만 서버는 여러 사람이 원격으로 접근해 사용한다는 점이 다를 뿐이다.
물론 이런 차이로 인해 컴퓨터 사양이나 요구사항이 달라지기는 하지만 우리가 쓰는 개인용 컴퓨터와 마찬가지로 운영체제가 동작하고, 그 위에 소프트웨어를 실행하는 것은 똑같다.
서버의 기능은 소프트웨어가 제공한다
서버의 기능은 소프트웨어가 제공하는 것으로, 소프트웨어를 설치하면 '서버'의 기능을 갖게 된다.
ex) 웹 서버 소프트웨어를 설치 => 웹 서버가 된다.
서버의 기능이 소프트웨어에서 나온다는 말은 '여러 가지 소프트웨어를 한 컴퓨터 설치할 수도 있다.'는 말이다...
물리 서버 한 대에 여러 개의 웹 서버를 띄우면 그만큼 물리 서버 수를 줄일 수 있다.
예를 들어 어떤 소프트웨어 회사에서 관리하는 프로젝트 A와 프로젝트 B의 웹 서버가 있다고 치면 이 웹 서버는 둘 다 필요한 용량이 그리 크지 않아서 물리 서버를 따로 두면 그만큼 낭비가 발생한다. 이 두 서버를 하나의 물리 서버에 함께 둔다면 프로젝트 하나의 비용이 절반으로 감소할 수 있다.
만약 컨테이너 기술을 활용하지 않고 물리 서버 한 대에 두 웹 서버를 함께 올린다면 프로젝트 A에 참여 중인 개발자가 프로젝트 B의 환경을 건드릴 수 있고, 아파치는 서버 한 대에 하나밖에 올리지 못하기 때문에 웹 서버의 기능을 공유해야 하는 한계도 생긴다.
- 컨테이너 기술을 사용하면 이런 리스크를 감수하지 않고 두 웹 서버를 하나의 물리 서버에 함께 올릴 수 있다.
- 이런 이점은 컨테이너가 그저 격리된 환경이 아니라 쉽게 옮길 수 있다는 특성에서 비롯된다.
실제로는 컨테이너 자체를 옮긴다기보다 컨테이너의 정보를 내보내기한 다음, 다른 도커 엔진에서 복원하는 형태가 되지만 컨테이너를 어떤 도커 엔진에서 다른 도커 엔진으로 옮기는 것은 어려운 일이 아니다.
이런 특성을 이용하면 똑같은 상태로 튜닝한 컨테이너를 팀원 전원에게 배포해 모두가 동일한 개발 환경을 사용할 수 있다.
- 도커만 설치돼 있으면 OS가 달라도 이를 신경 쓰지 않고 컨테이너를 옮길 수 있다.
도커를 이용하면 물리적 환경의 차이, 서버 구성의 차이를 무시할 수 있어 운영 서버와 개발 서버의 환경 차이로 인한 문제를 원천적으로 방지할 수 있다.
도커 동작의 원리
우선 물리 서버가 있고, 이 물리 서버에서 동작하는 리눅스 운영체제가 있다. 여기까지는 일반적인 서버와 다를 바가 없다.
일반적인 서버라면 운영체제 위에 프로그램이나 데이터가 직접 올라가겠지만 도커를 사용하는 경우는 운영체제 위에 도커 엔진이 동작하고 그 위에서 컨테이너가 동작한다.
- 프로그램이나 데이터는 컨테이너 안에 위치한다.
컨테이너 속 구조
모든 컨테이너에는 '리눅스 운영체제 비슷한 무언가'가 들어있다. 술집에서 아무것도 주문하지 않아도 기본 안주가 나오는 것처럼 최소한의 컨테이너에도 '리눅스 운영체제 비슷한 무언가'가 딸려 나온다. '빈 컨테이너'라고 했지만 정말로 빈 컨테이너가 아니다.
운영체제는 소프트웨어나 프로그램의 명령을 하드웨어에 전달하는 역할을 한다.
본래 운영체제는 '커널'이라는 부분과 '그 외의 주변 부분'으로 구성된다.
주변 부분이 프로그램의 연락 내용을 커널에 전달하고 커널이 하드웨어를 다룬다.
도커에서는 컨테이너가 완전히 분리돼 있어 밑바탕이 되는 리눅스 운영체제의 주변 부분이 컨테이너 속 프로그램의 명령을 전달 받을 수 없다. 따라서 컨테이너 속에 운영체제의 주변 부분이 들어 있어 프로그램의 명령을 전달받고 이를 밑바탕이 되는 커널에 전달하는 구조로 돼 있다.

컨테이너 속에 리눅스의 주변 부분만 들어 있다. 간단하게 리눅스 운영체제 전체를 컨테이너 속에 넣으면 되지 않을까 싶지만 주변 부분만 컨테이너에 넣고 커널은 밑바탕에 있는 것을 빌려 쓰는 형태 덕분에 도커의 가장 큰 특징인 '가벼움'을 얻을 수 있다.
도커는 기본적으로 '리눅스용'이다.
- 도커는 기본적으로 리눅스 OS에서만 동작한다.
- 도커는 밑바탕에서 리눅스 운영체제가 동작하는 것을 전제로 하는 구조로 돼 있기 때문이다.
- 컨테이너에서 실행할 소프트웨어(프로그램) 역시 리눅스용 소프트웨어이다. 윈도우나 macOS용 S/W는 컨테이너에 넣어도 동작하지 않는다.
도커는 리눅스 컴퓨터에 독립된 환경을 만드는 것
이렇게 말하면 윈도우나 macOS에서는 도커를 사용할 수 없어야 하지만. 실제로는 사용할 수 있다.
그 이유는 바로 VirtualBox나 VMware 같은 가상 환경 위에 리눅스 OS를 설치하고 그 위에서 도커를 실행하거나
'윈도우용' 또는 'macOS'용 도커 데스크톱처럼 도커를 실행하는데 필요한 리눅스 운영체제를 포함하는 패키지를 설치해 사용하는 두 가지 경우로 나눈다.

도커 허브와 이미지. 그리고 컨테이너
- 컨테이너를 생성하려면 먼저 이미지를 만들어야 한다. 이미지는 컨테이너를 찍어내는 틀과 같은 것으로, 컨테이너의 설계도 역할을 한다.
우리가 실제 사용하는 것은 컨테이너이고, 이미지를 그대로 사용하는 일은 없다.
이미지만 있으면 똑같은 것을 여러 개 만들 수 있어 동일한 컨테이너를 여러 개 배치하기 편리하다.
- 이미지로만 컨테이너를 만들 수 있는 것이 아닌 컨테이너로도 이미지를 만들 수 있다.
- 컨테이너로 이미지를 만든다는 것은 이미 만든 컨테이너를 개조해서 컨테이너의 금형을 새로 만드는 과정이라고 생각하면 된다.
- 이로인해 소프트웨어나 시스템을 넣은 새로운 이미지를 만들면 다수의 서버를 준비하는 작업이 매우 간단해진다.
동일한 컨테이너를 여러 개 만들지 않더라도 이러한 특성을 이용해 다른 물리 서버에 설치된 도커 엔진으로 컨테이너를 이동시킬 수 있다.
컨테이너는 도커 엔진만 설치돼 있으면 구동이 가능하므로 다른 서버나 컴퓨터에 도커 엔진을 설치하고 새로운 도커 엔진에 이미지를 이용해 똑같은 컨테이너를 생성하면 된다.
- 이로인해 컨테이너 자체가 이동한 것은 아니지만 이미지를 통해 컨테이너가 이동한 것과 같은 효과를 얻을 수 있다.
이미지는 주로 '도커 허브'에서 구한다. 도커 허브는 공식적으로 운영되는 도커 레지스트리(도커 이미지를 배포하는 서비스)의 이름이다.
도커 허브 : https://hub/docker.com
직접 수정하고 싶다면 간단한 이미지, 편리하게 사용하고 싶다면 설정이 완료된 이미지 등 용도에 따라 원하는 것을 선택하면 된다.
- 같은 소프트웨어도 다양한 변종의 이미지가 제공된다. (버전에 따라 조합이 달라지기 때문)
안전한 컨테이너 이미지를 고르는 방법
1. 공식 이미지를 사용한다.
컨테이너 이미지 중에는 공식 이미지가 여럿 있다. 공식 이미지를 사용하면 이미지 선택도 쉽고 보안도 챙길 수 있다.
다만 컨테이너에 포함된 '운영체제(비슷한 것)'이 특정 운영체제 및 버전으로 한정된 경우가 있어서 원하는 것을 선택하지 못할 수도 있으므로 꼭 특정 운영체제 및 버전을 사용해야 하는 상황에는 주의가 필요하다.
2. 커스텀 이미지를 직접 만들어 사용한다.
컨테이너 이미지를 원하는 대로 구성해 커스텀 이미지를 만들 수 있다. 필요한 최소한의 요소가 담긴 이미지에 필요한 소프트웨어를 추가로 설치해 커스텀 이미지를 만든다.
'운영체제(비슷한 것)'만 들어있는 컨테이너부터 직접 만드는 것은 추천하지 않지만, 운영체제가 포함된 이미지에 소프트웨어를 넣는 정도는 어렵지 않다. 또한 공식 이미지가 아닌 모든 이미지가 위험성을 안고 있는 것은 아니다.
하지만 경험이 쌓일 때까지는 신중하게 이미지를 선택해 사용하는 것이 안전하다.
도커를 사용할 때의 원칙 중 하나로, '한 컨테이너에 한 프로그램'이라는 것이 있다. 이렇게 하면 보안 및 유지 관리 측면에서 유리하기 때문에 많이 쓰이는 정책이다.
모든 프로그램이 담긴 컨테이너를 만드는 방법
: 컨테이너를 구축하는 방법은 다양하다. 따라서 컨테이너의 구성도 그만큼 다양하지만 그중에서도 모든 프로그램을 한데 모아 담은 컨테이너는 바로 실행할 수 있어서 자주 쓰인다.
운영체제 (비슷한 것)을 한 종류로 통일해야 되는가?
: 도커를 사용하면 하나의 물리적 컴퓨터에 여러 개의 운영체제가 있는 상태가 된다. 호스트 컴퓨터와 컨테이너 또는 컨테이너 간에 배포판이나 버전 차이가 있어도 아무 문제가 없다. 컨테이너끼리 서로 다른 배포판을 사용할 수 있다는 것도 도커의 매력이다.
- 이미지를 선택할 때도 '운영체제 (비슷한 것)'이 무엇인지도 크게 신경 쓰지 않고 그냥 'Latest' (최신 버전)를 선택하는 경우가 많다.
- 다만 컨테이너에 로그인할 필요가 있거나 특정 DBMS를 사용할 때는 운영체제 종류에 따라 문제를 일으킬 수 있으므로 배포판을 정확히 선택해야 한다.
도커 컨테이너의 생애주기와 데이터 저장
컨테이너는 '쓰고 버리는' 일회용품 같은 것이다.
- 컨테이너 하나를 업데이트하면서 계속 사용하기보다는 업데이트된 소프트웨어가 들어있는 새로운 컨테이너를 사용하는 것이 좋다. 즉, 새로운 버전이 나오면 새로운 컨테이너로 갈아타는 것이다.
이것이 가능한 이유 : 컨테이너는 일반적으로 여러 개를 동시 가동하는 상황을 전제로 하기 때문이다.
도커의 생애주기
컨테이너를 만들고 > 실행하고 > 종료하고 > 폐기 > 다시 컨테이너 '만들기'가 일련의 컨테이너의 생애주기라고 한다.
데이터 저장
컨테이너를 폐기했다면 컨테이너에 들어있던 데이터들은 당연히 사라지게 된다. 이 파일은 컨테이너 안에 들어있었기 때문이다.
이런 일을 방지하기 위해 보통은 도커가 설치된 물리적 서버(호스트)의 디스크를 마운트해 이 디스크에 데이터를 저장한다.
※ 마운트 : '디스크를 연결해 데이터를 기록할 수 있도록 한 상태'
이런 방법으로 컨테이너가 폐기되더라도 데이터는 컨테이너 외부에 안전하게 저장되어 사라지지 않는다.
또한 다른 장점으로는 외부에 저장하면 다른 컨테이너와 데이터를 공유할 수도 있어서 매우 편리하다.
- 프로그램을 개발할 때는 다른 저장소에 저장하지 않는 경우도 있어 컨테이너를 폐기하기 전에 중요한 데이터가 컨테이너에 포함돼 있지 않은지 확인해야 한다.
도커의 장점과 단점
도커의 성질

환경을 격리할 수 있다는 것이 핵심
- 그로인해 독립된 환경, 이미지를 만들 수 있게 되고, 컨테이너에 '커널'이 포함되지 않는 구조가 가능하다.
도커의 장점과 단점
장점
1) 한 대의 물리 서버에 여러 대의 서버를 띄울 수 있다.
: 여러 가지 기능을 띄우는 것 자체는 일반적인 서버로도 가능하지만 도커는 격리된 환경을 제공하므로 이들이 각각 안전한 상태로 실행되며, 일반적인 서버에서는 함께 실행할 수 없는 조합(같은 소프트웨어를 여러 번 실행하는)도 가능하다.
또, 컨테이너에는 커널이 포함되지 않으므로 물리 서버의 운영체제에 의존한다. 이로인해 압도적으로 가벼워진다.
2) 서버 관리가 용이하다.
: 컨테이너를 이용해 각 소프트웨어를 독립된 환경에 격리하므로 다른 소프트웨어에 영향을 끼치지 않는다. 업데이트도 그만큼 간단하다. 항상 최신 상태로 S/W를 유지하기 쉬운 구조가 된다.
이에 더불어 교체나 수정이 쉬워져 환경 이전도 간단해진다. 생성 및 폐기도 간단하므로 초기 설정에 따르는 시간과 수고를 들일 필요가 없다. 컨테이너를 수정했다면 이미지를 다시 만들고 이 이미지로 컨테이너를 생성할 수 있다.
3) 서버 고수가 아니어도 다루기 쉽다.
: 명령 한 줄로 서버 구축이 끝나므로 '터미널에 명령을 직접 입력해야 한다는' 것 외에는 장애물이 없다. 따라서 명령어만 익히면 초보자들도 컨테이너를 사용할 수 있다.
단점
- 리눅스용 S/W밖에 지원하지 않는다. 서버에서는 리눅스 운영체제를 많이 사용하긴 해도 유닉스도 사용할 수 없고 윈도우 서버는 아예 지원하지 않는다.
- 물리 서버 한 대에 여러 서버를 띄우는 형태이므로 호스트 서버에 문제가 생기면 모든 컨테이너에 영향이 미친다.
- 즉, 물리 서버에 문제가 생겼을 때 영향이 미치는 범위가 커진다. 따라서 물리 서버의 이상에 대해 확실히 대책을 세워야 한다.
- 컨테이너를 여러 개 사용하는 형태를 가정하므로 컨테이너 하나를 장기간에 걸쳐 사용할 때는 장점을 느끼기 어렵다.
도커의 주 용도를 알아보자
- 팀원 모두에게 동일한 개발환경 제공하기(=동일한 환경을 여러 개 만들기)
- 개발환경에서는 팀원 모두에게 동일한 개발환경을 제공할 수 있어 편리하다.
- 특히 여러 프로젝트에 동시에 참여하는 현장에서는 프로젝트별로 컨테이너를 따로 사용할 수 있다.
- 컨테이너는 운영 환경과 완전히 동일하게 생성되므로 개발 환경과 운영 환경의 차이가 근본적으로 사라진다.
개발 환경으로 사용한 컨테이너는 운영 서버 구축을 담당하는 사람이 만들어 팀원에게 배포한다. 하나의 개발 서버를 공동으로 사용하면 수정으로 인한 경합이 발생할 수 있지만 이런 형태에서는 로컬에서 개발을 마치고 적절한 때에 적용하면 되므로 팀 내에서 조정하면 된다.
- 새로운 버전의 테스트(=격리된 환경을 이용)
- 운영체제나 라이브러리 등의 새로운 버전을 먼저 개발환경에서 테스트한 후 운영환경에 적용할 때도 컨테이너를 활용할 수 있다. 컨테이너 형태를 유지하는 한 도커 엔진이 구동을 보장해 주므로 물리 서버와의 상성은 고려하지 않아도 된다.
- 동일한 서버가 여러 대 필요한 경우(=컨테이너 밖과 독립된 성질을 이용)
- 동일한 서버가 여러 대 필요한 경우에도 컨테이너를 이용해 한 대의 물리 서버에 똑같은 서버를 여러 개 만들 수 있다.
- 이렇게 하면 관리도 간편해지고 비용도 절약할 수 있다.
- 명령 한 줄이면 서버를 필요한 만큼 띄울 수 있으므로 OS를 설치하고, 로그인한 다음 소프트웨어를 설치하는 단순 업무를 반복할 필요가 없다. S/W가지 하나로 묶은 패키지를 사용하면 더욱 편리하다.
'도커' 카테고리의 다른 글
| 5. 도커 - 컨테이너와 호스트 간에 파일 복사하기 (3) | 2025.08.11 |
|---|---|
| 4. 도커 - 여러 개의 컨테이너 연동해 보기 (3) | 2025.07.31 |
| 3. 도커 커맨드 실습하기 (4) | 2025.07.29 |
| 2. 도커 엔진 (3) | 2025.07.28 |