본문 바로가기
코딩 공부/web & Java

[Docker] Docker

by 현장 2023. 11. 8.

Docker

도커(Docker)는 리눅스 컨테이너(Linux Container) 기술을 기반으로 하는 오픈 소스 서비스로 애플리케이션 실행 환경을 코드로 작성할 수 있습니다. 또한 OS를 공유, 격리화하여 관리할 수 있습니다.

 

리눅스 컨테이너(Linux Container)

리눅스 컨테이너(Linux Container)는 Linux 기반의 기술 중 하나로 필요한 라이브러리와 애플리케이션을 모아서 마치 별도의 서버처럼 구성한 것을 말합니다. 그리고 컨테이너를 이루는 네트워크 설정, 환경 변수 등의 시스템 자원은 각 컨테이너가 독립적으로 소유하고 있습니다.

 

1. 프로세스의 구획화

특정 컨테이너에서 작동하는 프로세스는 기본적으로 그 컨테이너 안에서만 액세스 할 수 있으며 컨테이너 안에서 실행되는 프로세스는 다른 컨테이너의 프로세스에게 영향을 줄 수 없습니다.

2. 네트워크의 구획화

기본으로 컨테이너 하나에 IP 주소가 할당되어 있지만 리눅스 컨테이너를 통해서 하나의 컴퓨터가 하나의 IP 주소를 갖는 것을 극복합니다.

3. 파일 시스템의 구획화

컨테이너 안에서 사용되는 파일 시스템은 구획화되어 있어서 해당 컨테이너에서의 명령이나 파일 등의 액세스를 제한할 수 있습니다.

 

컨테이너는 무엇을 공유하고, 격리하나요?
1. CPU 성능(하드웨어) : 공유
2. 메모리(하드웨어) : 공유
3. 리눅스 커널(호스트 OS) : 공유
4. 네트워크(IP, PORT) : 격리
5. 파일 : 격리
6. 프로세스 : 격리

 

리눅스 컨테이너 기술로 도커는 어떤 문제를 해결하는가

1. 환경 표준화 (생산성 증가)

대표적인 운영 체제(OS)는 Linux, Windows, MacOS로 구분할 수 있습니다. 그리고 엔지니어는 자신이 개발하는 애플리케이션이 어떤 환경에서 구동될지 생각하고 개발해야 하기 때문에 여러 애플리케이션을 구동하는 운영체제가 서로 다르다면 환경에 따라 조금씩 변경할 부분이 발생합니다.

 

같은 Linux 인 Ubuntu, CentOS, Debian도 서로 다른 환경이므로 여러 버전이 존재할 수도 있습니다. 예를 들어, 윈도우에서 개발한 애플리케이션에서의 경로는 백슬래시(\)를 폴더로 표현하고, Mac이나 Linux에서 경로는 슬래시(/)를 폴더로 표현하는 경우가 있습니다.

 

이와 같이 환경이 다르다면 개발자들이 조정할 문제가 수도 없이 생기며, 수작업으로 환경을 맞추는 일은 쉬운 일이 아니게 됩니다. 그래서 다양한 환경에서 애플리케이션이 돌아가도록 빌드하고 테스트를 수행하기 위해서는 그만큼의 비용이 발생하는데 도커가 그 환경을 개발자가 테스트할 수 있도록 도와주기 때문에 생산성이 증가합니다.

2. 환경 구성 코딩 (생산성 증가)

개발된 애플리케이션을 내 컴퓨터에 설치해 사용하고자 할 때, ‘내 컴퓨터’ 혹은 ‘내 사용 목적’에만 맞는 설정이 따로 필요할 수 있습니다. 예를 들어 환경 변수처럼, 같은 OS라도 사용자에 따라 달라지는 구성이 있으며 echo $HOME 코드를 로컬 CLI(터미널)의 프롬프트에 입력해 보면 컴퓨터마다 다릅니다.
이와 같이 홈 디렉토리가 다르듯 애플리케이션을 설치할 때, 방화벽 설정, 사용자 권한 설정등과 같이  컴퓨터의 환경에 맞게 변경해야 하는 부분이 있습니다.

그리고 컴퓨터에 다양한 설정 작업을 수작업으로 하게 된다면, 많은 시간이 걸릴 뿐만 아니라 설정 간에 간섭이 일어나 프로그램이 멈출 수도 있습니다. 이런 상황이 발생했을 때, 아주 간단한 고전적인 해결 방법으로 OS를 포맷하고, 다시 설치하는 방법이 있지만 개발과 실행에 대한 환경 설정이 코드로 정해져 있다면, 이런 고민으로부터 벗어날 수 있습니다.

3. 리소스 격리성을 통한 응용 프로그램과 실행 환경 분리

리소스 격리성이란 실제로는 하나의 컴퓨터를 사용하지만, 여러 개의 컴퓨터를 이용하는 것처럼 IP와 PORT 등을 다르게 설정하는 방법을 말합니다. 이 리소스 격리성을 제공해 주는 기술로 가상머신 (Virtual Machine) , 도커(Docker) 등이 있습니다.

컨테이너 기술
애플리케이션이 격리할 수 있게 만드는 기술입니다.
격리
응용 프로그램과 실행 환경을 각각 분리하는 것을 말합니다.

예시
1) A, B, C 개의 응용 프로그램이 node.js 런타임 필요하면 여기서 node.js를 한 번만 설치하면 됩니다.
2) A는 node.js 14버전, B는 node.js 16버전과 같이 버전이 다를 경우  문제가 발생할 수 있는데 이 경우는 각각의 응용 프로그램과 응용 프로그램의 환경을 격리시키면 됩니다.

 

도커와 가상 머신의 공통점과 차이점

※ 엄밀히 말해서 컨테이너 기술과 가상 머신의 비교입니다.

 

1. 공통점

가상 머신과 도커는 리소스 격리성을 제공하는 기술입니다.

2. 차이점

 

가상 머신은 OS 단위 가상화, 도커는 애플리케이션 단위 가상화를 합니다.

 

가상 머신

가상 머신은 OS 단위 가상화를 하며 애플리케이션에 대한 환경 격리성을 중심으로 제공합니다.
개발 환경이나 사용 환경을 이미지로 저장하고, 호스트 OS 위에 게스트 OS를 올리는 방식이며 컴퓨터의 하드웨어 자체를 가상화시키기 때문에 컨테이너보다 가상 머신이 훨씬 무겁습니다.

 

도커

도커의 기반 기술은 리눅스 컨테이너 기술로 도커는 애플리케이션 단위 가상화를 합니다.
각각의 애플리케이션의 격리성을 제공하며 필요한 부분만 격리가 되어있고 나머지는 공유하기 때문에 가상 머신 보다 훨씬 가볍다. (호스트 OS와 이미지 레이어 공유합니다.) 하지만 가상 머신만큼 견고한 격리성을 제공하지는 않는다.
리눅스의 컨테이너를 이용한 기술로, OS 위에 다른 OS를 실행하는 것이 아니므로 가상 머신보다 좋은 성능을 낼 수 있습니다.  또한 컨테이너의 관점에서 개발자와 사용자 커뮤니티를 중심으로 혜택을 제공하는 데 있고 게스트 OS 위에 도커 위에 컨테이너 올라가는 모양입니다.

 

도커 컨테이너 라이프사이클(Docker Container Lifecycle)

도커 실행하는 예시코드

docker run --detach 
--env MYSQL_ROOT_PASSWORD=dummypassword // db의 root password를 설정
--env MYSQL_USER=test-user // 유저 생성
--env MYSQL_PASSWORD=testuserpassword // test-user의 password
--env MYSQL_DATABASE=testdb // db 생성
--name mysql // container의 이름 설정
--publish 3306:3306 // 3306포트에 게시(MySQL의 기본 포트 3306)
mysql:8-oracle // 이미지

 

Reference

하나몬

'코딩 공부 > web & Java' 카테고리의 다른 글

[Spring] 국제화  (0) 2023.11.12
OpenAPI와 Swagger  (1) 2023.11.09
[Spring] RequestParam과 PathVariable  (0) 2023.11.07
[Spring] ResponseEntity  (0) 2023.11.07
[Spring] 전역 예외 처리  (0) 2023.11.04