일단 크게 2가지 이유가 있다. 최근에 과제테스트를 하면서 Docker 파일을 만들고 Docker 파일만으로 프로젝트를 실행하라는 과제를 받았다. 과제를 무사히 수행했지만 부족한 부분이 있었고 어떻게 보면 이유가 가장 컸다. 최근에 만든 서비스인 JPBoard 서비스를 운영하면서 AWS로부터 영수증이 왔는데 금액이 60달러나 되었다.
여기서부터는 예상이 된다고 생각하는데 간단히 이야기하자면 돈으로 두들겨 맞고 정신 차린 것이다. 애초에 운영 Linux 서버를 Red Hat을 사용한 것이 문제점이라고 생각한다. 정확히는 Red Hat을 사용한 이유가 문제라고 할 수 있다. 내가 원하는 mariaDB버전이 없어서 Red Hat을 썼다. 만약 지금처럼 Docker를 사용하여 프로젝트를 운영했다면 비용이 최소한 지금보다는 적게 나왔을 것이다.
현재는 문제를 해결했으니 정리해보자는 차원에서 작성하게 되었다.
Docker는 간단히 이야기 하면 컨테이너를 실행하기 위한 소프트웨어이다. 자세히 이야기 하면 Docker는 GO언어 기반으로 만든 리눅스 컨테이너 기반으로 하는 오픈소스 가상화 플랫폼이다.
Docker를 설명하기 이전에 Hypervisor와 컨테이너를 설명하고 넘어갈 필요가 있다.
가상화
물리적인 하드웨어를 추상화하여 여러 개의 가상 컴퓨터처럼 활용하는 기술
가상머신
가상머신은 물리적 하드웨어 시스템에 구축되어 자체 CPU, 메모리, 네트워크 인터페이스 및 저장공간을 갖추고 가상 컴퓨터 시스템으로 작동하는 가상환경이다.
하이퍼바이저는 가상화 계층을 구현해 주는 소프트웨어로 위의 그림을 보면 하이퍼바이저 위에 Virtualzation으로 그려진 곳이 가상화 계층인데 원래는 가상화 구조에서 호스트 OS의 하드웨어 자원과 가상머신은 직접 연결을 해줄 수 없는데 여기서 하이퍼바이저가 가상머신에 자원 및 네트워크를 할당해 주어 일종의 가상머신 매니저 역할을 수행한다. 하이퍼바이저는 실제로 가상머신의 생성, 실행, 삭제 등 모든 환경을 관리하기에 (VMM : Virtual Machine Manager)으로 불리기도 한다.
컨테이너는 애플리케이션을 실행하는 데 필요한 모든 구성요소와 기능을 갖춘 소프트웨어 단위이다. 기존 OS를 가상화 시키는 것에서 OS레벨의 가상화로 프로세스를 격리시켜 동작한다. 가상머신과 비교했을 때 소프트웨어 단위이기에 용량이 적고 이식성이 뛰어나다. 대표적으로 MSA(Micro Service Architecture)기반 서비스에 많이 쓰인다.
가상머신 | 컨테이너 | |
---|---|---|
가상화 | 물리적 인프라를 가상화한다. | 현재 운영체제를 가상화 한다. |
캡슐화 | 운영체제, 그 위의 소프트웨어 계층, 그리고 어플리케이션이 포함된다. | 운영체제를 가상화 한다. |
조율 | 하이퍼바이저 기반 운영체제 또는 하드웨어를 조율한다. | 현재 운영체제와 리소스를 조율한다. |
크기 | GB 단위 | MB 단위 |
제어 | 가상머신 전체환경을 제어할 수 있다. | 컨테이너 입장에서 보면 외부환경을 제어할 수 있는 권한이 적다. |
유연성 | 마이그레이션이 어려울 수 있다. | 크기 자체가 적기에 유연성이 좋다. |
확장성 | 확장하는데 비용이 많이 들 수 있다. | 마이크로서비스를 통해 세분화된 확장이 가능하기에 확장성이 뛰어나다. |
Docker는 앞에서 컨테이너를 운영하기 위한 소프트웨어의 일종이라고 했다. 실제로 컨테이너를 만드는 것만 보면 Docker가 필요없긴 하다. 하지만 컨테이너를 효과적으로 다루고 싶으면 Docker가 필요하다.
위의 사이트는 Docker를 설치하는 방법을 알려주는 사이트이다. 하지만 이 게시글에서는 Docker를 설치하는 OS환경은 Amazon 2023 AMI 이다.
시스템의 모든 패키지를 최신 버전으로 업데이트
> sudo yum update -y
> sudo yum install docker -y
Docker를 설치하는 순간 자동으로 실행이 된다.
> sudo service docker start
> docker run [옵션] 이미지명[:태그명] [인수]
> docker create [이름]
컨테이너 시작은 기본적으로 백그라운드로 실행된다.
> docker start [옵션] [컨테이너 식별자]
옵션들
컨테이너 식별자
> docker stop [옵션] [컨테이너 식별자]
옵션들
docker contianer kill
컨테이너 식별자
> docker rm [옵션] [컨테이너 식별자]
옵션들
docker rm `docker ps -a --quiet`
docker system prune
컨테이너 식별자
> docker logs [옵션] [컨테이너 식별자]
> docker ps -a
> docker images
> docker rmi [이미지 식별자]
https://khj93.tistory.com/entry/Docker-Docker-%EA%B0%9C%EB%85%90
https://aws.amazon.com/ko/compare/the-difference-between-containers-and-virtual-machines/
https://www.redhat.com/ko/topics/containers/containers-vs-vms
https://velog.io/@milkskfk5677/AWS-EC2에-Docker-설치하기
https://imjeongwoo.tistory.com/111
(항상 감사합니다.)