🔵 도커란 ?
도커(Docker)란 리눅스 컨테이너를 기반으로 하여 특정한 서비스를 패키징하고 배포하는데 유용한 오픈소스 프로그램이다.
만약 윈도우에서 리눅스를 쓰고 싶다면 어떻게 해야할까?
- 저장공간을 나누고 나서 처음부터 윈도우따로 리눅스따로 설치해서 한가지만 구동시키는 멀티부팅 방식.
- AWS을 사용하여 컴퓨터를 대여하는 방식.
- 버추얼박스같은 가상머신 솔루션을 이용하는 방법
가상머신은 하이퍼바이저를 이용해 Guest OS를 만들어낸다.
예를 들어, 윈도우 운영체제를 메인으로 쓰고 있다면 이는 Host OS가 되는 것이고
이 위에 Ubuntu를 가상머신위에 구동시킨다면 이는 Guest OS가 되는 것이다.
Guest OS를 구동시키려면 Host OS에서 자원을 일부 사용해야 한다.
따라서 Host OS도 느려지고, Guest OS도 성능이 그리 좋은 편은 아니다.
그렇다면 도커의 컨테이너는 뭐가 다를까?
가상머신에 비해 꼭 필요한 것만 담겨서 구동된다는 차이가 있다.
즉, 컨테이너에 필요한 커널은 호스트의 커널과 공유해서 사용하고, 컨테이너 안에는 애플리케이션을 구동하는데 필요한 라이브러리 및 실행파일만 존재하기 때문에 컨테이너를 이미지로 만들경우 용량이 대폭 줄어든다.
🔵 이미지란 ?
도커에서 가장 중요한 개념은 컨테이너와 함께 이미지라는 개념입니다.
이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것으로 상태값을 가지지 않고 변하지 않습니다(Immutable).
컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장됩니다.
같은 이미지에서 여러개의 컨테이너를 생성할 수 있고
컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있습니다.
ubuntu이미지는 ubuntu를 실행하기 위한 모든 파일을 가지고 있고
MySQL이미지는 debian을 기반으로 MySQL을 실행하는데 필요한 파일과 실행 명령어, 포트 정보등을 가지고 있습니다.
좀 더 복잡한 예로 Gitlab 이미지는 centos를 기반으로
ruby, go, database, redis, gitlab source, nginx등을 가지고 있습니다.
말그대로 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 더 이상 의존성 파일을 컴파일하고
이것저것 설치할 필요가 없습니다.
이제 새로운 서버가 추가되면 미리 만들어 놓은 이미지를 다운받고 컨테이너를 생성만 하면 됩니다.
한 서버에 여러개의 컨테이너를 실행할 수 있고, 수십, 수백, 수천대의 서버도 문제없습니다.
도커는 이미지를 만들기 위해 Dockerfile이라는 파일에 자체 DSLDomain-specific language언어를 이용하여
이미지 생성 과정을 적습니다.
# vertx/vertx3 debian version
FROM subicura/vertx3:3.3.1
MAINTAINER chungsub.kim@purpleworks.co.kr
ADD build/distributions/app-3.3.1.tar /
ADD config.template.json /app-3.3.1/bin/config.json
ADD docker/script/start.sh /usr/local/bin/
RUN ln -s /usr/local/bin/start.sh /start.sh
EXPOSE 8080
EXPOSE 7000
CMD ["start.sh"]
이것은 굉장히 간단하지만 유용한 아이디어인데,
서버에 어떤 프로그램을 설치하려고 이것저것 의존성 패키지를 설치하고 설정파일을 만들었던 경험이 있다면
더 이상 그 과정을 블로깅 하거나 메모장에 적지 말고 Dockerfile로 관리하면 됩니다.
이 파일은 소스와 함께 버전 관리 되고 원한다면
누구나 이미지 생성과정을 보고 수정할 수 있습니다.
🔵 도커의 특징 ?
- docker는 서로 독립적이라서 하나의 서버가 많은 수의 컨테이너를 가질 수 있다.
- docker 덕분에 매번 새로운 서비스를 만들 때마다 새로운 서버를 사고 설정할 필요가 없다.
- 간단하게 docker container를 더 늘리면 된다.
- 원하는 개발 환경을 파일에 저장하면 docker는 내가 원하는 해당 환경을 시뮬레이션 해준다.
- 각각의 환경들은 독립적으로 존재하기 때문에 무슨 환경이든 모듈식으로 관리 가능하다.
- python server, java server, db server 등 모두 따로 구매해줄 필요 없다.
🔵 도커의 장점
예를 들어,
어떤 프로젝트는 스프링으로 되어있고,
또 다른 어떤 프로젝트는 NodeJS로 되어있다고 해보면 어떨까?
한 컴퓨터에다가 이것도 설치하고 저것도 설치해야 하고 이것 따로 설정하고 저것 따로 설정해야 할 것이다.
사실 이런 방법은 좋지 않다.
- 가장 큰 장점은 역시 애플리케이션 독립성이다. 호스트 OS와도, 다른 컨테이너와도 독립된 공간을 보장받을 수 있기 때문에 충돌 발생 염려가 전혀 없다.
- 또한 컨테이너 내부에 작업을 한 후에 배포하려고 한다면 도커 이미지라는 패키지로 만들어서 운영서버에 전달만 하면 된다. 즉, 배포가 쉬워진다.
- 모놀리식 애플리케이션 방식에서 마이크로서비스 구조로 변화가 쉽다. 즉, 컨테이너 하나당 하나의 기능만을 제공하는 모듈로 만들어서 부하가 많은 모듈은 여러개 더 만들고 하는 조정이 가능해진다.
🔵 볼륨(데이터)을 공유 하지 않으면 서로 같이 쓸 수가 없다.
- docker volume
- docker를 사용하다보면 container안에서의 데이터 휘발성 때문에 volume을 사용하게 된다.
- 하나의 서버안에서도 여러개의 docker가 돌 수 있고, 특정 docker안에서 만들어진 파일은, 공유할 수 없다.
- 이런 불편함을 막기 위해 서버 안에 디스크를 mount 해놓고 사용하면 된다.
- docker 컨테이너는 언제든지 추가되고 삭제 될 수 있기 떄문에 데이터는 반드시 컨테이너 내부가 아닌 외부 스토리지에 저장해야 한다.
참고 사이트
'TEAM STUDY > SERVER' 카테고리의 다른 글
🔵쿠버네티스 강의 1주차 - VM 과 Container 차이 (0) | 2021.06.30 |
---|---|
🔵 쿠버네티스 강의 1주차 - Auto Scaling / Auto Healing / Deployment (0) | 2021.06.30 |
🔵쿠버네티스 강의 1주차 - 도커와 쿠버네티스 차이점 (0) | 2021.06.30 |
🔵쿠버네티스 강의 1주차 - 왜 쿠버네티스를 사용해야 하는가 (0) | 2021.06.30 |
쿠버네티스 강의 1주차 (0) | 2021.06.30 |