VMware와 같은 가상머신은 컴퓨터 시스템에서 소프트웨어를 실행하는 데 사용되는 가상 환경입니다.
가상머신은 컴퓨터 1대로 여러 개의 가상 컴퓨터를 동시에 실행할 수 있도록 해줍니다.
이를 활용하면 하나의 시스템에서 여러 운영 체제 또는 응용 프로그램을 실행하고 서로 독립적인 환경을 구축할 수 있게 합니다. 가상머신은 시스템 관리, 데이터 센터 가상화, 백업 및 복원 등 다양한 운영 체제 관련 작업에 사용될 수 있습니다.
어플리케이션을 관리할때는 독립적으로 관리해야 다른 어플리케이션과의 자원충돌, 종속성충돌과 같은 문제를 방지할 수 있고, 개별적으로 업데이트나 롤백을 할 수 있어서 운영에 장점이 있습니다.
만약 새로운 어플리케이션을 개발할 때 백엔드 개발자가 100명이라면 100명 모두 같은 운영체제가 깔린 컴퓨터 100대에 같은버전의 java와 spring 등등 프로그램을 설치해야하는 까다로움이 있는데 가상머신을 활용하면 개발자들은 가상머신 이미지를 만들어서 필요한 운영 체제, 프로그램 및 설정을 사전에 구성하고, 이 이미지를 개발자들에게 배포하여 사용하게 할 수 있습니다. 이렇게 함으로써 개발자들은 자신의 개발 환경을 일일이 구성하거나 업데이트하는 번거로움 없이, 이미 구성된 가상머신을 활용하여 빠르게 개발에 참여할 수 있고 동일한 운영 체제, 라이브러리, 응용 프로그램 버전 등을 사용하여 작업하므로 호환성 문제도 최소화 됩니다.
가상머신은 개발자가 개발 중인 소프트웨어의 상태를 스냅샷으로 저장하고 필요한 경우 이전 상태로 롤백할 수 있는 기능을 제공합니다. 이는 실험적인 변경 또는 문제가 발생한 경우에 유용하며, 개발자는 신속하게 이전 상태로 돌아갈 수 있습니다.
다중 환경 테스트를 할 때도 가상머신을 사용하면 다른 운영 체제, 브라우저 또는 디바이스에서 실행하여 테스트할 수 있어서 Windows 컴퓨터에서 Mac, Linux 환경에서 실행되는 애플리케이션을 테스트할 수 있습니다.
가상머신은 운영체제에 대한 시스템리소스를 가지고 있기 때문에 CPU나 메모리와 같은 컴퓨터 자원을 많이 소모하고, 그로 인해 호스트 시스템의 리소스가 부족하거나 가상머신의 수가 많을 경우 가상머신의 성능이 저하될 수 있습니다.
도커는 컨테이너화된 어플리케이션을 관리하고 배포하기 위한 오픈 소스 플랫폼입니다. 도커는 어플리케이션을 실행하기 위한 표준화된 방법을 제공하여 개발자와 시스템 관리자가 애플리케이션을 쉽게 구축, 배포, 실행하고 확장할 수 있도록 합니다.
도커는 가상머신처럼 어플리케이션을 독립적으로 관리할 수 있지만 운영체제와 커널, 호스트는 공유하고 프로세스와 파일시스템만을 컨테이너화 하여 격리하기 때문에 완전한 격리는 아니지만 가볍고 효율적으로 적은 리소스로 어플리케이션을 실행하고 관리할 수 있습니다.
이미지(Image): 도커 이미지는 어플리케이션 실행에 필요한 모든 것을 포함하는 가볍고 독립적인 패키지입니다. 이미지는 응용 프로그램, 라이브러리, 종속성, 설정 등을 포함하며, 파일 시스템의 읽기 전용 스냅샷으로 생성됩니다. 이미지는 컨테이너를 실행하기 위한 기반으로 사용됩니다. 1개의 이미지로 여러개의 컨테이너를 만들 수 있어서 수평적 확장이 간편해집니다.
컨테이너(Container): 컨테이너는 이미지를 실행하는 런타임 인스턴스입니다. 이미지를 기반으로 컨테이너가 생성되면 해당 컨테이너는 격리된 환경에서 실행됩니다. 컨테이너는 호스트 시스템과는 독립적으로 실행되며, 파일 시스템, 네트워크, 프로세스 공간 등을 격리하여 안전하게 실행됩니다.
도커 레지스트리(Docker Registry): 도커 레지스트리는 도커 이미지를 저장하고 공유하는 중앙 저장소입니다. 가장 잘 알려진 도커 레지스트리는 도커 허브(Docker Hub)입니다.
최근 도커는 아마존 AWS와 협업하고 있어서 아마존ECR 레지스트리를 활용할 수도 있고, 도커에서 사용하는 것과 동일한 로컬워크플로우로 아마존 ECS나 Fargate에 배포할 수도 있습니다.
// 도커실행
docker run -d -p 80:80 docker/getting-started
// docker/whalesay의 최신 이미지 다운로드
docker image pull docker/whalesay:latest
// 이미지 리스트 출력
docker image ls
// 받아온 이미지를 실행. (이미지 → 컨테이너)
docker container run --name 컨테이너_이름 docker/whalesay:latest cowsay boo
docker container run --name first docker/whalesay:latest cowsay boo
// 모든 컨테이너 리스트 출력
docker container ps -a
// 컨테이너 삭제
docker container rm 컨테이너_이름
// docker image 의 용량 확인
docker image ls
// docker/whalesay 이미지 지우기
docker image rm docker/whalesay
//수족관
docker container run -it --rm danielkraic/asciiquarium:latest
//컨테이너 종료
ctrl+c
// <실습 : 전투기 브라우저 게임>
// 도커실행
docker run -d -p 80:80 docker/getting-started
// 컨테이너를 생성, 실행
docker run --name 컨테이너_이름 -d -p 3000:80 sebcontents/part1
// 소스코드 클론
git clone https://github.com/codestates-seb/SpaceInvaders
// 새로운 터미널 열고 소스파일 클론받은 경로에서 컨테이너에 복사
docker container cp ./ 컨테이너_이름:/usr/local/apache2/htdocs/
// localhost:3000:80 에서 확인