ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 도커 (1)설치, 개념
    docker 2022. 1. 24. 15:08

    ============

    Docker Desktop 설치

    https://myanjini.tistory.com/entry/Docker-Desktop-%EC%84%A4%EC%B9%98

     : Hyper-V

    https://lazymolt.tistory.com/71

     : Hyper-V 없는 경우 다음 URL을 참고해서 WSL 기반으로 설치 진행

     

    C:\Users\myanj> docker version ⇐ 설치 완료 후 동작 여부를 확인

     

    ============

    도커 허브 계정 생성

    https://hub.docker.com/

     

    ============

    https://t1.daumcdn.net/cfile/tistory/2612544854DC162226

     :  이재홍 도커개념 ppt

     

    ============

    ppt내용 쭉 정리

     

    도커란?

    클라우드쪽 실행환경 구성할 때 컨테이너라는애가 잘 맞아떨어진다 MSA랑도

    그럼이전엔 어쨌다는 말이냐?

     

    이~~~~전부터 개발하던 사람들은 도커를 쓰면 편하다는걸 아는데, 지금 배우는 사람들은 잘 몰라

    JPA도 마찬가지

    mybatis도 편하고 > JPA 도 편하다는데 없던 시절을 안 경험한 사람들은 모름

     

    개발환경 따로 있고, 테스트 환경 따로 있고 서비스 환경 따로 있었다

     

    컴퓨터가 싸져서 개인 노트북이 많이 보급돼서 거기다가 개인별로 환경을 따로 만들게됐어 그러다보니 버전이 다를수가있어 그래서 운영서버에 바로 하면 안될수가있어

    그래서 테스트환경에... A에서 만드는걸 B에 옮기면 B에 맞게 맞춰주는 작업이 필요

    이러니까 개별환경을 구성하는데 시간이 많이 걸림 

    이런게 많은 시간이 들었다 개발하는 시간보다 config시간이 더 걸렸다

     

    도커를 쓰면 모든 개발환경, 테스트환경, 서비스 환경이 하나로 통일되게 가져갈 수가 있다

     

    ============

    컨테이너를 다른사람들과 공유할 수 있다

     

    git을 github에 올리면 공유 가능

     

    도커도 마찬가지

    내 실행환경을 내 로컬레지스트리에서 만들고 운영하다가

    도커허브라는 레지스트리(외부원격레지스트리)에 올리면 공유할 수가 있어

    내가만든 환경을 어디서든지 이용할 수 있게된다

     

    github와 비슷한 docker hub

     

    ============

    면접관 : 컨테이너 기술?

    나 : 가상화보다 훨씬 가벼운 기술입니다

    면접관 : 가상화는 뭔데요?

    나 : 하드웨어(물리적인형태를갖고있는것, 본체 모니터 키보드 마우스 메인보드 CPU 메모리 하드디스크 네트워크카드)를 소프트웨어적으로 표현하는것

     

    소프트웨어로 표현한다는건 뭔데??

    파일로 관리한다는 것

    CPU를 파일로

    메모리를 파일로

     : 파일로 만들어져있는걸 조합해서 마치 하드웨어인것처럼 동작시키는 것

     

    파일로 관리하는것의 장점

     : 데탑사면 이동이어려움, 메모리 2기가 꽂으면 모자라면 추가해야해, 돈+사는일+설치 해야해

     : 그냥 가상머신 이미지를 USB에 담아서 이메일을통해서 FTP를 통해서 다른 장소로 쉽게 옮길 수가 있어 파일이니까

    새로운 메모리를 추가하려고 하는데 그냥 파일이라서 파일의 내용만 바꿔주면 돼

    범위가 있지만 물리적으로 바꾸는것보다 쉽게 변경 가능

     

    파일은 복사할 수도 있다 = 동일한 환경 머신을 쉽게 복사해서 생성할 수 있다

     

    똑같은 PC맞추려면 또 사야돼

     

    컴퓨터머신을 쉽게 복사, 이동, 변경 가능

    하드웨어를 소프트웨어적(파일로관리)으로 표현

     

    ============

    도커하기전에 가상환경을 한번 만들어봐야 도커가 얼마나 편한지 알수 있는데 시간이 없어서 안함

    가상화 : 1960년대부터 시도된 컴퓨터 안에 컴퓨터를 만들어내기 위한 시도

     

    컴퓨터 성능이 좋아지면서 발생한것. 처음엔 컴퓨터가 엄청 비싸서 거기안에서 많은 서버를 띄움

    하나의 서버에 각각의 개별 서비스가 충돌되지 않게 많이 띄우는 것이 기술이었다

     

    개별서비스들이 구분될 수 있도록 포트를 구분했었는데

    시간이 흐르면서 하드웨어가 싸짐

    기능별로 나눠서 한 컴퓨터에 한 프로그램을 깔아서 그 프로그램만 동작하도록 함

     

    그러다보니 아무리 싸다고 하지만 그 좋은 서버에 웹서버하나만 돌고있으니 아까워보여

    전체 용량의 10%만 써, 3천만원정도하는데 계속 놀리고 있는데 마음이 아파

     

    그래서 가상화라는게 생김

     

    옛날에 하나의 머신에 여러개의 서비스 : 운영체제 안에서 같은 레벨에서 동작해

    하나의 소프트웨어가 문제가 생기면 옆에있는 소프트웨어가 영향을 받음, 메일이 안되는데 웹서버가 안될수가있어

     

    가상화 : 서버 안에 별도의 하드웨어인것처럼 올림, 별도의 서버를올림(▽컴퓨터하나라고생각) 서로 다른놈이라고 생각

    별도의 격리된 공간이라 한 프로그램은 거기안에서만 영향이끼쳐

     

    그러다 IT기술이 보편화되면서 서버라는것이 지속적으로 뭔갈 제공해주는게 서버인데 필요한게 뭔가 많아짐

    *서버 : 소프트웨어

    네이버도 일하러가서 어디에 올릴까요 했더니 서버하나 열여줘서 보니까 다 가상서버였다

     

    ============

    가상화머신의 문제점 :

     

    부모 PC안에 버추얼머신같은 가상화소프트웨어가 도는데, 얘도 결국 프로그램, Host머신의 기능을 가져와서 씀

    얘네가 쓰는 자원은 Host머신의 영향을 받음

    호스트(부모PC)가 4기가 쓰면 자식도 4기가만 쓸 수 있어

    게스트(자식 = 버추얼머신)가 많이 쓰면 기능이 감소함

     

    가상화 : 하드웨어를 소프트웨어적으로 표현

    그렇게 컴퓨터를 통째로 만들다보니까 성능의 손실이 발생

     

    손실을 최소화하기 위해 가상화 소프트웨어가 담당하는게 아니라 CPU 자체에서 가상화를 지원하게

    가상화 지원여부를 보는게 소프트웨어적으론 한계가 있다는 것

     

    파일형태로 구현되있는걸 CPU가 가상화를 빠르게 처리

     

    ->그래도느려..

    하드웨어가 하던걸 소프트웨어가 하다보니 그래도 느려

     

    ============

    반 가상화가 나옴

    호스트가 갖고있는 기능을 일부 가져와서 쓸 수가 있게, 커널을 공유해

    서버(=PC)가 있으면

    그 하드웨어가 동작하기 위해 운영체제(하드웨어제어, 사용자의 명령을 하드웨어로 실행하는 역할)가 필요

    운영체제 위에 가상화를 지원하기 위한 하이퍼바이저

    그럼 빨간색 네모의 가상머신이 만들어짐

    가상화도 하드웨어기 때문에 운영체제가 필요

    근데 운영체제가 너무 커

    내가 돌리려고 하는 어플리케이션이 10메간데 운영체제가 600메가가들어!!

     

    내가 만든 프로그램을 독립된 공간에서 동작시키도록 하려고 가상화를 했는데 10M짜리를 돌리려고 600M짜리 운영체제를 깔아야돼

     

    이런 가상머신이 있으면 모든 가상머신에 운영체제가 필요해

    이미지 안에 OS가 포함되기 때문에 이미지 용량이 커짐

    이걸 줄일 수 없을까 라는 것

     

     + 네트워크로 가상화 이미지를 주고 받는건 꽤 부담스러움 600M가 너무 커서. 특히 클라우드는 네트워크를 통해서 리소스를 빌려쓰는데 그 빌려쓴데다가 600M를 왔다갔다하면 시간이 많이 걸림

     

    ============

    오픈소스 가상화 소프트웨어(버추얼박스, VM웨어)는 OS 가상화에만 주력

    OS가상화 : 하드웨어이것처럼 만들고 설치할 수 있는 운영체제의 종류들을 다양화 그런걸 지원

    이게 주력이었어

     

    파일을 작게 만들어서 쉽게 배포하는건 관심사가 아니었다

     

    근데 클라우드가 나오고 네트워크를 통해 주고받다보니 파일을 줄이는 기법들이 필요해졌다

     

    ============

    그래서 나온게 컨테이너 라는 기술

     

    리눅스 컨테이너라는게 나옴

    1.기존 가상화는 하드웨어 자원들을 많이 차지함(공통적으로 설치돼야하는 운영체제부분 등)

    2.사이즈가 크다보니 네트워크를 통해 전달하는게 어려워

     

    ============

    컨테이너

    컨테이너 안에 가상 공간을 만들지만

    실행 파일을 호스트에서 직접 실행

     

    호스트의 기능을 내가 빌려서 쓰고 반납하고 하는 기술

     

    호스트 하나에 여러개의 가상머신들이 올라가는데 유의해야할것은?

    충돌나면 안돼 격리돼야하고

    호스트의 기능을 가상머신들이 쓸 때 A가 쓴게 B로 가면안되고 동시에 접근하는게 발생하면 안됨

     

    격리돼야해 = 이게 리눅스 커널의 cgroups와 namespaces가 제공하는 기술

    프로세스를 격리시키는 기술들이 있었어

     

    ============

    가상화가 아닌 격리에 집중

     

    두개가 동작하는데 각각 개별공간을 갖고 있고

    호스트의 자원을 빌렸을 때 격리시키는데 집중

     

    그럼 일반적인 가상화기술에서의 문제점을 해결함

    그게 컨테이너 기술

     

    ============

    도커가 기존의 리눅스 컨테이너의 기술들을 쉽게 쓸 수 있도록 모아둔 것

    버전올라가면서 libcontainer를 개발해서 그걸 사용

    격리기술을 구현해놓은걸 쉽게 쓸 수 있도록 구현해놓은게 도커

     

    ============

    가상화 : 남는 하드웨어자원들을 쓰기위해 

    하나의 호스트머신에 가상화된 머신들을 여러개 올리고

     

    가만히봤더니 낭비가 되는게 있다 -> 운영체제

    머신이만들어지면 운영체제가 들어가야되니까

    얘가 호스트머신의 리소스를 차지함

     

    머신을 만드는게 아니고, 응용프로그램이 여러개있으면 얘네끼리 간섭만 안하면 되는거 아닌가

    그게 컨테이너기술

    맨 아래 서버는 하드웨어서버

    그 위에 그 하드웨어를 제어하기 위한 운영체제

    1)가상화기술은 운영체제 위에 가상화를 지원하는 소프트웨어, 그 소프트웨어 위에 OS ->게스트OS가 낭비

    2)응용프로그램과 그 프로그램을 동작시키기 위한 소프트웨어를 배타적으로 격리, 도커엔진이란 애를 통해 호스트 리소스와 프로그램을 연결 A, B호스트 OS와 연결

     

    또 하이퍼바이저가 하드웨어와 소프트웨어 에뮬레이션 해주는것이 시간이 좀 더 걸렸어 -> 그걸 CPU자체가 직접 지원하기 시작(그래도 생짜보다 느려) -> 2)는 그게빠져버리니 빠름

     

    생짜랑 도커랑 속도가 거의 차이가 없어

     

    JVM도 class라는 파일을 내 CPU에 맞도록 가상화 기술이래

     

    ============

    컨테이너기술을 구현하는 방법은 여러가지

    리눅스 커널에 있는 격리기술(groups namespaces)을 구현하는것

     

    ============

    또 도커는 이미지 생성과 배포에 특화, 경량화

    이미지 버전 관리도 제공(태그)  --이미지 버전관리 였지

    중앙저장소(도커허브)에 이미지를 올리고 받을 수 있다

    다양한 API를 제공하여 원하는 만큼 자동화 가능, 개발과 서버 운영에 매우 유용 => 쉽다!

     

    ============

    저 pdf보면서 하면 아는데, 이미지는 틀! 컨테이너는 이미지를 실행한 상태!

    이미지를 실행했을 때 실제 구현 돼 있는 인프라 구성이 컨테이너

     

    ============

    운영체제로 치면 이미지는 실행파일, 컨테이너는 프로세스

     

    *프로세스 : 프로그램의 실행된 상태

    프로그램 : 소스코드, 실행파일

     

    exe가 프로그램

    실행된 상태를 프로세스

     

    ============

    도커가 이미지가 바뀔 수 있는데

    도커는 이미지의 바뀐 부분을 어떻게 관리하나?

     

    우분투라는 이미지에 우분투 깔고, 소스파일 깔고 이런식으로 변경이 발생

    ->유니온 파일 시스템 형식

    파일의 변경 부분만 별도로 실행시점에 하나로 모음

    변경된 부분만

    그래서 항상 도커의 이미지는 층층이 쌓인 정육각형

     

    베이스 이미지에서 바뀐부분만 이미지로 만들고 실행

     

    ============

    도커는 전파에 특화

    이미지를 공유할 때 바뀐 부분만 주고 받음

    원본이있으면 바뀐부분만 반영하면 쟤가 만든게 나와

    그 repository는

    파일을 잘게 잘라서 초록색이 바뀐건데 저렇게 가져감

    이렇게 저장공간을 줄이고 빠르게 네트워크를 통해 전달

     

    ============

    여기까지 도커가 나오게 된 계기

     

    - 거의 모든 IT의 역사

    - 거의 모든 인터넷의 역사

    히스토리컬하게 어떤것이 왜 이런게 나오게됐는지 잘 돼 있다

     

    도커도 갑자기 튀어나온게 아님

     

    노트북에 리눅스를 쓰고 싶어

    ->윈도우를 밀고 리눅스를 깔든지

    ->윈도우하고 리눅스하고 같이 설치해서 부팅할 때 선택

     

    지금은 VM 리눅스 머신하나 올리면 됨

    WSL쓰면 리눅스가 떠버림

    =>가상화

     

    스마트폰에서 하는 게임을 윈도우에서 돌리는것도 가상화

     

    단점이

    - 에뮬레이터가 너무 느려

    - 공통적으로 깔려야된느게 많다

     

    =>호스트 머신걸 빌려쓰겠다 -> 실행파일과 데이터부분만 독립적으로보관되고 실행될 수 있게 보장하면 가상화 기술과 함께 별도의 어플리케이션을 실행하는게 가능 : 컨테이너 기술

     

    컨테이너기술을 구현하는게 여러가지가 있는데 도커가 쉽게 쓸 수 있도록 명령어들을 잘 다듬어서 세상에 내보내줌

    때마침 클라우드가 발달해서 네트워크를통해 내가 만든걸 쉽게 전달하는 방법이 필요했어. 600메가 하다가 10메가 빠르게 전송되니까 : AWS채택 Google채택 MS채택

     

    도커와 네트워크 : 

    도커허브라는 공유플랫폼도 만듦

    유니온파일시스템 채택, 변경된 부분만 관리할수 있게

    원본에서 변경된부분만 재조합하면 내가 수정한 파일이 전달이 된다

     

    ============

    AWS에서 서버를 샀어

    근데 용량이 남아

    독립된 방을 만들어서 임대해줘

    놀고있는걸 갖고 돈을 벌 수 있어

    공유오피스같은 개념

    노는땅갖고 돈벌어

     

    쓰는사람은 필요할때마다 잠깐잠깐 빌려써서 돈 아껴

    ▽전세계의 노는 자원을 효율적으로 활용하는거구나

     

    가상화 기술 발전 + 네트워크 인프라 발전

     : 가상화해서 하드웨어를 빌려쓸 수 있어졌어 = 클라우드 서비스

     

    ============

    도커 이전엔 어땠을까~ (1)

     

    도커컨테이너전엔

    물리서버를 직접 운영함

    (1)

    제일 최초는 : 우리 회사의 전산실이라는 곳 안에다가 큰 서버랙

    거기에붙어서 내가 소프트웨어를 까는게 초기 모델

     

    랙이있으면 랙을 관리하는 사람이 있어서 전기제대로공급, 온도유지도 함

    시간이 지나니까 처음에야 필요한데 안정이 돼다 보면 니 뭐하니? 가 됨. 괜히 눈치밥 먹음

    (2)

    이런걸 통합운영관리해주는 용역 -> 데이터센터

    각 회사의 서버들만 모아서 관리해줌

    전원공급, 습도온도일정유지 같은 시설 만들고 서버를 갖다놓으면 24시간 가동될 수 있도록 환경적 요인 제공

    (3)

    그러다 빌려줄 수도 있어, 호스팅 서비스

    (4)

    빌려주는것만 하는 클라우드 서비스

     

    *IDC : 데이터센터를 모아놓은것

     

    ============

    도커 이전엔 어땠을까~ (2)

     

    서버 구입하려면 예산받고 견적받고 입찰하고 주문넣고 엔지니어와서 설치하고... 길게는 반년

     

    가상화가 발전하면서 클라우드 환경으로 변화

     

    빠르게인프라를 구축할 수 있고 구축된 인프라를 사용한 만큼만 냄.

    초기비용이 적어 : 내가 사업이 성공할지 못할지 모르는데 3천만원짜리 서버를 사야되면?? 실패하면 쪽박

     

    CPU하나 추가하는것은 버튼하나면 돼

    디스크 용량도 elastic

     

    클릭 몇번 만으로 가상 서버를 형성

     

    자동으로 서버 추가하고 삭제하는것도 가능

    auto scaling

    cpu연산의 70%를 초과하면 이런 조건을 걸어서, 동일한 사양의 서버를 n개 더 확장해라 이런 설정을 걸 수 있다

    사용량이 없으면 줄일 수 있고

     

    모든게 가상화기 때문에 이런게 가능

     

    ============

    서버가 많아지면 일일이 세팅하기 힘든데, 

    파일기반으로 동작하기 때문에 설정을 자동으로 해줄 수가 있다

     

    ============

    Immutable Infrastructure

    예전엔 지속시키는게 기술, 서버세팅이 돼 있을 때, 여러개의 소프트웨어들이 같이 깔려있을 때 JDK버전을 안정적으로 업그레이드 한다든지 그런게 기술, 잘못업데이트하면 안돌아가니까

     

    가상화 컨테이너라는 개념이 나오면서 Immutable Infrastructure라는 패러다임이 나옴

    레고블럭처럼 생각하면 됨

    필요없으면 빼버리고 다른걸로 바꿔치기

     

    하드웨어라는 인프라가 고정돼 있었어서(컴퓨터가) 그걸 계속 업그레이드하는게 미덕

    인프라가 소프트웨어, 파일형태가 돼서 이게 문제거나 교체해야되면 빼버리고 다른 파일 갖다 넣음

    그래서 호스트 OS와 서비스 운영 환경을 분리

     

    Immutable Infrastructure : 

    하나의 컨테이너 이미지를 만들었으면 

    변경해야되면

    새 이미지를 쓴다 앞에것을 변경하는게 아니라 바꿔치기

    기존은 서버가 하드웨어, 하나, 웹서버를 1.0을 깔아서 쓰다가 1.1로 바꿔야되면 1.0을 지우고 1.1을 설치해서 테스트하고 서비스 전개

    1.2되면 똑같이 1.1지우고 1.2

    어 근데 1.2아니야 1.1로 롤백해야되면 1.2지우고 다시 1.1


    지금은 실행환경 자체를 이미지로 만들어놓고 필요하면 1.1환경으로 만들고, 필요없으면 없애고 1.2로

    1.1은 1.1로 영원히 남아있다 = 이뮤터블인프라스트럭쳐

    업그레이드가 아니고 새로 만든다

    빨간색 블럭을 파란색으로 만드려면 파란색으로 칠하는게 아니라 빨간색을 빼고 파란색을 끼워넣어

     

    한번 쓰고 버린다

    환경 구성하는 방법이 노하우, 어려웠는데 이럴땐 어떻게 설치 이걸 연동하려면 어떻게 해야하고 이런게 있었는데 지금은 그냥 구현해놓은걸 가져와서 실행, 필요없으면 지움

    테스트할 때 운영서버와 동일한거 주세요 하면

    3천만원짜리 서버 사야돼

    ->

    소프트웨어기때문에 내 PC에 똑같은 환경 만들 수 있어서

    내가 개발한게 운영으로 바로 갈 수 있어

    ->

    테스트도 간편해진다

     

    ============

    도커는 Immutable Infrastructure를 구현한 프로젝트

    '만들어서 쓰고 버리는 인프라환경'을 쉽게 만들 수 있도록 해주는

Designed by Tistory.