검수요청.png검수요청.png

도커 (소프트웨어)

위키원
oshc12 (토론 | 기여)님의 2020년 8월 6일 (목) 15:54 판 (새 문서: 썸네일|200픽셀|'''도커'''(Docker)로고 썸네일|300픽셀|'''도커'''(Docker)글자 '''도커'''(Docker)란...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)
이동: 둘러보기, 검색
도커(Docker)로고
도커(Docker)글자


도커(Docker)란 리눅스 운영체제에서 소프트웨어 컨테이너 기술을 기반으로 한 가상화 플랫폼 서비스이다.

개요

도커는 2013년에 등장한 오픈소스 컨테이너 기반 가상화 도구이다. 도커는 항만(부두)노동자라는 의미를 가지고 있다. 프로그래밍 컨퍼런스 파이콘 US 2013 에서 솔로몬 하이크(Solomon Hykes)가 리눅스의 컨테이너 기술을 사용한 도커를 처음 발표했다. 현재 도커는 고(GO) 언어로 개발되고 있으며, 2014년에 1.0 버전을 발표한 이후, 2020년 현재 최신 버전은 19.03.8 이다. 도커는 리눅스 상에서 컨테이너 방식으로 프로세스를 격리해서 실행하고 관리할 수 있도록 도와주며, 계층화된 파일 시스템에 기반해 효율적으로 이미지 프로세스 실행 환경을 구축할 수 있도록 해준다. 도커를 사용하면 이미지를 기반으로 컨테이너를 실행할 수 있으며, 다시 특정 컨테이너의 상태를 변경해 이미지로 만들수 있다. 이렇게 만들어진 이미지는 파일로 보관하거나 원격 저장소를 사용해 쉽게 공유할 수 있으며, 도커만 설치되어 있다면 필요할 때 언제 어디서나 컨테이너로 실행하는 것이 가능하다.[1] 도커는 복잡한 리눅스 응용 프로그램들을 하나의 컨테이너로 묶어서 실행할 수 있다. 그 이유는 개발 테스트 및 서비스 환경을 하나로 통일하여 효율적으로 관리할 수 있기 때문이다. 이로 인해 많은 사람들에게 주목을 받기 시작했다. 파일을 이미지파일로 변환하여 공유하고 리눅스 커널에서 제공하는 컨테이너 기술을 활용하여 전세계 사람들과 공유도 가능하다. Github와 비슷한 방식의 도커허브(Hub)를 제공한다.


특징

  • 리눅스 컨테이너(Containeer)
도커는 리눅스의 컨테이너 방식을 사용하여 프로그램이 작동한다. 컨테이너 방식은 가상머신의 발달도 등장하게 되었다. 컴퓨터 첫 등장 이후 컴퓨터 성능이 급격히 발전하면서 일반 PC에서도 흔히 사용하게 되었다. 이러한 기술의 발달로 서버의 성능이 향상하게 되었다. 하지만 그만큼 서버에 남아있는 공간도 많고 서버가 일을 하지않으니 문제가 되고 IT 기술이 보편화 되면서 서버도 많아졌다. 그렇기 때문에 컴퓨터에 컴퓨터를 만들어 작동하기 위한 가상머신이 나오게 되었고 서버 자체를 가상머신을 통해서 작동하는 기술이 발달했다. 이는 서버의 빈공간을 가상머신으로 이용하여 서버의 효율을 극대화 시킬 수 있다. 가상머신에 각종 서버 프로그램, 데이터베이스를 설치하여 소프트웨어 응용 프로그램이나 웹사이트를 실행하고, 미리 구축한 가상머신 이미지를 여러 서버에 복사하여 실행하면 이미지 하나로 서버를 계속 만들수

미리 구축한 이미지를 다수의 서버에 복사하여 실행하면 이미지 하나로 서버를 계속 만들어낼 수 있다. 하지만 가상머신은 이미지 안에 OS가 포함되기 때문에 이미지 용량이 커지게 되어 문제가 발생한다. 컴퓨터자체를 전부 사용하다보니 각종 성능에 손실이 발생하게 되었다. 호스트와 커널을 공유하는 반가상화 기술이 등장 했지만 배포하고 관리하는데 기능이 부족했다. 이를 개선하기 위해 리눅스 컨테이너가 나오게 되었다.[2] 컨테이너 박스는 흔히 선박을 통하여 물건을 수출할때 많이 사용한다. 도커의 로고를 보면 알 수있듯이, 컨테이너는 이동하는 물건을 하나의 공간에 담고 목적지까지 안전하게 보낼수 있다. 컨테이너 없이 물건을 하나하나 쌓아서 보관한다면 없어질 경우도 생기고 물건이 충격을 받는다면 부러지거나 변형이 생길수도있다. 이와같이 리눅스에서도 파일 전송 및 변경시 파일안에 있는 데이터가 아무런 보호없이 간다면 충분히 변조 및 데이터패킷이 변형 될 수있다. 그렇기에 가상의 컨테이너 만들어 사용하면 보관하기에도 편하고 같은 목적지를 가는물건일 경우 더욱 안전하게 갈수 있다. 다운받은 프로그램이 같다 해도 서로다른 환경의 응용체제에서 사용하면 조금은 다르게 작동된다. 이는 서버마다 운영기롣이 다르기 때문인데 어디에서도 프로그램을 실행하더라도 100프로 실행할 수있는 기법이 필요하다. 이를위해 복잡한 IT 환경을 통합하여 포장하는 기술이 컨테이너 기술이다. 언제 어디서든 프로그램을 실행핳때 본래의 의도와 맞게 변형이나 문제없이 프로그램이 실행된다.[3] 리눅스 컨테이너에서는 대표적인 2가지 명령어 네임스페이스(NameSpace)와 cgroups(씨그룹스)가 있다.컨테이너는 가상의 독립된 환경을 만들기 위해 리눅스 커널의 네임스페이스 기능을 사용한다. 쉽게 얘기하면 리눅스 객체에 이름표를 붙여 같은 이름표가 붙여진 것들만 묶어 관리한다. 이를 다른말로 격리(isolated)시킨다 라는 의미를 가지는데 이는 다른 네임스페이스에서는 접근이 불가능하다는 걸 의미한다.

  • PID: 각 프로세스에 할당된 고유한 ID 인 PID 를 기준으로 다른 프로세스를 격리한다. 네임스페이스가 다르면 접근할 수없다.
  • network: 네트워크 자원(IP 주소, 포트 번호, 라우팅 테이블 등)을 네임스페이스 마다 독립적으로 가져간다.
  • UID:사용자(User ID)와 그룹(Group ID)를 네임스페이스 별로 구분한다. 따라서 컨테이너에서는 루트 권한을 가지고 있더라도 호스트의 관리 권한을 가질 수 없도록 격리가 가능하다.
  • 마운트: 리눅스에서 파일을 인식하기 위해 마운트가 필요하다. 파일 시스템 등 마운트된 파일을 네임스페이스별로 격리한다.
  • UTS: 호스트명이나 도메인명을 네임스페이스별로 독자적으로 설정이 가능하다.
  • IPC: 프로세스 간 통신에 필요한공유 메모리, 세마포어(Semaphore), 메시지 큐(Message Queue) 등을 독자적으로 사용한다.

리눅스에서 프로그램은 프로세스로 실행되고, 프로세스는 하나 이상의 쓰레드로(Tread) 이루어져 있다. cgroups(Control Groups) 는 프로세스와 쓰레드를 그룹화해서 관리하는 기술이다. 호스트 OS의 자원을 그룹별로 할당하거나 제한을 둘 수 있습니다. 즉 컨테이너에서 사용하는 리소스를 제한함으로써 하나의 컨테이너가 자원을 모두 사용해 다른 컨테이너가 영향을 받지 않게된다. 또한 그룹에 계층 구조를 적용할 수 있어 체계적진 자원관리가 가능하다.

  • cpu: CPU 사용량 제한.
  • cpuacct: CPU 사용량 통계 정보 제공
  • cpuset: CPU 나 메모리 배치 제어
  • memory: 메모리나 스왑(Swap) 사용량 제한
  • devices: 디바이스에 대한 접근 제어
  • freezer: 그룹 내 프로세스 정지 및 재개
  • net_cls: 네트워크 제어.
  • blkio: 블록 디바이스 입출력량 제어[4]


도커 파일(이미지 파일) 도커에서 사용하는 도커파일(Dockerfile)도 앞서 이야기한 서버 운영 기록을 코드화한 것입니다. 이 도커 파일로 도커 이미지를 만들 수 있습니다. 도커 파일이 서버 운영 기록이라면, 도커 이미지는 운영 기록을 실행할 시점이라고 할 수 있습니다. 예를 들어 앞서 살펴본 앤서블의 플레이북으로 서버에 이미지매직을 설치한다고 합시다. 작업자가 1년 전에 이 플레이북으로 서버 A를 구성했고, 오늘 서버 B를 구성한다면, 두 서버에 대해 이미지매직이 설치된 시점은 1년의 차이가 발생합니다. 하지만 도커에서는 앞서 살펴본 도커 파일로 이미지를 만들어 두면, 서버가 구성되는 시점이 이미지를 만든 시점으로 고정됩니다. 이 이미지를 사용해 1년 전에 A 서버에 컨테이너를 배포하고, 오늘 B 서버에 컨테이너를 배포한다고 해도, 두 컨테이너 모두 이미지매직이 설치된 시점은 같습니다 도커는 특히 분산 환경을 쉽게 구축할 수 있는 클라우드 서비스와 잘 맞습니다. 그래서 주요 클라우드 프로바이더들은 모두 컨테이너 실행 환경을 쉽게 관리할 수 있는 서비스를 제공합니다.. https://www.44bits.io/ko/post/why-should-i-use-docker-container#%EC%84%9C%EB%B2%84%EB%A5%BC-%EC%BD%94%EB%93%9C%EB%A1%9C-%EA%B5%AC%EC%84%B1%ED%95%98%EA%B3%A0-%EA%B4%80%EB%A6%AC%ED%95%98%EB%8A%94-%EB%8B%A4%EC%96%91%ED%95%9C-%EB%B0%A9%EB%B2%95








가상머신과의 차이점


가상머신(VM)과 차이 docker는 가볍다. 그리고 빠르다. 즉 docker는 vm에 비해서 가볍고 빠르다는 장점이 있다. 대신에 docker는 상태를 정밀하게 알기는 어렵고 자유롭게 사용하기에는 제약이 많다. 그러나 막상 사용해보면 docker의 장점이 훨씬 부각 된다. 그 이유는 가볍고 빠른것도 있지만 "어느 환경이나 동일하게 작용하기 때문이다" 여기서 동일하게 동작한다는건 완전 밑단까지 같이 동작한다는 이야기가 아니라 사용하는 입장에서 동등하게 사용할 수 있다는 이야기 이다.

도대체 어떻게 이런게 가능하냐면 위의 그림을 보면 알 수 있다. 기존의 vm의 경우에는 Host OS(우리가 사용하는 OS)위에 새로운 Guest OS를 설치를 했다. 그러다보니 OS위에 OS가 있는 모양새이고 이는 필연적으로 속도 저하로 이어진다. 하지만 도커는 OS위에 OS를 설치하는게 아니라 현재 OS에 없는 것만 추가적으로 받아온다. 가령 현재 Host OS가 Redhat인데 Guest OS를 Ubuntu를 사용한다고 가정하자. vm은 redhat위에 ubuntu를 설치하게된다. 근데 도커는 redhat에 없는 부분만, 즉 ubuntu와 redhat이 공유하는 부분은 냅두고 나머지만 재 설치한다. 이게 가능한 이유는 맥과 리눅스는 모두 unix likes운영체제이기 때문이다. 그래서 윈도우에서 사용하는 docker는 리눅스 자체를 vm마냥 올리기 때문에 성능이 안좋다.

그렇다고 윈도우에서 의미가 없는건 아니고 윈도우에서도 리눅스와 똑같은 환경으로 사용할 수 있다는 장점이 있다. 그래서 오히려 윈도우에서 코딩할 수록 docker를 사용하는것이 좋다고 생각한다. 하지만 docker를 사용한다는 의미는 단순히 테스팅을 한다는게 아니다. 오히려 테스팅을 할거면 vm이 훨씬 낫다. 도커는 배포를 위해서 사용하는 것이므로 테스트를 하기에 적합하지는 않다고 생각한다. https://kamang-it.tistory.com/entry/DockerDocker%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-%EB%8F%84%EC%BB%A4%EC%9D%98-%EA%B8%B0%EC%B4%88%EC%99%80-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%84%A4%EC%B9%98%ED%95%98%EA%B3%A0-%EC%82%AC%EC%9A%A91


사용처 문제점



각주

  1. Daegwon Nacyot Kim, 〈[https://www.44bits.io/ko/post/easy-deploy-with-docker 도커(Docker) 입문편 컨테이너 기초부터 서버 배포까지]〉, 《44비츠》, 2020-03-22
  2. pyrasis, 〈도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!〉, 《슬라이드쉐어》, 2015-02-14
  3. 김지성,〈(컨테이너 기술) IT에서 컨테이너란 어떤기술인가요? #클라우드 #맥도날드〉, 2020-07-14
  4. 에릭 한, 〈도커 Docker 기초 확실히 다지기〉, 《GitHub》, 2018-11-16


참고자료








같이 보기

  검수요청.png검수요청.png 이 도커 (소프트웨어) 문서는 하드웨어에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.