[도커] 1. 도커의 배경

eternal moment·2023년 4월 3일
0

배포

목록 보기
1/1

도커강의 정리본입니다.

도커

  • 정의 : 컨네이너 기반의 오픈소스 가상화 플랫폼
  • 어떤 문제를 어떻게 해결했는가.
    • 서버를 관리한다는 것은, 복잡하다 ( 프로그램 설치 외에 인프라(서버환경)이나 개발환경이 바뀌는 경우)
    • 도커가 등장하고 서버관리/개발 방식이 완전히 바뀌게 됨 )⇒ 컨테이너 방식

도커 컨테이너 생성 데모

  • Jenkins 라는 애플리케이션 띄우기
    • Jenkins : 자바로 만들어진 ci-cd 파이프라인 툴 얘를 설치하려면 자바를 설치하고 특정 설정 파일을 만들고 자바애플리케이션을 실행해야해야 실행되는데 밑의 명령어로도 실행이 가능
    • docker-compose up

- wordpress - php로 만들어짐 블로그를하기 위한 도구 - 글을 저장하기 위한 데이터베이스 마이에스큐엘이 필요 - 그것들을 실행하는걸 - `docker-compose up` - 한 서버에서 동일한 역할을 하는 프로그램을 여러개 띄우는게 쉽지않음 - 서버를 설치할때 특정 경로를 설정하는데 경로가 겹칠 수 있기 땜에 어려움 - rocket-chat - 어떤 언어로 만들어진지 어떤 프로그램으로 설치되어있는지 모르는데 docker-compose up으로 실행 가능

서버 관리 방식의 변화

전통적인 서버 관리 방식 : 복잡

도커를 이용한 서버 관리 방식 : 모든게 컨테이너로 추상화됨

  • 서로 다른 프로그램이지만 컨테이너라는 형태로 만들 수 있게 됨.
  • 이는 어디서든 돌아감=컨테이너를 실행할 수 있음
  • 가상머신 같은건지 ? ⇒ 반은 맞고 반은 틀림
    • 공통점
      • 독립적으로 실행 : 하나가 실행된다 해서 다른 컨테이너에 영향 X
    • 차이점
      • 도커가 가상머신보다
        • 빠름
          • 명령어를 치자마자 실행됨
        • 쉬움
          • 도커 컴포즈 업 명령어 하나만 알아도 실행시킬 수 있음
        • 효율적
          • 가상머신은 cpu, 메모리 굉장히 느림

도커의 등장

역사적 관점

중간에 어떤 버전이 바뀌면 버전을 업뎃 했을 때 어떤 일이 벌어질지 모름.

각각 단계마다 생길 문제를 또 예측해야함 어디서 문제가 생기면 와르르 무너짐

어떻게 도커가 등장 ?

결국 서버의 상태를 관리하기 위한 노력.

서버의 설치와 업뎃이 편리해야하기 때문

  • 첫번째 시도 : 문서화
    • 문제 : 문서가 좋더라도 다른 os에는 어떻게 적용해야할지, 모름
    • 문서가 정확한지 모름
    • 오류가 나면 어떻게 할지 모름
    • 문서가 업뎃되면 어디 올려야할지 모르니 문서의 관리 문제
  • 두번째 시도 : 상태관리 도구

    • 상태관리도구란
      • 리드미엠디처럼 설정파일로 관리. 프로그램을 돌리면 프로그램이 명령어를 넣듯 관리
      • 설정 공유 가능
      • 문서보다는 나음
      • 코드라 협업 가능 버전관리 가능
    • 문제
      • 명령어가 다를 수 있음
      • test를 서버 땜에 잘 못하는경우
      • 버전마다 경로와 설정을 다르게 하는 경우 어려움
      • 버전 관리 붏편
  • 가상머신

    • 가상머신을 관리할 서버를 만들고
    • 서버에 가상머신들을 띄움
    • 장점
      • 여러개의 설치가 쉬움
      • 현재 상태 저장 용이 → 언제든 재설치 가능
    • 문제
      • 처음부터 재새팅 어려움
      • 어떤식으로 만들어졌는지 모름
      • 공유하기 어려움
      • 파일의 크기가 큼
      • 가상머신이라 속도 느림
  • 자원격리

    • 프로세스를 가상으로분리
      • 리눅스
    • 파일, 디렉토리도 가상으로 분리
      • 실제로는 같은 데인데 가상으로 분리되는 것 처럼
    • cpu, memory, i/o 를 그룹별로 제한
    • 장점 : 리눅스 기능을 이용한 빠르고 효율적인 서버 관리
      • 가상머신이 아니면서 격리라는 기술을 사용하는거라서 굉장히 빠르고 효율
    • 단점 : 리눅스의 가상화가(기술이) 어려움

  • 도커의 등장

    • 어렵고 복잡한 기술을 사용하기 쉽게
      • 컨테이너를 통해 리눅스의 설치 및 사용을 쉽게 해줌
    • 2013년에 DotCloud(현 Docker)에서 첫 공개한 컨테이너
      • 격리된 환경에서 작동하는 프로세스 리눅스 커널의 여러 기술을 활용
      • 하드웨어 가상화 기술보다 가벼움
      • 이미지 단위로 프로세스 실행 환경을 구성

도커란

  • 도커와 가상머신의 차이
    • 도커는 격리만 해주기 때문에 성능 상으로 속도 하락이 거의 없음
  • 도커의 특징
    • 확장성, 이식성

      • 도커가 설치되어 있다면 어디서든 컨테이너를 실행할 수 있음
      • 특정 회사나 서비스에 종속적이지 않음(=오픈소스)
      • 쉽게 개발 서버를 만들 수 있고 테스트 서버 생성도 간편함
    • 표준성

      • 도커를 사용하지 않는 경우 Ruby, node.js, go, php 로 만든 서비스들의 배포 방식은 제각각 다름
      • 컨테이너라는 표준으로 서버를 배포하므로 모든 서비스들의 배포과정이 동일해짐
      • capistrano? fabric? ftp? 등의 배포하는 방식을 쓰지 않아도 ㄱㅊ
    • 이미지

      • 여기서 이미지는 컨테이너를 실행하기 위한 압축 파일
      • 이미지에서 컨테이너를 생성하기 때문에 반드시 이미지를 만드는 과정이 필요
      • Dockerfile(스크립트)을 이용하여 이미지를 만들고 처음부터 재현 가능
      • 빌드 서버에서 이미지를 만들면 해당 이미지를 이미지 저장소에 저장하고 운영서버에서 이미지를 불러옴
    • 설정관리

      • 설정은 보통 환경변수로 제어함
      • MYSQL_PASS=password와 같이 컨테이너를 띄울때 환경변수를 같이 지정
      • 하나의 이미지가 환경변수에 따라 동적으로 설정 파일을 생성하도록 만들어져야함
    • 자원관리
      - 컨테이너는 삭제 후 새로 만들면 모든 데이터가 초기화 됨
      - 업로드 파일을 외부 스토리지와 링크하여 사용하거나 S3같은 별도의 저장소가 필요
      - 세션이나 캐시를 memcached나 redis와 같은 외부로 분리


    • 도커가 가져온 변화

      • 클라우드 이미지보다 관리하기 쉬움

      • 다른 프로세스와 격리되어 가상머신처럼 사용하지만 성능 저하가 거의 없음

      • (리눅스의) 복잡한 기술(namespace, cgroups, network, ...)을 몰라도 사용할 수 있음

      • 이미지 빌드 기록이 남음

      • 코드와 설정으로 관리 > 재현 및 수정 가능

      • 오픈소스 > 특정 회사 기술에 종속적이지 않음

        ⇒ 서버관리의 혁신


도커의 미래

(컨테이너)의 미래

kubernetes

  • 도커가 하나의 프로그램을 관리하는 방식이라면

  • 쿠버네티스는 여러대의 서버와 여러개의 서비스를 관리하기 쉽게 해줌(여러개의 도커라 생각)

  • 대표적인 기능

    • 스케줄링

      • 컨테이너를 적당한 서버에 (컨테이너를) 배포해주는 작업
      • 여러 대의 서버 중 가장 할일 없는 서버에 배포하거나 그냥 차례대로 배포 또는 아예 랜덤하게 배포
      • 컨테이너 개수를 여러 개로 늘리면 적당히 나눠서 배포하고 서버가 죽으면 실행 중이던 컨테이너를 다른 서버에 띄워줌
    • 클러스터링

      • 여러 개의 서버를 하나의 서버처럼 사용
      • 작게는 몇 개 안되는 서버부터 많게는 수천 대의 서버를 하나의 클러스터로
      • 여기저기 흩어져있는 컨테이너도 가상 네트워크를 이용하여 마치 같은 서버에 있는 것처럼 쉽게 통신
    • 서비스 디스커버리

      • 서비스를 찾아주는 기능
      • 클러스터 환경에서 컨테이너는 어느 서버에 생성될지 알 수 없고 다른 서버로 이동할 수도 있음
      • 따라서 컨테이너와 통신을 하기 위해서 어느 서버에서 실행중인지 알아야하고 컨테이너가 생성되고 중지될 때 어딘가에 IP와 Port같은 정보를 업데이트 해줘야함
      • 키-벨류 스토리지에 정보를 저장할 수도 있고 내부 DNS서버를 이용

0개의 댓글