고래만 생각날 뿐...도커가 뭐냐고 물어보면 어버버...
도커(Docker)는 컨테이너에 기반해 애플리케이션을 구축하는 소프트웨어 플랫폼
핵심 키워드는 컨테이너!!
컨테이너의 장점: 물자를 싣고 내릴 때의 시간과 인력을 단축할 수 있다
컨테이너가 대체 애플리케이션과 무슨 상관일까?
배포라는 개념도소프트웨어 수송
이 아이디어에서 컨테이너 개념을 접목시켜 보자는 생각으로 발전해서 나온 것이 리눅스 컨테이너 Ixc
Linux Container
필요한 라이브러리와 애플리케이션을 모아서 마치 별도의 서버처럼 구성
2013년 Docker의 등장으로 Docker Hub라는 소프트웨어 저장소와 함께 빠르게 성장
-> 개발자들은 쉽게 애플리케이션을 포장해서 컨테이너 방식으로 실행
즉, 컨테이너란 실행 환경에 구애받지 않고 애플리케이션을 실행하는 것
본격적으로 컨테이너에 대해 알아보기 전에 Docker 핵심 키워드를 정리하고 가자
애플리케이션의 의존성, 네트워크 환경, 파일 시스템에 구애받지 않고
docker라는 기술 위에 실행될 수 있도록 만든애플리케이션 상자
애플리케이션 및 애플리케이션 구성을 함께 담아 놓은
템플릿
이를 이용하여 즉시 컨테이너를 만들 수 있음
-> 실행되는 모든 컨테이너는이미지로부터 실행
이미지를 이용하여 여러 개의 컨테이너 생성 가능
-> 애플리케이션의 수평 확장 가능
이미지는 base image로부터 변경 사항을 추가/커밋함으로써 또 다른 이미지 생성 가능
이미지는 레지스트리에 저장
대표적인 이미지 레지스트리: Docker Hub, Amazon ECR

일부 애플리케이션은, 실행을 위해 특정 환경 구축 필요
-> A 프로그램 실행을 위해 또 다른 프로그램인 B가 반드시 필요
프로그램 A는 프로그램 B에 의존 관계를 가지고 있다
+) 예를 들어 임의의 프로그램에 대해 의존 관계를 가지는데, 특정 프로그램 버전 요구
+) 동일한 컴퓨터에 같은 프로그램에 대해 의존 관계를 가지며 다른 버전 요구하는 프로그램 존재
가지가지
-> 일반적으로 한 컴퓨터에 여러 버전의 동일한 애플리케이션 설치가 되지 않는다
-> 이 경우 의존 관계를 가지고 있는 다른 두 애플리케이션 중에 하나는 제대로 된 실행 보장 X

거의 뭐 php 삼각관계
컨테이너로 해당 문제 해결!
컨테이너 기술은 애플리케이션을 컨테이너 내에 구성
즉, 컨테이너에서 실행 중인 애플리케이션은 어떠한 의존성도 공유하지 않고, 각자 고유의 의존성 포함

php의 양다리 현장
각 컨테이너가 철저하게 실행 환경이
격리되어 있기에 가능한 것
컨테이너 기술을 바탕으로 한 컴퓨터 안에 여러 대의 컨테이너 존재
-> 애플리케이션 실행 환경이 격리됨
하나의 컴퓨터 내에 서로 다른 버전의 프로그램이 설치될 수 있는 이유
: 컨테이너 하나하나가 애플리케이션 실행과 관련해서 높은 수준의 격리 제공
무엇을 격리하고, 어떤 자원들을 독립적으로 소유하는가
특정 컨테이너에서 작동하는 프로세스는 기본적으로
해당 컨테이너에서만 액세스 가능
컨테이너 안에서 실행되는 프로세스는다른 컨테이너의 프로세스에 영향을 줄 수 없음
기본적으로
컨테이너 하나에하나의 IP 주소할당
컨테이너 안에서 사용되는 파일 시스템은
분리
해당 컨테이너에서의 명령이나 파일 등의 액세스를 제한할 수 있음
여기까지 읽다 보면 그런 생각이 들 수 있다.
"가상 머신이랑...다를 게 뭐지....?"
가상머신: 하나의 호스트 컴퓨터 위에 여러 개의 독립적인 컴퓨터 작동할 수 있게 함
비슷한데...?
Docker와 VM의 차이점은 이후 포스팅에서!
개발 관점
배포판에 따라 다른 애플리케이션 설치 과정(ubuntu, centOS 등)
docker가 실행 중이라면 어떠한 OS이든 상관없이 같은 명령어로 즉시 설치 가능
이 말이 얼마나 멋진 말인지... 개발해봤다면 알 거야...
애플리케이션 구성 자체가 컨테이너화되면 YAML 파일 하나 + 명령어 하나로 모든 애플리케이션 실행 환경 구성 완료
도커를 사용하면...
OS에 상관없이 즉시애플리케이션 실행 환경을 만들 수 있음
개발을컨테이너 위에서 진행할 경우, 모든 개발팀이동일한 환경 하에 개발 진행가능
배포 관점
웹 서비스 배포: 어떤 애플리케이션이 특정 런타임 환경 위에서 실행되고, 사용자에게 이를 제공함
우선, 이 문제를 짚고 가자
개발과 배포의 다른 점이 뭘까?
배포: 인터넷 상에
공개적으로 노출
개발: 내 컴퓨터 상에서프라이빗하게 작동
배포를 위해 서버에 파일 하나하나 업로드?
-> 물자를 하나하나 배에 옮기는 이전의 방식

서버도 컨테이너에 담긴 애플리케이션을 실행하는 방식으로 서비스 제공하자!

따라서 Amazon Web Service의 EC2상에 도커를 설치하거나
도커 컨테이너를 EC2 서버에서 실행할 수 있게 하는 서비스인 ECS를 사용하여 애플리케이션 배포
AWS ECS 서비스는 애플리케이션을
도커 컨테이너채로 배포
google.com 에 수많은 사람들이 접속
-> 대용량 트래픽 발생
서비스 제공자들은 트래픽 분산을 위해 프록시 서버 운영
-> 프록시 서버는 여러 대의 동일한 검색 서버 중 한 군데를 이용할 수 있게 한다
(리버스 프록시의 한 종류인 로드 밸런서라고 부름)

동일한 서비스가여러 컴퓨터에서 작동
컨테이너 기술의 가장 큰 장점
실행 환경의 일치
더 많은 트래픽으로 인한 서버 증설에 컨테이너 기술은 아주 활발하게 이용된다
AWS는 서버를 만들고 삭제하는 일을 자동으로 해준다
-> 새로운 버전의 애플리케이션을 여러 서버 중 몇 대에만 운영하며 테스트 가능
-> 새 버전의 애플리케이션에서 발생할 수 있는 문제들을 미리 확인

쿠버네티스와 같이 오케스트레이션 도구등이 이러한 일을 해준다