저는 최근 AWS의 ECS/Fargate 를 이용해 서버를 구축하고, 배포하는 과정에서 도커를 처음 접하게 되었습니다.

도커를 공부하고 직접 사용하면서 제가 이해했던 내용들을 공유하고자 합니다.


도커를 이해하기 위해 가상화라는 개념을 먼저 짚고 넘어가겠습니다.

vm-structure.png

출처 : https://www.docker.com/resources/what-container

가상화란 쉽게 말해서 하나의 컴퓨터 안에 논리적인 컴퓨터를 만드는 것입니다.

가상화의 주 목적은 하나의 서버 리소스를 여러 대의 서버가 각각 독립적인 운영체제 위에서 활용할 수 있다는 것 입니다.

따라서 리소스를 최대한 활용할 수 있고, 이것이 곧 클라우드 컴퓨팅의 기반이 됩니다.

하지만 각각의 VM 마다 OS가 돌아가기 때문에 느리고 오버헤드가 커진다는 단점이 있습니다.



컨테이너

docker-structure.png

출처 : https://www.docker.com/resources/what-container

가상 머신의 단점을 보완한 컨테이너라는 기술이 있습니다.

우리가 잘 알고 있는 화물 수송용 박스인 컨테이너와 비슷한 개념입니다.

여러 가지 물건을 담고 있는 컨테이너처럼 애플리케이션 실행에 필요한 모듈들을 하나의 컨테이너에 담을 수 있고, 다른 컨테이너와 격리시켜 독립적으로 동작할 수 있게 합니다.

컨테이너의 장점은 가상 머신과 비교해서 하나의 운영체제 위에 각각의 컨테이너가 독립적으로 돌아가기 때문에 오버헤드가 적고, 빠르게 동작합니다.

또한, 여러 컨테이너가 하나의 애플리케이션처럼 동작하는 마이크로 서비스에 적합합니다.



도커

docker-process.png

출처 : www.freecodecamp.org/news/docker-quick-start-video-tutorials-1dfc575522a0

도커란 컨테이너 기반의 가상화 플랫폼입니다.

애플리케이션이나 실행 / 개발 환경 등을 이미지 라는 상태로 만들고, 이 이미지를 실행시켜 컨테이너를 동작하게 해줍니다.

그래서 서로 다른 환경의 개발자들이 동일한 개발 환경에서 개발을 할 수 있게 하고, 로컬 서버나 개발 서버 등의 실제 작업 환경과 릴리즈 서버의 환경을 동일하게 맞춰서 버전 에러를 막을 수 있습니다.

또한 가볍고 빠른 컨테이너로 하나의 물리적 서버에서 여러 개의 애플리케이션을 사용할 수 있다는 장점이 있습니다.

이 외에도 도커의 장점은 정말 많지만 대표적으로 앞에 나열한 특징들이 있습니다.



이미지

도커 컨테이너는 이미지를 기반으로 동작합니다.

이미지는 실행시키고자 하는 애플리케이션이나 환경을 Dockerfile에 의해 정적인 상태로 만들어진 것입니다.

dockerfile.png

예를 들어, 저 같은 경우는 스프링 부트 서버를 이미지로 만들어서 컨테이너로 실행 시켰는데 제가 작성한 Dockerfile의 명령어를 한 줄 씩 해석해보겠습니다.

FROM 명령어는 베이스 이미지를 지정한다는 뜻입니다. 반드시 지정해야 하고, 어떠한 이미지도 지정될 수 있습니다. 여기서는 알파인 OS 위에 JDK 8 을 설치한 openjdk:8-jdk-alpine 이미지를 선택했습니다.

WORKDIR 명령어는 작업 경로를 지정합니다. 해당 디렉토리가 없으면 새로 생성합니다. 여기서는 /usr/apps 경로로 지정을 했고 이후의 명령어들은 이 작업 경로를 기준으로 동작합니다.

COPY 명령어는 디렉토리나 파일을 복사합니다. 여기서는 스프링 부트 jar 파일을 /usr/apps 디렉토리로 복사합니다.

CMD 명령어는 도커 컨테이너가 실행되었을 때 실행되는 명령어입니다. 여기서는 jar 파일을 실행시킵니다.

이 도커파일을 빌드해서 만들어진 이미지는 DockerHub라는 리포지토리에 저장하거나 다른 개발자들과 공유할 수 있습니다.


이 부분에 대해 더 자세한 내용은 Docker를 이용한 스프링 부트 띄우기를 참고해주세요.



마지막까지 읽어주셔서 감사합니다!