1 - 도커란 무엇인가
도커란 무엇인가?
데이터 또는 프로그램을 격리시키는 기능 을 제공하는 소프트웨어
도커?멀티 프로세스? 차이점 궁금하지 않나요
격리수준: 도커는 파일 시스템, 네트워크 등을 포함한 완전 격리를 제겅히지만, 멀티 프로세스는 메모리만 격리하고 파일 시스템이나 네트워크는 공유할 수 있다
사용 목적: 도커는 애플리케이션 배포와 격리된 실행 환경을 위해 사용, 멀티 프로세스는 하나의 시스템에서 여러 작업을 병렬로 처리하는 데 중점을 둠
성능: 도커는 가상화와 비슷하지만 더 가벼운 방식으로 동작하며, 멀티 프로세스는 동일한 운영 체제 자원 안에서 프로세스만 격리하고 병렬 처리 수행 함.
깨알상식: 멀티스레드, 멀티프로세스?
멀티스레드는 T 메모리 구조에서 스택 영역을 스레드 개수만큼 분할해서 쓰는것
즉 하나의 T 메모리 안에서 스택 영역만 분할한 것이기 때문에 하나의 스레드에서 다른 스레드로 접근할 수 없지만 static 영역과 heap 영역은 공유해서 사용하는 구조
멀티프로세스는 위에 적혀진것 처럼 다수의 메모리를 갖는 구조
도커 vs 가상 머신(VM) -> 나중에 좀 더 정리가 필요
도커는 어떻게 개별환경을 제공하면서도 경량화되고 빠를까?
- 호스트 운영체제의 커널을 공유하여 추가적인 운영체제 오버헤드가 없다.
- Namespace 와 Cgroups 기술을 사용하여 개별 애플리케이션 환경을 가볍게 격리한다.
- 레이어 기반 이미지 관리를 통해 중복을 최소화하고, 빠르게 컨테이너를 생성 및 실행할 수 있다.
- 운영체제 부팅 과정이 없고 애플리케이션만 실행하기 때문에 매우 빠르게 동작한다.
애플리케이션 실행환경을 하나로 묶어 격리된 상태에서 실행할 수 있는 가벼운 패키지같은 것을 컨테이너라 하고,
도커를 사용하려면 도커 소프트웨어 본체인 도커 엔진을 설치해야 하고, 도커 엔진을 사용해 컨테이너를 생성하고 구동시킬 수 있다
도커 엔진이 있어야 컨테이너를 만들 수 있디고 설명했지만 ,컨테이너를 만들려면 도커 엔진 외에도 컨테이너 빵틀과도 같은 역할을 할 이미지가 필요하다
컨테이너는 여러개 만들 수 있고, 용량이 허락하는 한 하나의 도커에서 여러 개를 만들 수 있다.
도커를 사용하는 데는 몇가지 제약 사항이 있다.
- 종류와 상관없이 리눅스 운영체제가 필요하다(도커가 리눅스 운영체제에서 사용하는 것을 전제로 만들었기 때문)
- window, macOS 에서도 구동할 수 있지만 이 경우 내부적으로 리눅스가 사용된다
데이터나 프로구램을 독립된 환경에 격리해야 하는 이유
실행환경이나 라이브러리, 디렉터리나 설정파일같은것들을 공유하면 공유하는 대상을 어느 한쪽만을 위해 수정하면 다른쪽에서 오류가 날 가능성이 높다.
대게 설계할 때는 무네가 없던 프로그램도 실제로 설치하면 오류를 일으키는 경우가 많은데, 대부분의 문제의 원인은 프로그램 간 공유 에 있다.(프로그램에 따라 버전 설치, 디렉터리 설정 등)
프로그램 격리란?
도커 컨테이너는 다른 컨테이너와 완전히 분리된 환경. 즉 컨테이너 안에 들어있는 프로그램은 다른 프로그램과 격리된 상태
서버와 도커
도커는 서버에서 사용되는 소프트웨어다.
리눅스vs유닉스 비교해보면 재밌을 것 같다.
또한 리눅스의 다양한 배포판인 Ubuntu, Fedora, CentOS, Debian 등 을 살펴보면 더 좋을 것 같다.
도커를 사용하면 여러 서버를 하나의 물리적인 서버에 격리된 실행환경으로 운영할 수 있다.
컨테이너를 자유로이 옮길 수 있다.
실제로는 컨테이너 자체를 옮긴다기보다는 컨테이너의 정보를 내보내기한 다음, 다른 도커 엔진으로 복원하는 형태가 되지만 어쨋든 컨테이너를 어떤 도커 엔진에서 다른 도커 엔진으로 옮기기는 그리어려운 일이 아니다.
이런 특성을 이용하면 똑같은 상태로 튜닝한 컨테이너를 팀원 전원에게 배포해 모두가 동일한 개발환경을 사용할 수 있다.
도커만 설치돼 있으면 되므로 운영체제가 달라도 이를 신경 쓰지 않고 컨테이너를 옮길 수 있다.
도커를 이용하면 물리적 환경의 차이, 서버 구성의 차이를 무시할 수 있으므로 운영 서버와 개발 서버의 환경 차이로 인한 문제를 원천적으로 방지할 수 있다.