Docker란?
- 컨테이너기반 오픈 소스 가상화 플랫폼.
- 일반적으로 알려진 Docker는 도커 엔진(Docker Engine)을 의미함.
- 도커 엔진(Docker Engine)은 컨테이너 생성 및 관리하는 주체이며 다양한 기능들을 제공함
도커에서 가장 중요한 개념은 컨테이너와 함께 이미지라는 개념입니다.
이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것으로 상태값을 가지지 않고 변하지 않습니다(Immutable). 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장됩니다. 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있습니다.
Docker를 사용하는 이유는 ?
컨테이너는 (간략히 말하자면) 애플리케이션을 환경에 구애 받지 않고 실행하는 기술입니다. 일례로 깃랩gitlab이라는 도구를 우분투에 설치하는 방법과 CentOS에 설치하는 방법이 다릅니다.
그러나 컨테이너 도구인 도커(Docker)가 설치되어 있다면 어느 환경이든 상관 없이 정해진 명령어를 사용하여 깃랩을 실행할 수 있습니다.
운영하면서 만들어지는 눈송이 서버들(Snowflake Servers)
서버 운영을 오래 해 본 사람이라도, 처음 들어가는 서버에서는 마음 먹은 대로 문제를 해결하기가 어렵습니다. 이는 서버를 다루는 기술과는 별개로, 각 서버마다 운영 기록이 다르기 때문입니다.
똑같은 일을 하는 두 서버가 있다 해도, A 서버는 한 달 전에 구성했고 B 서버는 이제 막 구성했다면, 운영체제부터 컴파일러, 설치된 패키지까지 완벽하게 같기는 쉽지 않습니다. 그리고 이러한 차이점들이 장애를 일으키고 말죠.
A 서버는 잘 되는데 B 서버는 왜 죽었지?와 같은 일(혹은 그 반대)이 벌어지는 겁니다. 이렇게 서로 모양이 다른 서버들이 존재하는 상황을 눈송이 서버Snowflakes Server이라고도 합니다. 모든 눈송이의 모양이 다르듯, 서버들도 서로 다른 모습이라는 말이죠.
시작은 아주 작은 차이라도 각각의 서버에 문제가 생겨서 해결해 나가다 보면 어느순간, 두 서버의 차이점은 상당히 커져있을 것입니다.
서버를 코드로 구성하고 관리하는 다양한 방법
이런 상황을 개선하고자 다양한 방식으로 서버 운영 기록을 저장해 두곤 합니다. 가장 흔하게는 서버에서 어떤 작업을 실행할 때마다 이를 사내 문서 도구에 기록해둔다거나, 여러 서버에 동시 접속해서 한꺼번에 명령을 실행하는 도구를 사용하기도 합니다.
그리고 우리가 이야기할 도커가 있죠. 도커에서 사용하는 도커파일(Dockerfile)도 앞서 이야기한 서버 운영 기록을 코드화한 것입니다.
# Nginx 서버를 구성하는 도커 파일
FROM debian:stretch-slim
RUN apt-get update \
&& apt-get install -y \
imagemagick
이 도커파일로 도커 이미지를 만들 수 있습니다. 도커파일이 서버 운영 기록이라면, 도커 이미지는 운영 기록을 실행할 시점이라고 할 수 있습니다.
도커 파일 = 서버 운영 기록 코드화
도커 이미지 = 도커 파일 + 실행 시점
도커 이미지로 서버를 실행하면 도커 컨테이너가 만들어집니다. 앞서 이야기했지만, 컨테이너를 언제 실행하든 이미지가 변하지 않았다면 컨테이너의 내용도 완전히 똑같습니다.
클래스와 인스턴스처럼 도커 이미지 바라보기
도커 이미지로는 언제든 똑같은 형태의 서버를 실행(=도커 컨테이너)할 수 있습니다. 그런데 코드나 도커파일을 전혀 수정하지 않은 채 내일 도커 이미지를 빌드하면 어떨까요? 서버가 똑같기를 기대하겠지만 실제로는 달라질 수도 있습니다. 왜냐하면 서버에 설치하는 패키지가 보안 문제를 겪어서 하루 사이에 패치되었거나 할 수 있기 때문입니다. 그러면 도커를 사용하는 장점이 퇴색되는 걸까요?
지금까지 서버를 똑같이 만드는 데 노력을 기울였지만, 사실 서버에는 바뀌어야 할 부분도 있습니다. 일례로 한 컴퓨터에서 A라는 도커 컨테이너를 두 개 배포했다면, 이 둘을 어떻게 구분할까요? 도커에서는 내부 규칙에 따라 해시 값(=컨테이너 id)과 임의의 이름(=컨테이너 이름)을 붙입니다. 물론 IP도 다르고요. 도커에서는 이렇게 바뀌어야 할 부분을 환경변수에 넣고 관리하도록 권합니다. 이러한 도커 이미지의 특징은, 소프트웨어 분야의 클래스와 public 변수, private 변수에 비견할 수 있습니다.
도커파일에 실행 시점을 더한 것이 도커 이미지라면, 도커 이미지에 실행 시점에 수정되어야 할 정보들을 더한 것이 도커 컨테이너입니다.
도커파일 = 서버운영기록 이미지 = 도커파일 + 실행 시점 컨테이너 = 이미지 + 환경변수 |
참조한 블로그
- https://www.44bits.io/ko/post/why-should-i-use-docker-containe
- 위의 블로그 필자가 만드신 유튜브 영상
- https://www.youtube.com/watch?v=3FcFL2C3ME8&list=PLIUCBpK1dpsNbqvMRDip7XluyIpnwB1Af
- https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html
- https://ho1234c.github.io/2017/01/31/2017-01-31-docker-nodejs/index.html
'Infra > Docker' 카테고리의 다른 글
[Docker] AWS EC2(Red Hat Linux)에 Docker설치 (0) | 2021.01.16 |
---|---|
[Docker] Docker Hub에 이미지 올리기 (0) | 2019.12.17 |
[Docker] Docker로 Spring Boot 배포하기 (0) | 2019.12.08 |
[Docker] Dockerfile 명령어 정리 (0) | 2019.12.02 |
[Docker] Docker로 Node.js 배포하기 (0) | 2019.12.01 |
댓글