도커란 무엇인가?
•
서버를 효과적으로 관리하기 위한 툴
•
서버는 A부터 Z까지 눈에는 잘 안보이지만 굉장히 복잡한 유기적 구조로 얽혀 있음
•
그래서 하나라도 실수하면 작동이 안되는 불 상사가 발생할 수 있음
•
그걸 방지하기 위한 오픈소스 공짜 프로그램이다.
그렇다면 왜 도커를 쓰는가?
•
회사에서 Oracle설치해달라 Wordpress설치해달라 Git 설치해달라 여러 부탁이 올 때 메뉴얼 보고 따라하는건 옛날 방식이다.
•
버전이 안 맞거나 컴퓨터 운영체제 따라서 설치가 될수도 있고 안 될수도 있다.
•
프로그램을 설치하는걸 넘어서 AWS랑 Azure Google Cloud 같은 환경도 바뀔 수 있고, 웹프로그래밍 할때에도 누구는 Go 누구는 Node.JS 등 다들 개발 환경이 전부 달라서 따로 취급해줄 필요가 있다.
•
그래서 이걸 해결해주고자 하는것이 바로 Docker이다.
도커가 등장한 후 서버관리 방식 변화
•
파이썬 버전이 바뀌어도 두려움이 사라짐
•
어떠한 프로그램도 컨테이너로 만들 수 있음 (컨테이너 : 가상머신과 비슷하지만 하나의 독립적인 작은 파티션 공간이라고 생각하면 됨)
•
도커의 컨테이너 개념은 가상머신처럼 독립적으로 실행되지만 더 빠르고 더 쉽고 더 효율적이다.
•
패키지 업데이트도 그냥 콘테이너 만들어서 돌리면 된다.
•
옛날에는 원시적으로 PPT 보고 메뉴얼을 만들었다.
•
그리고 CHEF, Puppet, Ansible 같은 상태 도구들이 나오긴 했지만 어려웠다.
•
가상머신을 이제 썼는데 이제 느리고 서버 이미지 공유도 어려웠다.
•
가상으로 이제 자원을 분할하기 시작했는데 CPU MEMORY 등 각 할당을 나눠서 관리를 하였으나 구글이나 아마존같은 대기업 사람들만 잘 했다.
•
도커는 자원할당을 쉽게 만든 솔루션이다.
도커의 특징
•
가상머신과 도커의 차이점은 다음과 같다.
•
위의 내용에서 Overhead라는 부분은 바로 윈도우에서 리눅스 까는것 처럼 운영체제 위에 운영체제를 까는것을 의미한다.
•
도커는 그럴 필요없이 독립적으로 따로 놔둬서 취급하기에 훨씬 빠르다.
•
도커가 설치되어 있다면 어디서든 컨테이너를 실행할 수 있음
•
특정 회사나 서비스에 종속적이지 않음 (무료)
•
쉽게 개발서버를 만들 수 있고 테스트서버 생성도 간편함
•
도커를 사용하지 않는 경우 ruby, nodejs, go, php로 만든 서비스들의 배포 방식은 제각각 다름
•
컨테이너라는 표준으로 서버를 배포하므로 모든 서비스들의 배포과정이 동일해짐
도커의 이미지
•
이미지에서 컨테이너를 생성하기 때문에 반드시 이미지를 만드는 과정이 필요
•
Dockerfile을 이용하여 이미지를 만들고 처음부터 재현 가능
•
빌드 서버에서 이미지를 만들면 해당 이미지를 이미지 저장소에 저장하고 운영서버에서 이미지를 불러옴
•
설정관리는 이렇게 한다.
◦
설정은 보통 환경변수로 제어함
◦
MYSQL_PASS=password와 같이 컨테이너를 띄울때 환경변수를 같이 지정
◦
하나의 이미지가 환경변수에 따라 동적으로 설정파일을 생성하도록 만들어져야함
•
자원관리는 이렇게 한다.
◦
컨테이너는 삭제 후 새로 만들면 모든 데이터가 초기화됨
◦
업로드 파일을 외부 스토리지와 링크하여 사용하거나 S3같은 별도의 저장소가 필요
◦
세션이나 캐시를 memcached나 redis와 같은 외부로 분리
도커가 가져온 변화
•
클라우드 이미지보다 관리하기 쉬움
•
다른 프로세스와 격리되어 가상머신처럼 사용하지만 성능저하 (거의) 없음
•
복잡한 기술(namespace, cgroups, network, ...)을 몰라도 사용할 수 있음
•
이미지 빌드 기록이 남음 (Git 활용 가능)
•
코드와 설정으로 관리 > 재현 및 수정 가능
•
오픈소스 > 특정 회사 기술에 종속적이지 않음
도커의 응용버전 쿠버네티스
•
쿠버네티스란? 여러대의 서버와 여러개의 서비스를 관리하기 쉽게하는 목적으로 만든 프로그램
•
스케쥴링
◦
컨테이너를 적당한 서버에 배포해 주는 작업
◦
여러 대의 서버 중 가장 할일 없는 서버에 배포하거나 그냥 차례대로 배포 또는 아예
랜덤하게 배포
◦
컨테이너 개수를 여러 개로 늘리면 적당히 나눠서 배포하고 서버가 죽으면 실행 중
이던 컨테이너를 다른 서버에 띄워줌
•
클러스터링
◦
여러 개의 서버를 하나의 서버처럼 사용
◦
작게는 몇 개 안 되는 서버부터 많게는 수천 대의 서버를 하나의 클러스터로
◦
여기저기 흩어져 있는 컨테이너도 가상 네트워크를 이용하여 마치 같은 서버에 있
는 것처럼 쉽게 통신
•
서비스 디스커버리
◦
서비스를 찾아주는 기능
◦
클러스터 환경에서 컨테이너는 어느 서버에 생성될지 알 수 없고 다른 서버로 이동
할 수도 있음
◦
따라서 컨테이너와 통신을 하기 위해서 어느 서버에서 실행중인지 알아야 하고 컨테
이너가 생성되고 중지될 때 어딘가에 IP와 Port같은 정보를 업데이트해줘야 함
◦
키-벨류 스토리지에 정보를 저장할 수도 있고 내부 DNS 서버를 이용