[새싹] 현대IT&E 231227 기록 - Docker / Kubernetes

최정윤·2023년 12월 27일
0

새싹

목록 보기
44/67

1. 도커

1.1 도커란

  • 데이터 또는 프로그램을 격리
  • 컨테이너 관리
  • 도커 엔진
  • (도커 컨테이너) 이미지 ⇒ 컨테이너 ⇒ 이미지
  • 리눅스 기반, 컨테이너에서 실행되는 프로그램도 리눅스용 프로그램

1.2 서버와 도커

기능적 의미의 서버 vs. 물리적 의미의 서버

  • 컨테이너를 이용하면 여러 가지 서버 기능을 안전하게 함께 실행 가능 ← 격리

자유로이 옮길 수 있는 컨테이너

  • 개발 측면에서 이점: 개발 시의 환경을 운영 시스템으로 그대로 옮길 수 있음
  • 물리적 환경 차이 및 서버 구성의 차이를 무시 가능: 개발 서버와 운영 서버의 환경 차이로 인한 문제를 방지할 수 있음

도커 vs. 가상화 기술(Virtualization)

2. 도커 동작 원리

2.1 도커의 구조

  • 호스트 컴퓨터 + 호스트(서버) 운영체제 + 도커 엔진 + 컨테이너들
  • 프로그램 및 데이터는 컨테이너에 위치

컨테이너 안에는 리눅스 비슷한 무언가가 들어있다.

  • 실제 운영체제(OS)는 아님

전체 리눅스 운영체제가 아닌 커널을 제외한 주변 부분이 컨테이너에 위치

  • 커널은 호스트 운영체제(리눅스)를 사용
  • 컨테이너가 가볍다

WSL2

2.2 도커 허브와 이미지, 컨테이너

  • 이미지로부터 컨테이너를 생성
  • 하나의 이미지로부터 여러 개의 컨테이너 생성 가능 ⇒ 이 컨테이너들은 완전히 똑같다
  • 컨테이너로부터 이미지 생성 가능
  • 도커 엔진 간에 컨테이너 이동 가능
    cf.) CRI (Container Runtime Interface)

도커 허브

  • 공식 도커 레지스트리

2.3 도커 컨테이너의 생명주기와 데이터 저장

도커 컨테이너: 쓰고 버리는 일회용품

  • 오래된 컨테이너를 버리고 새로운 이미지로부터 새로운 컨테이너를 만들어 갈아타는 방식
  • 따라서 계속 유지해야하는 설정 파일, 데이터 파일 등은 별도의 컨테이너에 유지

컨테이너 생명주기(Container Life Cycle)

  • 컨테이너 생성 ⇒ 실행 ⇒ 종료 ⇒ 폐기 ⇒ 생성

데이터 저장

  • 데이터를 컨테이너에 저장하면 컨테이너 폐기 시 데이터도 함께 폐기되는 문제
  • 해결책: 데이터는 컨테이너 외부에 저장
    1. 호스트(물리적 서버)의 저장소(디스크)를 컨테이너에 마운트
    2. 데이터만 저장하는 컨테이너(도커 볼륨)를 운용 → 도커 볼륨을 컨테이너에 마운트
  • 위 해결책을 이용하면 컨테이너 간 데이터 공유 가능

2.4 도커의 장점과 단점

여러분들이 찾아서 정리해 보세요

도커의 주용도

  • 팀원 모두에게 동일한 개발환경 제공하기
  • 새로운 버전의 테스트
  • 동일한 서버가 여러 대 필요한 경우

3. 도커 환경설정

3.1 도커 설치

1. 윈도우 돋보기 클릭 ⇒ Windows 기능 켜기/끄기 검색

  • ‘리눅스용 Windows 하위 시스템 ‘ 체크
  • ‘가상 머신 플랫폼’ 체크
  • 확인 클릭

2. 재부팅

3. WSL2 설치

: https://learn.microsoft.com/ko-kr/windows/wsl/install
: https://learn.microsoft.com/ko-kr/windows/wsl/setup/environment

short-circuit evaluation, short-cut evaluation

: https://en.wikipedia.org/wiki/Short-circuit_evaluation

4. 컨테이너를 실행해 보자

4.1 도커 엔진 시작하기/종료하기

  • 도커 엔진은 컴퓨터를 켰을 때 자동으로 실행할 수 있지만 컨테이너는 그렇지 않다.

4.2 컨테이너의 기본적인 사용 방법

cf) parameters vs. arguments = 매개 변수 vs. 인자, 인수

4.3 컨테이너의 생성, 삭제, 실행, 정지

  • 컨테이너 생애주기
  • 동작 중인 컨테이너를 바로 삭제할 수 없다. (정지 후 삭제)
    cf.) 한 번만 실행되는 컨테이너 vs. 데몬 형태로 동작하는 컨테이너

4.4 컨테이너의 통신

  • 컨테이너에 접속
  • -p (publish) 옵션

4.5 컨테이너 생성에 익숙해지기

MySQL 컨테이너 생성

  • docker run –name mysqlserver -dit -e MYSQL_ROOT_PASSWORD=myrootpass mysql

4.6 이미지 삭제

5. 여러 개의 컨테이너를 연동해 실행해 보자

  • 여러 개의 컨테이너를 이용한 워드프레스 사이트 구축 예제
  • 여러 컨테이너가 연결되려면 가상 네트워크가 필요하고 이 가상 네트워크가 도커 네트워크이다.
  • docker network 생성
$ docker network create wpnet1
  • MySQL 컨테이너 생성
$ docker run --name mysqlwp -d --net=wpnet1 -e MYSQL_ROOT_PASSWORD=myrootpass -e MYSQL_DATABASE=wordpress2023 -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=wkunpass mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
  • WordPress 컨테이너 생성

ngnix 컨테이너 실행하기

brew install nginx
docker run --name apache -p 8081:80 httpd -d
docker pull nginx
docker images

http://localhost:8080/

5. 컨테이너 생성에 익숙해지기


도커 설치하기

https://happylie.tistory.com/78

WSL에서 Docker 설치하는 방법

https://www.lainyzine.com/ko/article/how-to-install-docker-on-wsl/

맥에서 우분투 실행하기

https://gymdev.tistory.com/75#google_vignette


01. 도커란 무엇인가?

1. 도커란 무엇인가?

도커

  • 도커는 '데이터 또는 프로그램을 격리시키는' 기능을 제공하는 소프트웨어
  • 주로 서버에 사용됨
  • 도커는 다양한 프로그램과 데이터를 각각 독립된 환경에 격리하는 기능 제공
  • 운영체제 통째로 격리하는 기능

컨테이너와 도커 엔진

  • 코스트코의 조립형 창고같은 곳에 데이터나 프로그램을 둔다고 생각
  • 이 조립형 창고를 컨테이너라고 하고, 이 컨테이너를 다루는 기능을 제공하는 소프트웨어가 도커
  • 도커 사용하기 위해서는 sw인 도커 엔진 설치해야함
  • 도커 엔진 위해서 컨테이너 생성 및 구동 가능한 것

컨테이너를 만들기 위해서는 이미지가 필요

  • 컨테이너의 빵틀과도 같은 역할을 할 이미지가 필요
  • 이미지는 소프트웨어 종류에 따라 다양하게 사용됨
  • 아파치 컨테이너 -> 아파치 이미지, MySQL -> MySQL 이미지
  • 컨테이너는 여러 개 만들 수 있음

도커는 리눅스 컴퓨터에서 사용됨

  • 리눅스에서 구동됨
  • 컨테이너에서 동작시킬 프로그램도 리눅스용 프로그램
  • 어떤 형태로든 리눅스 운영체제 개입되는 것

데이터나 프로그램을 독립된 환경에 격리해야 하는 이유

  • 대부분의 프로그램은 프로그램 단독으로 동작하지 않고, 어떤 실행 환경이나 라이브러리, 다른 프로그램을 이용해 동작함
  • 소프트웨어 역시 여러 개의 프로그램으로 구성됨
  • 또한 다른 프로그램과 특정한 폴더 또는 디렉터리 공유하거나 같은 경로에 설정 정보를 저장하는 경우도 있음
  • 이렇게 프로그램 하나 업데이트하면, 다른 프로그램에도 영향 미치게 됨
  • 프로그램간의 공유 때문에 오류 일으키는 경우가 많음

프로그램의 격리란?

  • 도커 컨테이너는 다른 컨테이너와 완전히 분리된 환경
  • 컨테이너 안에 들어있는 프로그램은 다른 프로그램과 격리된 상태
  • 도커 컨테이너를 사용해 프로그램을 격리하여 의존성에서 발생하는 문제 해결 가능

2. 서버와 도커

서버의 두 가지 의미

  • 서버는 이름 그대로 어떤 서비스를 제공하는 것
  • 기능적 의미의 서버
    • 무슨무슨 서버 = 무슨 무슨 기능을 제공한다는 뜻
    • 웹 서버 = 웹 기능 제공, 메일 서버 = 메일 기능 제공
  • 물리적 컴퓨터로서의 서버
    • 실물을 말함
    • 서버 역시 데스크탑과 마찬가지로 어딘가에 물리적으로 존재하는 컴퓨터
  • 서버는 여러 사람이 원격으로 접근해 사용한다는 점이 다를 뿐
  • 서버의 기능은 소프트웨어가 제공함
    • 이 말은 여러 가지 소프트웨어를 한 컴퓨터에 설치할 수도 있다는 말
  • 서버의 운영체제로는 주로 리눅스가 사용됨

컨테이너를 이용해 여러 가지 서버 기능을 완전하게 함께 실행하기

  • 컨테이너 기술을 이용하지 않고 물리 서버 한 대에 두 웹 서버를 함께 올리면 여러 문제가 생김
  • 컨테이너 활용하면 이러한 리스크를 감수하지 않고 두 웹 서버를 하나의 물리 서버에 함께 올릴 수 있음

자유로이 옮길 수 있는 컨테이너

  • 컨테이너는 어떤 도커 엔진에서 다른 도커 엔진으로 옮기기 가능
  • 이런 특성을 이용하면 똑같은 상태로 튜닝한 컨테이너를 팀원 전원에게 배포해 모두가 동일한 개발 환경 사용 가능
  • 물리적 환경의 차이, 서버 구성의 차이 무시 가능하므로 환경 차이로 인한 문제 방지 가능

02. 도커의 동작 원리

1. 도커의 동작 원리

도커의 구조

  • 일반적인 서버라면 운영체제 위에 프로그램이나 데이터가 직접 올라가지만
  • 도커를 사용하는 경우에는 운영체제 위에 도커 엔진이 동작하고 그 위에서 컨테이너가 동작함
  • 컨테이너 안에는?
    • 리눅스 운영체제 비슷한 무언가가 들어있다.
  • 운영체제가 하는 일은?
    • 소프트웨어나 프로그램의 명령을 하드웨어에 전달하는 역할을 함
    • 본래 운영체제는 '커널'+'그 외의 주변 부분'
    • 주변 부분이 프로그램의 연락 내용을 커널에 전달하고 커널이 하드웨어를 다룬다.
    • 도커에서는 '주변 부분'이 컨테이너 속 명령을 전달받을 수 없다.
    • 따라서 운영체제의 주변 부분이 들어있어 프로그램의 명령을 전달받고 커널에 전달하는 구조로 되어있음
    • 전체 리눅스 운영체제가 들어있는 것이 아니기 때문에 비슷한 것이라고 표현

도커는 기본적으로 '리눅스'용이다.

  • 리눅스 운영체제가 동작하는 것을 전제로 하기 때문에 리눅스에서만 동작
  • 따라서 컨테이너 안에 들어 있는 주변 부분도 리눅스의 주변 부분
  • 즉, 도커는 리눅스 컴퓨터에 독립된 격리 환경을 만드는 것이며, 리눅스에서만 동작하고, 컨테이너에서 동작할 프로그램도 리눅스용 프로그램
  • 도커를 사용하려면 어떤 형태로든 리눅스 운영체제를 갖춰야 함

2. 도커 허브와 이미지, 그리고 컨테이너

이미지와 컨테이너

  • 컨테이너 생성 위해서는 이미지가 필요
  • 이미지 = 컨테이너 찍어내는 '빵틀' = 컨테이너의 설계도
  • 우리는 이미지를 사용하는 것이 아니라 컨테이너를 사용함
  • 컨테이너로도 이미지를 만들 수 있음
  • 동일한 컨테이너 여러 개 만들지 않아도 다른 물리 서버에 설치된 도커 엔진으로 컨테이너 이동 가능
  • 도커 엔진만 설치되어 있으면 구동 가능하므로 다른 서버나 컴퓨터에 도커 엔진을 설치하고 새로운 도커 엔진에 이미지를 이용해 똑같은 컨테이너 생성 가능

도커 허브와 도커 이미지

  • 이미지는 '도커 허브'에서 구하게 됨
  • 공개된 컨테이너 이미지가 모여 있는 곳
  • 어떤 이미지?
    • 운영 체제만 들어있는 이미지부터, 여러 가지 소프트웨어가 함께 포함된 것까지 다양한 이미지 제공됨
    • 같은 소프트웨어도 다양한 변종의 이미지 제공됨
  • 안전한 이미지 선택해야함
    • 공식 이미지 사용하기
    • 커스텀 이미지 사용하기
  • 컨테이너는 다양한 형태로 조합 가능함
    • 이미지 선택 외에도 다양한 조합 고려해야 함
    • 도커 원칙 중 '한 컨테이너에 한 프로그램'
    • 보안 및 유지 관리 측면에서 유리함
    • 프로그램 여러개 한 컨테이너에 넣을 수도, 한 컨테이너에 하나의 프로그램 넣을 수도 있음.

3. 도커 컨테이너의 생애주기와 데이터 저장

도커 컨테이너는 '쓰고 버리는'일회용품

  • 컨테이너의 수명, 생애주기와 연관됨
    • 컨테이너는'쓰고 버리는'일회용품 같은 것
    • 새로운 버전이 나오면 업데이트 보다는 새로운 컨테이너로 갈아타는 것이 좋음
    • 여러 개의 컨테이너를 가동하는 것이 일반적인데, 하나하나 업데이트 하기보단 그냥 새로운 컨테이너 만드는 것이 낫다.
  • 컨테이너의 생애주기
    • 만들고
    • 실행하고
    • 종료하고
    • 폐기한 다음
    • 다시 컨테이너를 만드는 일련의 과정

데이터 저장

  • 컨테이너 폐기 시 안에 들어있던 데이터는?
    • 도커가 설치된 쿨리적 서버(호스트)의 디스크를 마운트해 이 디스크에 데이터를 저장함
  • 마운트
    • 디스크를 연결해 데이터를 기록할 수 있도록 한 상태
    • 우리가 USB 연결하듯 도커 컨테이너도 디스크 연결해 데이터 기록 가능
  • 데이터를 외부에 저장하면 다른 컨테이너와도 공유할 수 있기 때문에 편리함.

4. 도커의 장점과 단점

도커의 구조와 성질 및 그 장단점

  • 환경을 격리할 수 있다는 것이 핵심
    • 독립된 환경
    • 이미지를 만들 수 있다.
    • 컨테이너에 커널을 포함시킬 필요가 없기 때문에 가볍다.

도커의 장단점

  • 장점: 여러 개, 이동성, 생성, 보안
    • 한 대의 물리 서버에 여러 대의 서버를 띄울 수 있다.
    • 서버 관리가 용이하다
    • 서버 고수가 아니어도 다루기 쉽다.
  • 단점
    • 리눅스용 소프트웨어만 지원
    • 물리 서버 한 대에 여러 대의 서버 -> 호스트 서버에 문제 생기면 모든 컨테이너 영향
    • 컨테이너 여러 개 사용 시 장점을 느낄 수 있음

도커의 주 용도

  • 팀원 모두에게 동일한 개발환경 제공하기
  • 새로운 버전의 테스트
    • 격리된 환경 이용하기 위함
    • 새로운 버전을 먼저 개발환경에서 테스트한 후 운영환경에 적용할 때도 컨테이너 활용 가능
    • 물리 서버와의 상성 고려하지 않아도 되고 변경된 환경에 대한 테스트에도 용이함
  • 동일한 서버가 여러 대 필요한 경우
    • 컨테이너 밖과 독립된 성질을 이용
    • 동일한 서버가 여러 대 필요한 경우에도 컨테이너를 이용해 한 대의 물리 서버에 똑같은 서버 여러 개 만들 수 있음
profile
개발 기록장

0개의 댓글