개발이든 뭐든 IT, SW쪽에 몸담고 있는 사람이라면 도커 컨테이너에 대해 한번 쯤 들어봤을 수도 있을 것 같다. 그래서 이건 뭐에 쓰는 놈이고 대략적으로 어떤 특징을 가지고 있으며, 어떤 거를 좀 알아야 할 지를 간단하게 설명하는 글을 작성해보고자 한다.

 

도커 컨테이너는 어디에 쓰는 녀석인가?

도커 컨테이너는 컨테이너라는 이름에 어울리게 무언가를 감싸고 있는 녀석이라고 생각하면 된다. 사용하는 이유와 Use-Case는 다양하겠지만, 사용 목적 자체는 가상머신(Virtual Machine)과 비슷하다.

가상머신을 사용하는 이유는 실제 머신, PC 하드웨어가 여러개 있지 않는 경우 하드웨어가 여러개 있는 것 처럼 SW적으로 사용하기 위해서 가상머신을 활용을 한다. 

하나의 PC에서 두개의 운영체제(윈도우와 리눅스 처럼)를 동시에 돌려서 무언가를 한다던지 하는 경우 가상머신을 사용할 수 있겠고, 두개의 PC가 서로 네트워크 통신을 하는 것 처럼 만들고 싶은 경우도 가상머신을 이용해서 비슷한 환경을 구축할 수 있다.

대충 사용하는 이유는 아래와 같을 수 있다.

  • 샌드박싱을 위해서
  • 간편한 환경 구축을 위해서

샌드박싱을 하는 경우는 일반적으로 보안적인 이유가 클 것이라고 생각된다. 보안회사에서 악성코드 분석 업무를 하시는 분들은 대부분 악성코드 분석을 가상머신 안에서 수행을 한다. 더군다나 동적 분석이라면 무조건적일 것이다. 그리고 환경 구축하는 방법이 복잡할때, 동일한 환경을 다른 하드웨어에서 구성을 해야하거나 배포를 해야 하는 경우, 가상머신 이미지 형태로 배포를 하게 되는 경우 환경 구축이 꽤나 쉬워진다. 집단 교육 등을 하거나 할 때 이런 방식이 편리할 수 있다.

가상머신과 비슷하다면, 그와 비교했을때 도커의 장점은?

가상머신은 하지만 큰 단점이 있다. 일단 리소스 사용량이 엄청나다. 메모리와 CPU를 호스트 OS의 것을 가져다가 게스트 OS에서 쓰는 것이므로, 실제 머신 하나 당 가상머신은 보통 1개정도만 띄우며 사용하며, 여러개를 띄우게 될 경우 스토리지 및 메모리, CPU 모두 사용량이 엄청나다. 그리고 설치 시 운영체제를 각각 새로 설치를 해 주어야 하기 때문에 구성에도 시간이 오래 걸리고, 배포 시에도 VM(Virtual Machine) 이미지는 용량이 매우 큽니다.

하지만 도커 컨테이너의 경우 가상머신과 비슷한 목표(goal)을 이룸에도, 구조가 호스트의 OS와 라이브러리들을 공유하는 형식이므로 구성 및 설치도 훨씬 빠르고 하나의 하드웨어에 수십개의 도커를 띄울 수 있습니다.

도커보다 가상머신이 갖는 강점은?

하지만 또 가상머신이 도커보다 좋은 장점이 있습니다. 아무리 비슷하게 한다고 하지만, 실제 OS까지 별도로 설치하는 가상머신의 경우 실제 환경 재현이 더욱 유사합니다. 물론 Host 운영체제를 설치를 해서 하이퍼바이저 위에서 도는 가상머신보다는 네이티브 베어메탈 운영체제가 제일 잘 맞긴 하겠지만, SW적으로는 가상머신이 환경구축의 일치율은 가장 높습니다. 도커는 그보다는 조금 낮은 일치율을 갖게 되겠지요.

예를 들어서 하드웨어적으로 붙는 장치 드라이버 등을 개발하면서 USB 포트에 해당 장비를 꽂아서 디버깅 및 테스트를 할 때, 네이티브 운영체제에 드라이버를 개발하는 것과, 가상머신안에 있는 운영체제에서 드라이버를 개발하는 것, 분명히 차이가 있겠지요?

그리고 도커 컨테이너의 경우 태생이 LXC(Linux Container)이므로, 아무래도 비 리눅스 계열의 운영체에서는 호환성이 떨어지는 편이라고 볼 수 있습니다. 초창기에는 윈도우 같은 운영체제는 아예 지원을 안하다가 지금은 지원을 하는 것으로 알고 있습니다. Linux Host에서 Linux Docker를 띄우는 경우가 가장 추천되는 상황이며, 윈도우 운영체제에서는 지원은 하지만 호환이 잘 안되는 부분이 아직 있을 수 있습니다.

(이 부분은 나중에 추가적으로 조사해서 덧붙이도록 하겠습니다.)

 

도커와 관련된 것들

도커를 사용할 때 자주 쓰이는 것들에 대해 학습을 해 놓으면 좋습니다.

Dockerhub

도커는 도커 이미지와 도커 컨테이너 이렇게 두개로 있다고 보면 되는데, 도커 이미지는 붕어빵 틀에 해당되며, 도커 컨테이너는 붕어빵이라고 보면 됩니다. 쉽게 생각하면 OOP에서 class와 object입니다. 도커 컨테이를 생성할려면 이미지를 기반으로 생성을 하게 되는데, 이 도커 이미지들이 모여있는 것이 도커허브입니다. 깃허브같은 느낌이지요. 그래서 깃허브에서 git clone을 하듯이 도커는 docker pull이라는 명령어로 도커허브에서 이미지를 받아올 수 있습니다. 이 도커허브에는 Ubuntu18.04 처럼 베이스가 되는 이미지부터, 이것저것 설정이 잘 되어 있는 이미지까지 다양하게 있으며, 여러분들도 도커 허브에 이미지를 올릴 수 있습니다.

Dockerfile

도커 이미지는 파일이 몇백 MB부터 GB단위 이상으로 커질 수 있습니다. 따라서 공유할때 엄청 무거운 대상이 되는데요, Dockerfile이라는 텍스트 형태의 파일을 이용해서 도커이미지의 내용을 기술해줄 수 있습니다. 깃헙 같은 곳에 dockerfile만 공유해도 쉽게 도커 이미지를 공유할 수 있는 셈이지요. 정확하게는 도커 이미지와 1대 1 대응이 되지는 않지만, 간편하게 환경을 공유할 수 있는 것은 사실입니다.

Docker compose

도커 컨테이너를 여러개 구성한 뒤, 포트포워딩 등을 이용해서 여러 컴포넌트가 서로 상호작용하는 마이크로 서비스를 배포하고자 할 때, Docker compose라는 걸 사용하면 편리합니다. 도커 이미지 하나를 쉽게 만들기 위해서 dockerfile을 사용한다면, 여러개의 도커 컨테이너들의 구성을 쉽게 구성하고 공유하기 위해서 docker-compose를 사용할 수 있습니다.

 

직전 포스팅에 이어서, 이번 포스팅에서는 Flat File Database의 일종인 SQLite3를 이용하여 데이터베이스의 튜토리얼에 해당하는 CRUD 연산들을 실습해보도록 하겠습니다.

 

일단 실습 환경은 저는 Windows 10에서 실시를 할 예정인데, 사실 운영체제는 크게 중요하지는 않습니다.

 

SQLite DB Browser 설치

SQLite3는 파일 하나만 설치하면 되므로 비교적 설치가 간단합니다.

sqlitebrowser.org/

 

DB Browser for SQLite

DB Browser for SQLite The Official home of the DB Browser for SQLite Screenshot What it is DB Browser for SQLite (DB4S) is a high quality, visual, open source tool to create, design, and edit database files compatible with SQLite. DB4S is for users and dev

sqlitebrowser.org

SQLite3 파일을 다룰 수 있는 프로그램은 다양한 종류가 있지만, 이번에는 DB Browser for SQLite라는 프로그램을 이용해보도록 하겠습니다. 위 공식 사이트 링크로 이동한 뒤, Download 탭에 들어가서 자신의 운영체제에 맞는 프로그램을 설치해주시면 됩니다.

저같은 경우는 Installer를 이용해서 64bit 운영체제용으로 설치를 했습니다. 3번째에 해당하는 DB Browser for SQLite - Standard installer for 64-bit Windows를 눌러서 설치를 하면 되겠습니다.

그리고 시작메뉴에 검색을 해서 실행을 하면 되겠습니다.

데이터베이스와 테이블 생성

이제 데이터베이스와 테이블을 생성해야 합니다. SQLite3에서 데이터베이스는 하나의 파일에 해당합니다. 그리고 테이블은 이전 포스팅에서 언급했던 Relation(표)에 해당됩니다.

그리고 새 데이터베이스를 눌러서, 파일을 하나 생성합니다. 이제 이 파일에 데이터베이스 값들이 저장되게 됩니다.

그러면 곧 이어 테이블을 생성하라는 창이 뜨게 됩니다.

이 창에서 테이블을 생성할 수 있는데, 아래에는 SQL 구문이 있고, 중간에 있는 필드 부분을 GUI로 생성을 하면 테이블을 생성하는 SQL 구문이 자동으로 생성됩니다.

간단하게 사람이름과 생년월일을 입력으로 받는 테이블을 만들어보도록 하겠습니다.

NN, PK, AI, U와 같은 필드가 있는데 각각은 Not Null, Primary Key, Auto Increment, Unique입니다. 이 부분들은 나중에 언급하도록 하고, 일단 위와 같은 방식으로 만들어 봅니다.

테이블에 데이터 CRUD 연산

이제 생성한 테이블에 CRUD 연산 별 SQL 구문을 간단하게 알아보겠습니다. 일단 데이터를 생성을 해야겠지요.

데이터를 user 테이블에 삽입해보도록 하겠습니다.

Create - Insert into 구문

SQL 실행이라는 탭을 눌러서 위와 같이 입력 해 보도록 합니다. 그리고 재생버튼같이 생긴 버튼을 눌러서 SQL 구문을 실행해보도록 합니다.

그러면 아래에 결과가 나옵니다.

이제 데이터 보기를 눌러서 데이터가 들어간 것을 확인할 수 있습니다.

Read - Select 구문

이제 SQL Select 구문을 이용해서 데이터를 조회해보도록 하겠습니다.

위와 같이 입력하면 user 테이블에 있는 모든 정보를 확인할 수 있습니다.

위와 같이 where에 조건을 넣어서 number가 1인 row만 확인해볼 수 있습니다.

아니면 위와 같이, number가 1보다 큰 row의 name column만 확인도 가능합니다.

Update - Update 구문

이제 데이터를 수정해봅시다. number가 2인 리처드 파인만은 컴퓨터공학자가 아니므로, 이를 찰스 배비지로 바꾼다고 해봅시다.

잘 변경이 되었는지 select 문으로 확인해봅시다.

원하는대로 잘 바뀌었습니다.

Delete - Delete from 구문

이제 row를 삭제하는 SQL 구문을 한번 해보도록 합시다.

number가 3인 필드를 삭제하는 SQL 구문입니다.

잘 삭제된 것을 확인해볼 수 있습니다.

직전 포스팅에서 엑셀과 데이터베이스를 간단하게 비교를 해 봤는데, 이번 글은 직전 포스팅의 후속글입니다. 따라서 예상 독자도 이전글과 동일하게 엑셀로 현업 실무를 하는, 개발자가 아닌 사람입니다.

 

이번 포스팅에서는 DBMS의 몇가지 종류와 특징들, 그리고 SQL이 무엇인지와 스키마에 대해 간략하게 알아보고자 합니다.

데이터베이스 프로그램(DBMS: Database Management System)의 종류

데이터베이스를 다룰 수 있는 컴퓨터 프로그램들이 어떤 것이 있는지를 구체적으로 알아봅시다. 사실 데이터베이스 프로그램 뿐만 아니라 데이터베이스의 패러다임도 다양한 종류가 있습니다. 일단은 가장 전통적이면서도 강력한 관계형 데이터베이스(Relational Database, RDB) 프로그램에 대해 알아보도록 하겠습니다.

햄버거에 맥도날드, 롯데리아, KFC가 있듯이 DBMS에는 sqlite3, mysql, mariadb, postgre-sql, oracle db 시리즈, mongodb, cassandra 등등 여러가지가 있습니다.

사실 근래들어서 새로운 database의 한 패러다임인 nosql db라는 것도 있는데 해당 내용은 나중에 시간이 남게 되면 추가적으로 다루며, 이번에는 다루지 않겠습니다.

일단 데이터베이스를 다루는 프로그램을 두개의 범주로 나누어 보겠습니다.

파일형 Database(Flat-file database)

엑셀의 경우 그 데이터 값들은 하나의 파일에 다 들어가 있습니다. 마찬가지로 데이터베이스 중에서 하나의 파일 형태로 존재하는 데이터베이스가 있습니다. 대표적인 예시로 SQLite3가 있습니다. 그 외에도 마이크로소프트 액세스 같은 것들도 파일형 데이터베이스를 지원합니다. 이어서 나오는 서버형 데이터베이스에 비해서는 처리할수 있는 규모나 성능은 다소 떨어질 수 있으나, 파일 하나에 데이터가 다 들어간다는 간편성이 있습니다.

서버형 데이터베이스

개발자들이 자주 사용하는 형식의 데이터베이스인 서버형 데이터베이스입니다. 실제 IT 서비스에서 자주 사용되는 데이터베이스들이며 파일형 데이터베이스에 비해 큰 규모의 데이터들도 쉽게 처리하며, 하나의 파일 형태로 존재하는 것이 아닌 하나의 컴퓨터에서 지속적으로 실행되고 있는 형태의 프로그램으로 존재합니다. 따라서 그 컴퓨터와 네트워크 연결이 가능한 다른 컴퓨터에서 원격으로 데이터들을 조회하거나 다룰 수 있으며 따라서 여러명의 사용자가 동시에 사용하는 것도 가능합니다. 이에 따라 인증 및 권한과 동시성과 관련된 다양한 복잡한 기능들도 제공을 합니다. 이에 해당하는 DBMS에는 Mysql, MariaDB, PostgreSQL, 오라클 데이터베이스 등이 있습니다.

 

SQL(Structured Query Language)

직역하면 구조화된 질의어에 해당합니다. SQL은 선언형 프로그래밍 언어에 해당하며, 관계형 데이터베이스 관리 시스템(RDBMS)을 사용하기 위한 컴퓨터용 언어입니다. 엑셀의 경우 GUI(Graphical User Interface)를 지원하기 때문에, 눈에 보이는 버튼들을 누르고 셀을 클릭한 뒤 값을 입력하거나 하는 식으로 직관적인 방법으로 데이터들을 처리할 수 있지만, 앞서 위에서 언급한 (관계형) 데이터베이스들은 데이터를 처리하기 위해서 SQL이라고 하는 프로그래밍 언어를 작성한 뒤 이를 이용해서 명령을 내려야 합니다.

데이터를 조회할때는 Select 구문, 수정할때는 Update 구문, 생성할때는 Insert into 구문, 제거할때는 delete from 구문이라는 프로그래밍 언어 문법(Syntax)에 맞는 SQL 구문을 작성한 뒤, 이를 DBMS에 전송해서 작업들을 수행할 수 있습니다.

따라서 이 RDBMS 종류를 다루기 위해서는 SQL이라는 언어를 잘 알아야 하는 것이지요. 혹은 이 SQL 구문들을 자동으로 생성해서 동작하게 끔 하는 프로그램을 별도로 개발한다면, 엑셀을 다루듯이 클릭 등의 직관적인 방법으로 데이터를 다룰 수 있게 할 수 있습니다.

 

관계형 데이터베이스와 스키마

관계형 데이터베이스(Relational-Database)

앞에서 관계형 데이터베이스에 대해서 자세한 설명을 하지 않고 넘어왔지만, 여기서 간략하게 관계형 데이터베이스가 무엇인지 짚고 가겠습니다.

데이터베이스를 어떤 식으로 저장할지는 여러 패러다임들이 있었지만 지금 가장 많이 쓰이는 형식이 관계형 데이터베이스(Relational Database)이며, 데이터베이스를 표 형태로 표현한다라는 뜻이라고 보시면 됩니다.

위 표를 보시면, 간단한 용어를 확인할 수 있는데, Relation(관계)는 표 자체를 뜻하고, Attribute는 특성값이라고 보시면 됩니다. 사실 엑셀도 표 형식이니 이해하기 어렵지 않을 것입니다.

엑셀에 위와 같은 데이터가 있다고 하면, 첫번째 행에 있는 이름, 국어, 영어, 수학 들은 attribute에 해당하며, 각각의 2번째 3번째 행은 tuple에 해당하게 됩니다. 이것이 표 형태로 있는 것이 relation이 됩니다.

이런 용어들은 크게 신경쓸 필요 없고, 다만 관계형 데이터베이스는 데이터를 위와 같은 표 형태로 나타낸다 라는 것만 기억하시면 됩니다.

데이터베이스 스키마

앞에서 관계형 데이터베이스가 표 형식을 따른다고 했습니다. 이때 이 "표의 형태가 데이터베이스 스키마"입니다. 

위에 예시에서 들은 2명의 학생의 국어,영어,수학 성적에 대한 Relation의 스키마를 표현하자면 다음과 같겠습니다.

이름이라는 attribute는 text 데이터를 저장하고, 국어와 영어 수학이라는 attribute는 정수 값을 저장하는 형태를 띱니다.

이 내용 자체가 성적과 관련된 저 Relation의 스키마입니다.

그리고 이 Relation은 RDBMS 및 SQL에서는 테이블이라고 부릅니다. 테이블은 직역하면 표라는 뜻을 갖지요.

 

References

ko.wikipedia.org/wiki/%EA%B4%80%EA%B3%84%ED%98%95_%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4

namu.wiki/w/Microsoft%20Access

namu.wiki/w/DBMS

ko.wikipedia.org/wiki/%ED%94%8C%EB%9E%AB_%ED%8C%8C%EC%9D%BC_%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4

+ Recent posts