0. 서론
(서론을 읽는건 생략해도 된다.)
회사의 A사원과 B사원이 같이 협업하여 웹사이트 개발을 진행하는데, 서로의 호스트에 설치한 Angular의 버전이 달라서 한쪽에서 빌드가 되는데 한쪽에서 에러가 나는 상황이 발생하였다. 이에 따라 Docker에 대해 알아보고 구축한 후 개발을 재개하게 되었고, 위와 같이 각기 다른 호스트의 로컬 환경이 달라서 발생하는 이슈 문제는 없어지게 되었다.
1. Docker란?
Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼이다.
Docker는 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있다. Docker를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있으며 코드가 문제없이 실행될 것임을 확신할 수 있다.
Docker는 Go언어로 작성된 리눅스 컨테이너 기반으로하는 오픈소스 가상화 플랫폼으로, 가상화를 사용하는 이유는 서버의 안정성도 높이며 향상된 컴퓨터의 성능을 더욱 효율적으로 사용하기 위해서 사용한다. 모두가 아는 대표적인 가상화 플랫폼으로는 VM이 있다. VM은 누구나 아는 OS가상화이나, 이와 구별된 컨테이너는 무엇일까?
2. Container란? & Docker의 작동 방식
Docker는 코드를 실행하는 표준 방식을 제공한다. Docker는 컨테이너를 위한 운영 체제이다. 가상 머신이 서버 하드웨어를 가상화 하는 방식과 비슷하게(직접 관리해야 하는 필요성 제거) 컨테이너는 서버 운영 체제를 가상화 한다.
Docker는 각 서버에 설치되며 컨테이너를 구축, 시작 또는 중단하는 데 사용할 수 있는 간단한 명령을 제공한다.
아래 사진을 통해 Docker(CONTAINER)의 구조와 VM의 구조를 보자.
컨테이너는 가상화 기술 중 하나로 대표적으로 LXC(Linux Container)가 있다. 기존 OS를 가상화 시키던 것과 달리 컨테이너는 OS레벨의 가상화로 프로세스를 격리시켜 동작하는 방식으로 이루어진다.
기존에 우리에게 익숙한 VM같은 경우에는 Host OS 위에 가상화를 시키기 위한 Hypervisor엔진 그리고 그 위에 Guest OS를 올려서 사용한다. 이는 가상화된 하드웨어 위에 OS가 올라가는 형태로 거의 완벽하게 Host와 분리 된다고 봐도 무방하다.
반면에 컨테이너 기반 가상화는 Docker엔진 위에 Application 실행에 필요한 바이너리만 올라가게 된다. OS 가상화(VM)를 보면 Host OS와 완전히 분리되는 장점은 있지만 OS위에 OS를 올리기 때문에 무겁고 느릴 수 밖에 없다. 하지만 컨테이너 기반 가상화는 Host OS 그리고 Docker 엔진 위에서 바로 동작하며 Host의 커널을 공유한다. 커널을 공유하게 되면 I/O처리가 쉽게 되어 성능의 효율을 높일 수 있다.
컨테이너를 사용하는 것은 가상 머신을 생성하는 것이 아니라 Host OS가 사용하는 자원을 분리하여 여러 환경을 만들 수 있도록 하는 것이다.
이외에도 Docker를 쓰는 이유는 크게 성능 향상, 뛰어난 이식성, 쉽게 Scale Out할수 있는 유연성이 있으며, Docker를 사용하면 코드를 더 빨리 전달하고, 애플리케이션 운영을 표준화 하고, 코드를 원활하게 이동하고, 리소스 사용률을 높여 비용을 절감할 수 있다. Docker를 사용하면 어디서나 안정적으로 실행할 수 있는 단일 객체를 확보하게 된다.
3. Docker Image
도커에서 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일 된 실행 파일을 묶는 형태를 Docker Image라고 한다. 다시 말해, 특정 프로세스를 실행하기 위한(즉, 컨테이너 생성(실행)에 필요한) 모든 파일과 설정 값(환경)을 지닌 것으로, 더이상의 의존성 파일을 컴파일하거나 그외 다른것들을 설치할 필요가 없는 상태의 파일을 의미한다.
(예를 들어 Ubuntu이미지는 Ubuntu를 실행하기 위한 모든 파일을 가지고 있으며, Oracle이미지는 Oracle을 실행하는데 필요한 파일과 실행명령어, port정보 등을 모두 가지고 있다.)
Docker Image의 특징:
- 도커 이미지의 용량은 보통 수백MB ~ 수GB가 넘는다. 하지만 가상머신의 이미지에 비하면 굉장히 적은 용량이다.
- 이미지는 상태 값을 가지지 않고 변하지 않는다(Immutable).
- 하나의 이미지로 다수의 컨테이너를 생성할 수 있고, 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아 있다.
- 도커 이미지들은 Github과 유사한 서비스인 DockerHub를 통해 버전 관리 및 배포(push&pull)가 가능하다.
- 다양항 API가 제공되어 원하는 만큼 자동화가 가능하다.
- 도커는 Dockerfile이라는 파일로 이미지를 만든다. Dockerfile에는 소스와 함께 의존성 패키지 등 사용했던 설정 파일을 버전 관리하기 쉽도록 명시되어진다.(그래서 누구나 이미지 생성과정을 확인할 수 있고, 수정할 수도 있다)
#References
https://aws.amazon.com/ko/docker/
https://myjamong.tistory.com/297
https://khj93.tistory.com/entry/Docker-Docker-%EA%B0%9C%EB%85%90
'Server > Docker' 카테고리의 다른 글
[Docker] Ubuntu 18.04에 docker 설치하기 (0) | 2024.07.13 |
---|---|
(Docker) 알고 있어야 할 상위 10가지 Docker 명령 (0) | 2024.02.16 |
도커와 Containerization (0) | 2024.02.14 |
[Docker] NodeJS 웹 앱의 도커라이징 (0) | 2022.05.02 |
[Docker] Dockerfile에 대해 (0) | 2022.05.02 |