도커란?(Docker)

Blackeichi·2023년 1월 5일
0

📌 도커를 사용하는 이유는 ?

도커는 environment disparity를 해결해준다!

📌 environment disparity 란?

예를 들어 내가 금요일 저녁에 개발을 하고 있고 그걸 서버에 올리기만 하면 되는 상황에서, 나의 컴퓨터는 윈도우고 서버는 리눅스여서 코드를 서버에 올리니까 작동을 제대로 안하는 상황이 발생해 버렸을 때 이것을 environment disparity라고 한다.

📌 도커

도커는 컨테이너 기반의 오픈소스 가상화 플랫폼이며 도커를 통해 다른 머신에서도 같은 환경을 구현할 수 있다. docker를 컴퓨터(윈도우)와 서버(리눅스)에 둘 다 설치하고 도커파일을 생성, 그리고 이 파일에 구현하고 싶은 환경을 설정하면 된다.

이 파일을 서버와 컴퓨터 둘 다에게 주면 docker는 해당 파일에서 설정한 환경과 같은 버츄얼 컨테이너를 서버와 컴퓨터에 만든다.
그래서 컴퓨터에서 서버로 코드를 업로드할 때 잘작동하게 하는 것이다.

Docker 컨테이너들은 각기 분리되어 있다고 생각하고 다른 많은 수의 컨테이너를 가질 수 있다. (파이썬, Java, Django 등등..) 즉 Docker 덕분에 매번 새로운 서비스를 만들때마다 새로운 서버를 사고 설정할 필요가 없이 그냥 내가 원할때마다 docker를 통해 새로운 환경을 설정할 수 있다. (컨테이너를 생성/복제)

📌 정리!

  1. 원하는 개발 환경을 도커파일에 저장하면 docker는 이를 너가 원하는 어떤 머신에든 해당 환경을 시뮬레이션 해준다.
  2. 이러한 환경들은 각기 독립적으로 존재하기 때문에 원하는 무슨 환경이든 모듈식으로 관리 가능하다. 그래서 파이썬 서버, 자바 서버, 데이터베이스 서버 이렇게 추가해서 살 필요가 없다!

도커의 정의

도커란 어플리케이션을 패키징할 수 있는 툴이다.
컨테이너라고 하는 하나의 작은 소프트웨어안에 어플리케이션과 그것에 필요한 시스템 tools, 환경, dependencies를 하나로 묶어서 다른 서버 다른 pc 그 어떤 곳에도 쉽게 배포하고 안정적으로 구동할 수 있게 도와주는 툴이다.

기술이 발전함에 따라서 우리의 어플리케이션을 동작하는데 많은 것이 필요해졌다.

node.js를 예를 들어보면, 우리의 소스파일만 서버에 배포하는 것으로 앱을 구현하는데는 문제가 있다.

node.js와 npm, 외부라이브러리를 이용한다면 여러 dependencies와 환경설정, 환경변수 등을 모두 설정해주어야 한다.

그런데 이러한 설정과 파일들을 모든 개발자의 컴퓨터마다 세팅하는 것은 번거롭고 시간도 많이 낭비하게 된다.

또한 나의 컴퓨터에서는 잘 작동하던 코드도 서버에서 환경이 달라서(ex. Node.js의 버전이 다름) 서버에서는 에러를 일으킬 수도 있다.

이러한 문제점을 해결하고자 Docker가 개발되었다.

도커 컨테이너 안에는 어플리케이션 뿐만 아니라 앱을 정상적으로 작동시키기 위한 node.js, 환경설정, npm, dependencies, assets 등이 포함될 수 있다.

즉 우리 어플리케이션의 구동에 필요한 모든 것들이 도커 컨테이너안에 들어간다고 보면 되는 것이다.

이러한 도커의 특성 덕분에 우리는 어떤 컴퓨터에서도 언제든지 동일하게 구동할 수가 있다.

Docker vs Virtual Machine

Virtual Machine은 가상장비위에 가상프로그램이 설치하고 VM을 가동시켜야 하는데, 각각의 VM은 고립된 환경속에서 본인만의 OS 또한 가지고 있기 때문에 너무 무겁기에 컴퓨터 성능을 저하시킨다는 단점을 가지고 있다.

이러한 VM에서 경량화되어 만들어진 것이 Container 개념이다.
컨테이너는 하드웨어에 설치된 운영체제, 즉 HOST OS에서 컨테이너 엔진이라는 소프트웨어를 설치만 하면 개별적인 컨테이너를 만들어서 각각의 어플리케이션을 고립된 환경에서 실행할 수 있게 해준다.


(왼쪽이 VM, 오른쪽이 Container)

이렇듯 VM과 Container의 가장 큰 차이점은 운영체제를 포함하느냐 포함하지 않느냐(HOST OS 공유)이다.

그리고 위에서 얘기한 Container Engine 중에서 가장 인기가 많은 것이 도커이다.

도커의 3대 구성요소(순서)

도커를 간단하게 표현하자면 컨테이너를 만들고 배포하고 구동한다이다.
컨테이너를 만들기 위해서는 3가지가 필요하다.

  1. Dockerfile
    컨테이너를 어떻게 만들어야하는지 설명되어 있는 설명서와 같다.
    • Copy files
    • Install Dependencies
    • Set environment variables
    • Run setup scripts
  2. Image
    작성된 Dockerfile를 이용해서 Image를 만드는데, Image안에는 어플리케이션을 실행하는데 필요한 코드, 런타임환경, 시스템 툴, 시스템 라이브러리와 같은 모든 세팅들이 들어가 있다.
    쉽게 설명하자면 실행되고 있는 우리 어플리케이션의 상태를 그대로 이미지로 만든다고 생각할 수 있다.
    이렇게 만들어진 이미지는 변경이 불가능한 불변의 상태이다.
  3. Contaier
    마지막 단계인 Container에서는 박스처럼 우리의 어플리케이션의 이미지를 고립된 환경에서 개별적으로 실행할 수 있게 해준다.
    컨테이너는 이미지를 그대로 동작할 수 있게 해주며 동일한 이미지를 가진 컨테이너가 여럿 생성될 수 있다. 이미지는 불변이지만 각 컨테이너에서는 각각 동작하는 어플리케이션을 수정할 수 있다. 물론 컨테이너에서 변경된 파일은 이미지에 영향을 줄 수 없다.

도커 이미지 배포하는 과정

Local에서 Image를 만들어서 Container Registry(git같은 역활)에 이미지를 push하고 다른 pc에서 이미지를 pull하여 실행하면 된다.(실행을 위해선 docker와 같은 엔진필요)

Docker compose란, 여러 개의 컨테이너로부터 이루어진 서비스를 구축, 실행하는 순서를 자동으로 하여, 관리를 간단히하는 기능이다.
Docker compose에서는 compose 파일을 준비하여 커맨드를 1회 실행하는 것으로, 그 파일로부터
설정을 읽어들여 모든 컨테이너 서비스를 실행시키는 것이 가능하다.

Docker compose를 사용하기 위해서는, 크게 나눠 아래의 세 가지 순서로 이루어진다.
1 ) 각각의 컨테이너의 Dockerfile를 작성한다(기존에 있는 이미지를 사용하는 경우는 불필요).
2 ) docker-compose.yml를 작성하고, 각각 독립된 컨테이너의 실행 정의를 실시한다(경우에 따라는 구축 정의도 포함).
3 ) "docker-compose up" 커맨드를 실행하여 docker-compose.yml으로 정의한 컨테이너를 개시한다.

docker-compose.yml 파일이란
docker-compose.yml 파일은 아래와 같이 yaml으로 Docker 컨테이너에 관한 실행 옵션(build 옵션도 포함되어 있는 경우도 있다)를 기재한 파일이 된다.
이 파일에 기재되어 있는 내용은 기본적으로 docker build, docker run 커맨드 지정하는 것이 가능한 옵션이 되지만, Docker compose의 yaml 파일로써 기술하는 것으로 여러 개의 컨테이너로부터 만들어진 서비스를 조감하여 보는 것도 가능해져, 보존성의 수고를 가볍게 한다.

web:
  build: .
  ports:
   - "5000:5000"
  volumes:
   - .:/code
  links:
   - redis
redis:
  image: redis

#REFERENCE

Docker 가 왜 좋은지 5분안에 설명해줌
도커 한방에 정리 🐳 (모든 개발자들이 배워보고 싶어 하는 툴!) + 실습

profile
프론트엔드 주니어 개발자 한정우입니다. 😁

0개의 댓글