<TIL> 89. Docker

YUJIN LEE·2023년 4월 7일
0

개발log

목록 보기
83/149

Docker

  • IT 소프트웨어 "Docker"는 Linux 컨테이너를 만들고 사용할 수 있도록 하는 컨테이너화 기술.
  • Docker를 사용 시 컨테이너를 매우 가벼운 모듈식 가상 머신처럼 다룰 수 있다.
    또한, 컨테이너를 구축, 배포, 복사하고 한 환경에서 다른 환경으로 이동하는 등 유연하게 사용할 수 있어, 애플리케이션을 클라우드에 최적화하도록 지원.
  • 컨테이너를 사용해 응용 프로그램을 더 쉽게 만들고, 배포하고 실행할 수 있게 설계된 도구.

  • 컨테이너 기반의 오픈소스 가상화 플랫폼

  • 일반 컨테이너 개념에서 물건을 손쉽게 운송해주는 것처럼
    -> 애플리케이션 환경에 구애받지 않고 손쉽게 배포 관리

  • 컨테이너 기반 배포 방식은 구글을 비롯해 대부분 서비스 회사가 컨테이너로 서비스 운영

  • AWS, Azure, Google Cloud 등 어디서든 실행 가능.

컨테이너 기반의 가상화 vs 하이퍼바이저 기반의 가상화(OS 가상화)

  • 컨테이너 기반의 가상화 -> 격리된 환경에서 프로세스를 실행
    애플리케이션은 도커 엔진을 통해 호스트 자원 사용, 구조적으로 Guest OS가 없어 용량 적음

Docker의 사용이유?

똑같은 일을 하는 2대의 서버가 있다 해도, 운영체제부터 컴파일러, 설치된 패키지까지 완벽하게 같기는 쉽지 않음. -> 문제 발생

도커는 서버마다 동일한 환경을 구성해줘, 이러한 문제 해결 가능.

=> 동일한 환경을 구성하기 때문에 auto scaling에 유리.

auto scaling?

서버를 자동으로 늘리고 줄이고 가능하게 해준다.

특정 서비스가 있고, 이 서비스가 트래픽이 몰리는 시간대가 있으면 그 시간대에 자동으로 서버를 늘려주고,
트래픽이 주는 시간대에서는 비용을 아끼기 위해 서버를 자동으로 줄여준다.

Docker와 기존 가상화 기술(VM) 차이

  • 한대의 서버에서 하나의 애플리케이션만 운영하는 전통적인 방식에서
    하이퍼 바이저 기반 가상화 등장

하이퍼 바이저?

호스트 시스템(윈도우, 리눅스 등)(물리서버)에서 다수의 게스트(가상서버) OS(가상머신)을 구동할 수 있게 하는 소프트웨어
각 VM마다 독립적으로 동작
VM은 살짝 무겁고 느림..

서버 가상화 기술로서 호스트 서버에 설치되고, 호스트와 게스트를 나누는 역할, 각각의 게스트는 하이퍼 바이저에 의해 관리, 시스템 제어 할당받음.

하이퍼 바이저 기반의 가상화는 격리된 환경에서 또하나의 가상 서버를 실행하는 기술.
Guest OS로는 다양한 게스트 OS 선택할 수 있다. 여기서 실행되는 애플리케이션이 호스트 자원을 사용하기 위해서는 게스트 OS를 거쳐야함.
그래서 속도적인 면에서 느릴 수 있다.

  • Docker는 하이퍼 바이저 구조를 토대로 등장, VM보다 훨씬 가볍게 동작해 성능에 유리

    논리적으로 어플리케이션끼리 구분이 되어있어, 하나의 어플리케이션에 장애가 발생해도 다른 어플리케이션에 전혀 영향을 끼치지 않음

Docker의 컨테이너와 이미지

이미지?

코드, 런타임, 시스템 도구, 시스템 라이브러리 및 설정과 같은 응용프로그램을 실행하는데 필요한 모든 것을 포함하는 패키지.

이미지는 Github과 유사한 서비스인 도커 허브을 통해 버전 관리

컨테이너?

도커 이미지를 독립된 공간에서 실행할 수 있게 해주는 기술

Dockerfile?

도커 이미지를 구성하기 위해 있어야할 패키지, 의존성, 소스코드 등을 하나의 file로 기록해 이미지화 시킬 명령 파일

즉, 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 더 이상 새로운 서버가 추가되면 의존성 파일을 컴파일하고 이것 저것 설치할 필요가 없다.

Dockerfile 주요 명령어

  • FROM - 새로운 이미지를 생성 시 기반으로 사용할 이미지 지정(이미지 이름: 태그)
  • ARG - 이미지 빌드 시점에서 사용할 변수 지정
  • COPY - 호스트에 있는 파일이나 디렉토리를 Docker 이미지의 파일 시스템으로 복사
  • ENV - 컨테이너에서 사용할 환경 변수 지정, TimeZone 환경 변수
  • ENTRYPOINT - 컨테이너가 실행되었을 때 항상 실행되어야 하는 커맨ㄴ드 지정

Docker Compose?

멀티 컨테이너 도커 애플리케이션을 정의하고 실행하는 도구

다중 컨테이너를 정의하고 실행하기 위한 도구
YAML 파일을 사용해 다중 컨테이너 구성

  • Application, Database, Redis, NginX 등 각 독립적인 컨테이너로 관리한다고 했을때 다중 컨테이너 라이프 사이클을 어떻게 관리해야 할까?
  • 여러개의 도커 컨테이너로 부터 이루어진 서비스를 구축 및 네트워크 연결, 실행 순서를 자동으로 관리
  • docker-compose.yml 파일을 작성해 1회 실행하는 것으로 설정된 모든 컨테이너 실행

Docker 명령어

$ docker ps // 도커 컨테이너가 실행되고 있는 리스트 확인
$ docker ps -a
$ docker exec -lt 컨테이너이름orid /bin/bash //컨테이너를 sh, bash 등 터미널환경으로 접근
$ docker stop 컨테이너이름orid
$ docker inspect 컨테이너이름orid

$ docker run --name pharmacy-recommendation-app -p 8080:8080 .
--name: 컨테이너 이름 지정
-p : 컨테이너는 기본적으로 외부와 격리되어 있어 호스트와 컨테이너 port 포워딩 처리

$ docker login // docker hub 로그인 인증
$ docker build -t (docker hub id)/(이미지 이름:태그) (Dockerfile의 경로)
-> docker hub id를 이용해 repository 찾기

$ docker images
$ docker push (docker hub id)/이미지 이름:태그

$ winpty docker exec -it myredis redis-cli -> 윈도우 환경에서 도커 접속 명령어

profile
인정받는 개발자가 되고싶습니다.

0개의 댓글