[Docker] 도커 개념 | 가상화 기술의 종류 및 비교 | 도커 아키텍쳐 | 도커 네트워크

쭈·2023년 8월 8일

Docker

목록 보기
2/2

2023년 원티드프리온보딩 8월 강의 및 생활코딩을 기반으로 학습한 내용입니다.

Docker 기본 개념

Docker가 뭔지 알기 위해 도커 공식 문서를 살펴보자.

Docker는 애플리케이션 개발, 배송 및 실행을 위한 개방형 플랫폼입니다. Docker를 사용하면 애플리케이션을 인프라에서 분리하여 소프트웨어를 신속하게 제공할 수 있습니다. Docker를 사용하면 애플리케이션을 관리하는 것과 동일한 방식으로 인프라를 관리할 수 있습니다.
Docker는 컨테이너라고 하는 느슨하게 격리된 환경에서 애플리케이션을 패키징하고 실행할 수 있는 기능을 제공합니다. (생략) 컨테이너는 가볍고 애플리케이션을 실행하는 데 필요한 모든 것을 포함하므로 호스트에 현재 설치된 항목에 의존할 필요가 없습니다.

즉, 도커는 컨테이너 라는 기술(단위)을 통해 호스트 OS에 종속하지 않고 어플리케이션을 실행시킬 수 있는 가상화 도구이다.

그렇다면 가상화와 컨테이너는 무엇일까?

가상화

커널을 통해 cpu에 어플리케이션에 대한 메모리를 할당하고 프로세스 관리한다.

예를 들어 유저가 한글과 워드를 사용할 때, 워드 프로세스와 한글 프로세스에 커널을 통해 자원과 메모리를 할당해준다.

❗️이때 현재 내 os는 리눅스인데 윈도우에만 돌아가는 프로그램이 있다면 ..?
가상화를 통해 가상의 공간에 존재하는 커널 위에서 동작시킨다.

즉, 가상화는 하나의 물리적인 컴퓨터자원(cpu, 메모리, 저장 장치 등)을 가상적으로 분할하여 여러 가상 컴퓨터 환경을 만들어 내는 기술이다.

가상화 방식에는 가상머신과 컨테이너 기술 등등이 있다.

가상머신

하이퍼바이저를 통해 Guest OS에게 자원을 할당

하이퍼바이저 : 가상머신을 생성하고 구동하는 소프트웨어

ex. vmware

os가 결국 중복으로 존재하기 때문에 무겁고 느리다는 단점이 있다.

컨테이너

Guest OS를 제거하고 Container engine을 통해 어플리케이션을 구동시킨다. 따라서 가상머신의 느리다는 단점을 보완한다.

ex. docker

컨테이너의 특징

  1. 리눅스 커널의 기능을 사용하여 만들어졌다.

도커와 같은 컨테이너 기술은 리눅스 os 기반의 기술이다.

그렇다면 도커는 리눅스에서만 사용 가능할까?
아니다. 윈도우나 맥에서는 컨테이너 엔진을 사용하기 위해 시스템이 갖추어져있기 때문에 가능하다.

  1. 프로세스 단위의 격리 환경

🤔 프로세스 단위의 격리 환경이 무엇을 의미하나요?

컨테이너의 격리는 각 컨테이너가 독립적인 환경에서 실행될 수 있도록 해주는 것을 의미한다. 각 컨테이너는 별도의 파일 시스템, 네트워크 스택, 프로세스 공간 등을 가지게 되며, 이는 각 컨테이너가 별도의 가상 환경에서 동작하는 것처럼 보이게 한다.

하지만, 이것이 꼭 컨테이너 간에 자원을 공유할 수 없다는 것을 의미하는 것은 아니다. 도커 컨테이너는 여러 가지 방식으로 데이터를 공유하거나 통신할 수 있다. 예를 들어, 볼륨이나 바인드 마운트를 사용하여 파일을 공유할 수 있고, 네트워크를 통해 서로 통신할 수도 있다. 또한, 도커는 여러 컨테이너를 하나의 "서비스"로 묶는 기능도 제공하므로, 이런 서비스 내의 컨테이너들은 자원을 공유하거나 서로 통신할 수 있다.

따라서 컨테이너의 "격리"는 각 컨테이너가 독립적인 환경에서 실행될 수 있도록 해주는 것이지, 꼭 모든 자원 공유를 막는 것은 아니다.

즉, 독립적인 자원 사용을 보장하지만 통신은 가능!

🤔 일반 프로그램을 실행하는 것과 뭐가 다른가요?

일반 프로그램은 호스트 OS 위에서 자원을 할당받는 것이고, 컨테이너 내부의 어플리케이션은 도커 컨테이너 엔진 위에 올라간 상태에서 OS로부터 자원을 할당 받는다.

도커 사용 예시

Host : OS가 깔려있는 주체
Container : 격리된 실행환경으로, web server 역할을 하는 컨테이너, 데이터베이스 역할을 하는 컨테이너 등 각각 생성할 수 있다.

컨테이너 내부에는 운영체제 전체가 깔려있는 것이 아닌, 프로그램을 실행시킬 수 있는 라이브러리와 실행파일만 존재한다. (lib, bin)

예를 들어, brew을 통해 mysql을 설치한 상태에서 스프링부트 프로젝트 내부에 dockerfile을 통해 dockerhub에서 mysql을 pull 받아오면 호스트의 mysql과 컨테이너 내부의 mysql은 독립적이다.

도커 아키텍쳐

  • Docker Host: 도커 엔진이 실행되는 호스트

  • Client: Docker는 server-client 아키텍쳐로, 클라이언트의 docker cli 명령어들을 통해 (run, build, pull .. )Docker Daemon을 실행시킨다.

  • Registry: 이미지 저장소

도커 데몬

도커 엔진의 핵심 구성 요소
도커 호스트에서 컨테이너를 관리하고 실행하는 역할 (cli 명령어를 받아와서 실행 등)

도커 클라이언트

cli, gui 등이 될 수도 있음

도커오브젝트

  • 도커 이미지

    도커 컨테이너를 만들기 위한 읽기 전용 템플릿
    도커 파일을 통해 만들 수 있음 (from ~,등을 통해 베이스 이미지에 layer 쌓아올리기)

캐시된 레이어 등..
즉, 도커파일이 최종레이어이다.

  • 도커 컨테이너

    한 도커 이미지의 실행 가능한 인스턴스
    어플리케이션을 실행하기 위한 모든 파일 정보에

도커 레지스트리

도커 이미지를 관리하고 저장하는 곳
대표적으로 도커 허브가 있다.

도커이미지와 도커컨테이너

이미지로 여려개의 컨테이너를 가질 수 있다.

명령어

  • 이미지 cli 명령어

    $ docker pull 이미지명 // 이미지 다운 받기
    $ docker images // pull 받아진 이미지 목록 확인
    $ docker rmi 이미지명 // 이미지 삭제하기

  • 컨테이너 cli 명령어

    $ docker run [옵션] 이미지명
    // 옵션 예제
    $ docker --name [컨테이너 명] 이미지명
    $ docker ps // 실행 중인 컨테이너 목록
    $ docker ps -a // 모든 컨테이너 목록
    $ docker stop
    docker start
    docker logs 컨테이너명 // 해당 컨테이너 로그 확인하기
    docker logs -f 컨테이너명 // 실시간 로그 확인하기
    docker rm 컨테이너명

컨테이너 lifecycle

run을 통해 한번 생성된 컨테이너는 stop을 해도 존재하므로
다시 run하지말고 start할 것 !

도커 네트워크

(host 위에 도커엔진을 통해 컨테이너가 띄워져 있는 상태)

(1) 외부의 요청의 경우 컨테이너 내부의 포트와 호스트 포트와 매핑
(2) 컨테이너 내부에 격리된 파일을 줄 수 도 있고 특정 옵션을 통해 호스트 내부의 특정 디렉토리를 보라고 할 수 있음

$ docker run -p 8888:80 -v /Users/jk/wanted/2308/docker-pro-2308/lecture/1st:/usr/local/apache2/htdocs httpd
 
httpd 이미지를 통해 컨테이너를 생성하고 실행해줘 
포트는 도커 컨테이너의 80포트에 대해서 호스트의 8888 포트와 연결해줘
(포스포워딩 개념으로, 브라우저에서 http://localhost:8888 요청을 보내면 도커 80포트로 연결)
로컬의 해당 디렉토리 파일시스템(/Users/jk~)을 컨테이너 내부의 htdocs 와 연결해줘

-p publish 호스트에다가 이 포트 번호를 퍼블리싱 해달라
-v 볼륨을 마운트시켜주기

🤔 볼륨과 마운트 이해가 잘 안가요.

컨테이너는 파일 디렉토리를 포함해서 프로세스를 격리시킨다. 그러면 외부에서 파일이나 폴더를 가지고 오고 싶을 때는 어떻게 해야할까?

폴더(파일들)을 컨테이너에 장착시킨다.

그 일을 볼륨과 마운트가 한다 !

즉, 도커 컨테이너에서 사용할 하드디스크(저장장치=볼륨) 연결하는 과정(마운트)


+) 명령어

$ docker exec // 컨테이너 내부에서 명령어 사용하기

profile
🌱

0개의 댓글