docker - 개념

이동근·2021년 6월 20일
1

백엔드

목록 보기
1/3

Docker

리눅스 컨테이너를 기반으로 하여 특정한 서비스를 패키징하고 배포하는데 유용한 오픈소스

왜 docker를 써야 하는가?

배포를 해본 사람은 FTP, Maven, Grade를 사용 - 패키징 및 배포 도구

배포 도구를 사용하는 이유

  • 특정한 소프트웨어를 개발한 이후에 배포하고자 할 때 해당 프로그램이 어디에선가 손쉽게 구동이 되도록하기 위해서
  • 예전에는 개발을 하면 개발 시간에 대한 단축이라면 최근에는 어떻게 배포를 해서 좋은 수익을 낼 수 있을까?

그래서 docker 가 좋은 것이다.
- 배포와 운영을 엄청 효과적으로 할 수 있게 해준다는 것이다.

실제로 웹서비스를 개발하고 배포를 할 때 에는 AWS와 같은 클라우드 서비스를 이용하지만 우리가 개발을 하던 로컬 컴퓨터와 배포하는 호스팅 서비스와는 차이점이 있다. 특정한 서버 환경에 우리가 만든 웹 서비스를 맞추어서 배포해야 하므로 갖가지 설정이 필요하다.

그래서 docker를 이용하면 이러한 과정을 보다 간략화 할 수 있고 쉽게 할 수 있다.

즉 쉽게 배포를 할 수 있다.

container

도커를 설치하면 컨테이너에 이미지를 담아서 구동시키는 방식으로 손쉽게 배포가 가능하다.

  • 이러한 컨테이너를 어떻게 만들고 활용할 지에 대해서는 미리 도커 소프트웨어가 정의를 해놓고 있어서 도커를 사용하는 우리들은 단순히 이미 배포된 소프트웨어 이미지를 도커를 통해 컨테이너에 올리면 된다.

container
기존 os를 가상화 시키던 것과 달리 OS레벵릐 가상화로 프로세스를 격리시켜 동작하는 방식

도커만 설치를 하면 나머지는 알아서 설정이 이루어 진다.

기본적인 도커 형태는 이렇다.
도커 파일을 만들고 빌드를 해주면, 알아서 도커 이미지가 그에 맞게 생서이 되고 그 이미지를 구동시키면 순식간에 도커 컨테이너 위에서 실해이 된다.
dockerfile - 어떠한 운영체제에서 어떠한 소프트웨어를 구동시키고 그 소프트웨어를 위패 몇번 포트를 열어 놓는다.

이런식으로 설정을 해놓는다.

  • FROM: 가장 기본적인 커맨드로 어떤 이미지를 기반으로 컨테이너를 만들 것인지 설정한다.

  • MAINTAINER : dockerfile을 만든 사람을 의미

  • ENV : 환경변수의 설정, 이미지 빌드에도 사용이 되고, 해당 컨테이너에서 돌아가는 애플리케이션에 접근 할 수 있습니다. KEY와 VALUE로 구성이되어 있다.

  • COPY : 호스트 컴퓨터에 있는 디렉토리파일을 Docker 이미지의 파일 시스템으로 복사하기 위해서 사용됩니다. 절대 경로와 상대 경로를 모두 지원하며, 상대 경로를 사용할 때는 이 전에 등장하는WORKDIR 명령문으로 작업 디렉토리를 어디로 전환을 해놨는지 고려해 놔야 합니다.

  • WORKDIR : cd 명령문 처럼 컨테이너 상에서 작업 디렉토리로 전환을 위해서 사용이 됩니다.
    (/usr/src/이동할 경로)

    /usr/src : 프로그램 소스가 저장이 되어 있는 디렉토리
    /usr : 시스템이 아닌 일반사용자들이 사용가능한 명령어 파일들이 존재하는 디렉토리
    즉 사용자의 로컬의 경로이다 그래서 로컬에 있는 Email_Subscribe를 찾게 된다.

  • RUN : 명령문에서 마치 쉘에서 커멘드를 실행하는 것 처럼 이미지 빌드 과정에서 필요한 커멘드를 실행하기 위해서 사용됩니다.

  • EXPOSE : 네트워크 상에서 컨테이너로 들어오는 트래픽을 리스닝하는 포트와 프로토콜을 지정하기 위해서 사용 됩니다. 프로토콜은 TCP와 UDP로 지정할 수 있는데, 지정해 주지 않으면 자동으로 TCP 기본값으로 사용됩니다.

심지어는 개발환경 대신에 docker 사용이 가능하다.

VM(Virtual Machine) vs Container(Container)

기본적으로 기존에 우리가 많이 사용하던 VM(가상머신)과 컨테이너는 큰 차이가 있다. 가상머신 Guest OS르 만들어 사용한다.

예를 들어 window에서 구동을 한다고 했을 때 Host OS(Host Operating System)이 Window가 되는 거고 그 위에 HyperVisor와 같은 기능을 사용합니다.

HyperVisor
호스트 플랫폼에서 다수의 운영체제를 동시에 실행하기 위한 논리적 플랫폼을 말합니다. 가상화머신, 가상머신이라고도 한다.

그리고 그 위에 우분투라던지 다른 운영체제를 윈도우 위에 올릴 수 있는 것이다.
host OS - Window
Guest OS - Ubuntu
이렇게 되는 방식을 VM 이라고 했다.

이렇게 사용하면 Guest와 host는 완전히 별개로 존재할 수 있기 때문에 서로 의존적이지 않는다.

대신

  • Guest OS의 기능이 host OS를 거쳐서 하기 때문에 속도가 느릴 수 있다.
  • Guest OS가 host OS와 다른 완전히 새로운 운영체재로서 존재해야되기 때문에 아무리 가벼운 OS를 설치하려고 해도 용량이 큽니다.

이러한 단점을 해결하기 위해 Container가 사용이 됩니다.

Container를 사용하기 전 Host OS위에 VM에는 없던 Docker Engine이 돌아가고 그 위에 container가 생성되고 사용 되게 된다.

왜 이렇게 해주는가?

이런식으로 해주면 별도의 Guest OS가 들어가지 않기 때문에 성능적으로 매우 개선이 됩니다.

  • 메모리 용량도 적게 차지합니다.

다만 기존에 사용하고 있는 운영체제와 도커의 컨테이너에 의존석이 존재합니다. 이로 인해 각종 보안 문제로 공격을 받은 적이 있다.

원래 초기의 도커의 모습에는 window에서 사용되는 도커의 container는 window이어야만 하지만
마이크로소프트가 도커를 너무 좋아해 도커와 윈도우 호환성이 매우 높아지고 잇어서 사실상 리눅스 컨테이너와 윈도우 컨테이너의 구분이 모호해 지고 있습니다.

도커는 Container라서 VM에 비해 이미지 파일의 크기가 작아 빠르게 이미지를 만들고 실행 할 수 있다는 특징이 있습니다.

ex) 리눅스 운영체제 배포판 중 알파인은 최소한의 기능만 들어가 있어서 5MB 가량 구성되어 있다. 만약 VM으로 사용하는 경우 아무리 운영체제를 가볍게 설치하려고 해도 최소한 기가 바이트 단위 이다.

docker는 Go언어로 개발이 되어지고 있다. 서버를 개발하는데 있어 속도만을 따진다면 C보다 Go가 더 빠르다. 그래서 Go언어로 사용되는 것 중 가장 유명한 오픈소스가 바로 Docker이다.

Docker 패러다임

도커는 변경 불가능한 인프라(Immutable InfraStructure)를 주요 패러다임으로 상정하고 있습니다.

서버를 구축한 이후에는 변경이나 업데이트를 할 수 없도록 하는 것이다. - 만약 변경이나 없데이트를 하고 싶으면 그냥 삭제해 버리면 된다.

도커로 돌아가는 소프트웨어 자체는 어떠한 데이터도 가지고 있으면 안되고, 임시 파일 정도만 가지고 있는 상태에서 돌아가야 합니다. 사용자 계정 정보와 같은 실질적인 데이터들은 외부 스토리지로 빼 놓아야 한다는 겁니다.

리눅스 컨테이너(LXC)

리눅스 상에서 여러 개의 격리된 리눅스 시스템을 동작시키기 위한 운영체제단의 가상화 기술을 의미한다. 대표적으로 Warden, Livert 가 있다.

  • 이렇게 보면 도커는 완전한 신기술이 아니라 LXC에 대한 기술에 대한 이해가 높은 분들은 도커와 같은 기술을 자체적으로 만들 수도 있다는 것입니다.

즉 Docker는 리눅스 컨테이너 기술을 기반으로 한 배포 도구이다.

profile
하루하루 1cm 자라는 개발자

0개의 댓글