1. Docker
1.1. Docker란 무엇인가?
- 데이터 또는 프로그램을 격리시키는 기능을 제공하는 소프트웨어
주로 서버에서 사용된다. 클라이언트에서도 사용할 수는 있지만 현재는 서버에서 사용이 주 용도이다.
Docker는 여러 가지 프로그램이 함께 동작되는 환경에서 각각의 프로그램을 격리하는 기능을 제공한다. - 컨테이너와 도커 엔진
격리된 프로그램을 담고 있는 하나의 단위를 컨테이너라 한다. 그리고 이것을 다루는 소프트웨어가 도커이다.
도커를 사용하려면 도커 소프트웨어의 본체인 엔진을 설치해야 한다. - 컨테이너를 만들려면 이미지가 필요하다.
컨테이너에 독립된 프로그램이나 데이터를 넣어주는데 이를이미지라 하고
컨테이너를 만들려면이미지
가 필요하다. - 도커는 리눅스 컴퓨터에서 사용된다.
윈도우나 macOS에서도 도커를 구동할 수 있지만 내부적으로 리눅스가 사용된다.
또 컨테이너에서 동작시킬 프로그램도 리눅스용 프로그램이다.
1.2. Docker의 필요성 :: 독립된 환경에 격리해야 하는 이유
Docker에 대해 간략하게나마 알아보았다. 요즘 개발에서는 분야를 막론하고
Docker를 굉장히 많이 활용한다. 그러나 이것이 Docker가 필요한 이유라고 착각해서는 안된다.
내가 생각하기엔 이는 데이터나 프로그램이 독립된 환경에 격리되어야 하는 이유가
메인이고 그 해결책으로 Docker라는 소프트웨어를 사용하는 것이다.
대부분의 프로그램은 단독으로 작동하기보다 어떤 실행 환경이나 라이브러리, 다른
프로그램을 이용해 동작한다.
여러 시스템에서 공통으로 사용하는 라이브러리 혹은 프로그램이 특정 버전에 종속
되어있다면, 버전을 바꿀 시 원치 않는 에러가 발생할 수 있다.
이러한 원인은 대부분 프로그램 간 공유에 있다
내가 겪은 이슈로는 로컬 환경에서는 잘 작동하던 ToastUI 에디터가 Docker환경에
서는 라이브러리를 제대로 불러오지 못하는 이슈가 있었다.
즉 빌드하면서 무언가 결함이 발생했다는 것인데, 라이브러리 버전 관리를 제대로
못했던지 npm에 라이브러리를 제대로 init 하지 못한 게 아닌가 한다.
도커와 가상화 기술의 차이
도커는 특성상 가상화 기술과 비교되는 경우가 많다.
우리는 두루뭉술하게 대답하기보다 그래도 조금은 명확히 대답해 보도록 하자.
- 도커와 가상화 기술의 차이
VMware 같은 가상화 기술은 가상의 물리 서버를 만드는 것과 같다.
여기서 '가상'이란 물리적인 대상을 소프트웨어로 대체했다는 뜻이다.
즉 메인보드와 CPU, 메모리등의 물리적인 부품을 소프트웨어로 구현하는 것이다.
그 위에 OS를 설치하고 각 필요한 프로그램들을 세팅한다.- 도커는 컨테이너에서 리눅스가 동작하는 것 처럼 보이지만 실제로 동작하지는 않는다.
운영체제의 기능 중 일부를 호스트 역할을 하는 물리 서버에 맡겨 부담을 덜어 둔 형태이다. 다시 말해 컨테이너는 운영체제의 일부 기능을 호스트에 의존하기 때문에 물리 서버에도 리눅스 기능이 필요하며, 컨테이너의 내용도 리눅스가 될 수 밖에 없다.- 도커와 AWS EC2의 차이
아마존의 인스턴스는 어떻게보면 VMware의 가상머신과 비슷하다.
다만 인스턴스는 AMI라는 이미지로부터 생성하므로 인스턴스의 배포 과정은 도커와 비슷하다.
1.3. Docker의 동작 원리
Docker에 대해 조금 더 이해할 수 있도록 동작 원리에 대해 간략히 알아보자.
1.3.1. Docker의 구조
운영체제 위에 도커 엔진이 동작하고 그 위에서 컨테이너가 동작한다.
1.3.2. Docker 허브와 이미지, 그리고 컨테이너
- 이미지와 컨테이너
컨테이너를 생성하려면 먼저 이미지를 만들어야 한다.
예전에 가상 디스크에 iso 파일을 마운트 하여 설치하는 느낌을 떠올리면 쉬울 것이다. - 이미지를 통해 컨테이너를 만들어서 컨테이너를 사용한다.
그 반대의 경우도 가능하다 즉 컨테이너를 통해 이미지를 뽑아낸다.
마찬가지로 어떤 프로그램을 추출하여 iso 파일로 만드는 것과 비슷하다고 보면 된다.
우리가 자주 접한 예로는 윈도우 부팅 usb 같은 것을 만들어 본 경험을 떠올리면 될 것이다.
- 도커 허브
쉽게 말해 오픈 마켓 같은 걸로 생각하면 된다.
저명한 소프트웨어들은 대부분은 LTS로 등록이 되어있고, 간혹 요즘 유행하는 팰월드 같은 것의 초기 세팅을 이미지로 떠서 배포해 주시는 분들이 계신다.
1.3.3 Docker 컨테이너의 생애주기와 데이터 저장
- 도커 컨테이너는 쓰고 버리는 일회용품
- 내가 참고한 책에서 사용하듯이 버린다라는 표현이 조금 이상할 수 있으나,
그냥 업데이트보다 새로운 버전을 까는 것이 더욱 쉽다고 보면 된다.
예를 들어 우리가 윈도우10도 아닌 윈도우 XP를 쓰고 있다고 해보자.
이를 윈도우 11까지 올리는 것이 편할까 윈도우를 새로 받는 것이 편할까? 대부분 후자를 선택할 것이다. - 데이터 저장
- 컨테이너를 폐기한다면 당연히 데이터는 날아간다. 어떻게 해야 할까?
쉽게 다시 윈도우를 생각해보자 우리는 꾸준히 보관해야하는 것은 별도의 드라이브에 저장한다.
도커도 마찬가지다. 우리의 호스트 컴퓨터에 일부분에 외부 데이터들을 저장하고 Docker 컨테이너에는 기동만을 위한 프로그램 파일만 남기는 것이 편하다. 마치 C 드라이브에는 윈도우 실행 파일과 간단한 휘발성 데이터들로만 구성하는 것처럼 말이다.
1.4. Docker의 장점과 단점
당연 좋기만 한 완벽한 프로그램은 없다. 마지막으로 장점과 단점에 대해 알아보고 유연히 사용하도록 하자
1.4.1. 장점
- 한 대의 물리 서버에 여러 대의 서버를 띄울 수 있다.
- 서버 관리가 용이하다.
- 서버에 대해 잘 몰라도 생각보다 다루기 쉽다.
1.4.2 단점
- 리눅스 운영체제만 지원한다 -> 리눅스로 구동가능한 소프트웨어만 사용 가능
- 결국 호스트 서버가 문제가 생기면 모든 컨테이너가 오류를 공유함
- 단일 컨테이너를 사용하는 것은 오버헤드이다.
1.5. Docker의 용도
- 팀원 모두에게 동일한 개발환경 제공(=동일한 환경을 여러 개 만들기)
- 새로운 버전의 테스트(=격리된 환경을 이용)
- 동일한 서버가 여러 대 필요한 경우(=컨테이너 밖과 독립된 성질을 이용)