프로젝트를 진행하면서 doker라는 것을 사용하였습니다.
제가 아는 지식은 docker를 사용하여 필요한 시스템이나 서버의 image를 만들고 container에 그 이미지를 담아 가상머신(VM)에서 실행하는 것으로 간단하게 알고 있었습니다. 하지만 도커가 어떻게 동작하고 어떤 이점 때문에 사용되는지는 확실지 않아 이번 기회에 정리해보려 합니다.
우선 위키에서 간단하게 적혀있는 내용은
도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싼다. 여기에는 코드, 런타임, 시스템 도구, 시스템 라이브러리 등 서버에 설치되는 무엇이든 아우른다. 이는 실행 중인 환경에 관계 없이 언제나 동일하게 실행될 것을 보증한다
위에 굵은 글씨로된 부분이 docker의 가장 큰 장점이 아닌가 싶습니다.
그럼 이제 도커에 대해 상세히 알아보겠습니다.
Docker란?
Docker는 컨테이너 기반의 오픈소스 가상화 플랫폼입니다. Docker는 소프트웨어를 container라는 표준화된 유닛으로 패키징하며, 이 container에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는데 필요한 모든 것이 포함되어 있습니다. 즉 실행환경을 container로 추상화하고 동일한 인터페이스를 제공하여 환경에 구애받지 않고 애플리케이션을 신속하게 배포,확장 및 관리할 수 있게 해줍니다.
이렇게 생성된 container는 백엔드 프로그램, 데이터베이스 서버, 메시지 큐등 어떤 프로그램도 컨테이너로 추상화할 수 있고 조립PC, AWS, Azure, Google cloud등 어디에서든 실행할 수 있습니다.
Container란?
Docker는 코드를 실행하는 표준 방식을 제공합니다. Docker는 컨테이너를 위한 운영 체제입니다. 가상 머신이 서버 하드웨어를 가상화하는 방식과 비슷하게(직접 관리해야 하는 필요성 제거) 컨테이너는 서버 운영 체제를 가상화합니다. 그리그리고 Docker는 각 서버에 설치되며 컨테이너를 구축, 시작 또는 중단하는 데 사용할 수 있는 간단한 명령을 제공합니다.
컨테이너는 격리된 공간에서 프로세스가 동작하는 기술입니다. 가상화 기술의 하나지만 기존방식과는 차이가 있습니다.기존의 가상화 방식은 주로 OS를 가상화하였습니다.
이 방식은 호스트 OS위에 게스트 OS 전체를 가상화하여 사용하는 방식입니다. 이 방식은 여러가지 OS를 가상화(리눅스에서 윈도우를 돌린다던가) 할 수 있고 비교적 사용법이 간단하지만 무겁고 느려서 운영환경에선 사용할 수 없었습니다.간단하게 이야기해서 각각의 가상머신이 OS를 자체적으로 가지고 있기 때문에 OS를 가상머신 이미지에 포함해야 하고, 배포이미지의 용량이 커지게 된다는 단점이 있다.
하지만 Docker의 container 기술을 사용하면 OS레벨은 공유하며고 어플리케이션 레벨에서는 각각의 어플리케이션을 격리해서 실행 할 수 있습니다. 그래서 하나의 서버에 여러개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행할수 있습니다. 그리고 실행중인 컨테이너에 접속하여 명령어를 입력할 수 있고, 패키지를 설치할 수 있으며, 사용자도 추가하고 여러개의 프로세스를 백그라운드로 실행할 수도 있습니다. CPU나 메모리 사용량을 제한할 수 있고 호스트의 특정 포트와 연결하거나 호스트의 특정 디렉토리를 내부 디렉토리인 것처럼 사용할 수도 있습니다.
Image 란?
Docker에서 Image는 컨테이너를 정의하는 읽기 전용 템플릿입니다. 설명하자면 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것으로 상태값을 가지지 않고 변하지 않습니다(Immutable). 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장됩니다. 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있습니다.
이런 image들은 도커 이미지는 Docker hub에 등록하거나 Docker Registry 저장소를 직접 만들어 관리할 수 있습니다.
그럼 지금까지는 Docker가 무엇인가를 알아봤고, 이제는 왜 사용하는지(장점)에 대해서 알아보겠습니다.
1. 빠른 시작과 종료 속도. - 가상환경이 커널에서 공유되기 때문에 새로운 커널을 시작할 필요가 없고, 하드웨어 초기화 등의 작업이 필요 없다.
2. 높은 집적도 - 테이너는 커널이 직접 프로세스를 조작하여 분리된 공간을 구성하기 때문에 PC상에서 동작하는 OS는 하나이다. / 여러 개의 컨테이너를 만들어 실행 중이라고 해도 OS는 하나이기 때문에, 가상머신에 비해 고밀도가 가능하다. / 컨테이너에서는 실행되는 프로세스를 위한 메모리만 필요하기 때문에 낮은 사양의 환경에서도 동작이 가능하다.
3. 낮은 오버헤드 - 상화를 위한 하드웨어 에뮬레이트 단계없이, 분리된 공간을 만들기 때문에 오버해드가 줄어든다.
4. 애플리이케이션 컨테이너 지원 - 컨테이너는 가상머신과 달리 init을 먼저 시작하거나 각종 데몬들을 실행할 필요가 없다. / 컨테이너는 목적에 맞는 프로세스만 존재하는 환경을 만들 수 있다. 예를 들어 웹서버용 컨테이너라면 Apache Httpd 프로세스만 존재하는 컨테이너를 만들 수 있다. / 이러한 환경을 애플리케이션 컨테이너라고 하며, init를 처음 시작하여 보통의 OS가 시작하는 것과 같은 환경을 만들 수 있는데 이를 시스템 컨테이너라고 부른다.
5 더 많은 소프트웨어를 더 빨리 제공 - Docker 사용자는 평균적으로 Docker를 사용하지 않는 사용자보다 7배 더 많은 소프트웨어를 제공합니다. Docker를 사용하면 필요할 때마다 격리된 서비스를 제공할 수 있습니다.
6. 운영 표준화 - 작은 컨테이너식 애플리케이션을 사용하면 손쉽게 배포하고, 문제를 파악하고, 수정을 위해 롤백할 수 있습니다.
7. 원활하게 이전 - Docker 기반 애플리케이션을 로컬 개발 시스템에서 AWS의 프로덕션 배포로 원활하게 이전할 수 있습니다.
8. 비용 절감 - Docker 컨테이너를 사용하면 각 서버에서 좀 더 쉽게 더 많은 코드를 실행하여 사용률을 높이고 비용을 절감할 수 있습니다.
이런 장점을 지닌 docker는 보통 서버 관리에서 많이 사용되고 있는 것으로 알고 있습니다. 그리고 제가 docker를 사용해보고 느낀 점은 server개발을 위해 작성한 파일을 image로 만들고 그다음 container로 패키징을 하니 다른 사람에게 전달해도 동일한 환경에서 동작하게 되는 점이 좋았습니다. 그리고 생성한 container만 실행하면 되니 간단하고 다른 가상머신과는 다르게 가볍고 또 image 생성 속도도 빨라서 아주 좋았습니다.
참고
https://www.docker.com/resources/what-container
https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html
https://www.redhat.com/ko/topics/containers/what-is-docker
https://aws.amazon.com/ko/docker/
https://judo0179.tistory.com/14
'2023년 이전 > Web&Server' 카테고리의 다른 글
NodeJs란 ? 그리고 왜 사용하였는가? (0) | 2019.12.02 |
---|---|
Http 와 Https 그리고 SSL (0) | 2019.12.02 |
Docker에서 mySql 실행하기 - container 접속하기 (0) | 2019.12.02 |
Docker 실행 해보기! (0) | 2019.12.02 |
OpenSSL을 사용해서 Https 서버 open (3) | 2019.11.28 |