ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Docker 공부(1)
    BackEnd/Infra 2023. 8. 7. 19:21

    Docker? 

    • 컨테이너 기반 가상화 도구, 어플리케이션을 컨테이너 단위로 격리하여 실행하고 배포하는 기술
    • 어플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼
      • Container ? : Image 실행 가능한 인스턴스 
        • 리눅스 커널 기능을 사용하여 만들어졌다.  
        • 라이브러리, 시스템 도구, 코드 등 소프트웨어 실행에 필요한 모든것을 포함
        • 기존의 가상화 방식과 달리, 리눅스 커널을 공유하며 프로세스 단위 격리 방식으로 동작
          • 호스트 OS 위에서 여러 격리된 환경을 생성, 각 컨테이너 안에서 어플리케이션 실행 
          • 컨테이너끼리 자원을 공유하거나 통신하는 것도 가능 
        • 여러 컨테이너를 실행하면 독립적으로 실행, 실행중인 컨테이너에 접속하여 명령어 입력 가능
        • 호스트의 특정 포트와 연결하거나 호스트 특정 디렉토리를 내부 디렉토리처럼 사용 가능
        • 컨테이너 생성이 쉽고 빠름. 
      • Docke Image? : Docker Container 만들기 위한 읽기전용 템플릿
        • 컨테이너 실행에 필요한 파일과 설정을 포함하고 있음
        • 상태값을 가지지 않고 변하지 않음
        • 컨테이너는 이미지를 실행한 상태, 추가되거나 변하는 값은 컨테이너에 저장
        • 같은 이미지에서 여러 개의 컨테이너를 만들 수 있음 
        • 컨테이너 상태가 바뀌거나 삭제되어도 이미지는 변하지 않고 그대로 남아있다. 
        • Docker hub에 등록하거나 Docker Registry 저장소를 만들어 관리 가능
          • 이미지들은 Docker Hub 통해 버전 관리 및 배포가 가능하다. 
      • Docker File? 
        • 도커 이미지 만드는 과정
          • Dockerfile에 DSL언어를 이용해 이미지를 생성
          • 단순 텍스트 파일, 일반적으로 소스와 함께 관리
    • 도커는 컨테이너 환경에서 독립적으로 어플리케이션을 실행할 수 있도록 컨테이너를 만들고 관리하는 것을 도와주는 도구이다.
    • 도커를 통해 어플리케이션 실행 -> 독립적인 환경에서 일관된 결과를 보장

     

    사용하는 이유 ? 

    - 이 단락은 아래 블로그를 참고하여 작성하였다. 도커를 왜 써야하는지에 대해 굉장히 잘 작성된 글이라 읽어보면 좋을 것 같다. 

    ㄴ 참고 : https://www.44bits.io/ko/post/why-should-i-use-docker-container

    • 운영하면서 만들어지는 Snowflake Servers 
      • 같은 일을 하는 서버를 여러 대 만들더라도, 운영체제부터 컴파일러, 설치된 패키지까지 완벽하게 같게 만들기 쉽지않다. 
      • 이런 차이점이 장애로 이어지고, 서로 모양이 다른 서버들이 존재하는 상황을 Snowflakes Server라고 한다.
        • 예를 들어, A 서버는 몇 년 전에 만들어지고, B 서버는 최근에 만들었다 해보자.
        • A서버에 장애가 났다. 버전 차이로 인한 문제 등이 원인이 될 수 있는데 B 작업자는 A서버의 구성, 운영과정을 파악해야 A-B 서버의 차이를 알아내고 장애를 해결할 수 있다.
      • 이를 위해 여러 서버 운영 기록을 코드로 구성하는 방안이 등장
        • 도커에서 사용하는 도커파일도 서버 운영 기록을 코드화한 것이다. (도커 이미지는 실행시점을 추가)
        • 도커의 장점 :  도커 이미지를 1년 전에 실행하든, 오늘 실행하든 서버가 동일하게 구성된다. 
      • 즉, 실행 시점에 상관없이 구성 시점을 고정할 수 있다!  
    • TDD 관점
      • 테스트 작성 - 테스트 실패 - 코드 작성 / 수정 - 테스트 성공 - 리팩터링 과정
      • 도커 파일 생성 - 도커 이미지 생성 실패 - 도커 파일 작성 / 수정 - 도커 이미지 생성 성공 - 효율화 
    • 변경될 사항은 환경변수로 관리
      • 그런데, 위 방법대로 도커 파일, 코드 전혀 수정하지 않고 이미지 1년뒤에 빌드하면 그대로 구성가능할까?
      • 서버에 설치하는 패키지가 패치되어 버리거나 하면 달라질 수도 있다. 그리고 이런 부분은 바뀌어야 하는게 맞다. 
      • 도커는 바뀌어야 할 부분을 환경변수에 넣고 관리하며, 도커 이미지와 이렇게 바뀌는 환경변수들을 더한 것이 도커 컨테이너
    • 컨테이너 기술(도커) 덕분에 서버 설치하고 운영 기록을 별도로 관리할 필요 없이 잘 만들어진 서버 사용 가능. 
      • 서버 제작 과정에 견고함 + 유연성
      • 다른 사람이 만든 서버를 가져다 쓸 수 있음
      • 여러 대에 배포가 가능한 확장성

     

    구성 요소들

    Docker daemon

    • 도커 엔진의 핵심 구성 요소
    • 도커 호스트에서 컨테이너를 관리(생성, 시작, 중지, 삭제 등)하고 실행
    • 컨테이너 이미지 관리, 외부 이미지 다운, 빌드 등을 수행 
    • Docker API 요청 받기(docker client 로부터)
    • 이미지, 컨테이너, 네트워크, 볼륨과 같은 도커 오브젝트들 관리  
    • 다른 daemon 들과 통신 가능 

     

    Docker client

    • 도커와 상호작용하기 위해 사용하는 주된 경로, 하나 이상의 docker daemon과 상호작용 가능
    • gui / cli 등을 통해 명령을 내리면 도커 데몬으로 보내 실행된다. 
    • ex) client에 docker run 입력 -> client가 docker daemon으로 명령어 보냄 

     

    Docker Object 

    • 도커 이미지, 컨테이너 등 

     

    Docker Registries 

    • 도커 이미지를 관리하고 저장하는 공간, 자기자신만의 레지스트리 생성도 가능 
    • Docker Hub : public registry로, 누구나 사용 가능 
    • docker pull, docker run 명령어 사용하여 registry로부터 이미지 가져오거나 docker push 통해 이미지를 registry에 올릴 수도 있음

     

    Docker Volume 

    • 이미지는 읽기 전용이다. 추가되거나 변하는 값은 컨테이너에 저장된다고 위에서 언급. 
    • 정확히는 이미지 레이어 위 컨테이너 레이어라는 곳에 기록된다. 
    • 이러면 컨테이너 삭제 시 이러한 데이터들도 다 삭제된다. 이를 막기 위해 사용하는 것이 볼륨. 
      • 호스트와 볼륨을 공유
      • 볼륨 컨테이너 활용
      • docker volume 명령어로 도커 자체의 볼륨 기능 활용(볼륨 만들고 컨테이너와 연결하면 된다)

    Docker Network  

    • Container 간 연결을 돕기 위한 논리적 네트워크 개념

    • 종류? 
      • bridge : 기본 네트워크 드라이버, 동일 도커 호스트에서 컨테이너 간 통신 돕는다.
        • docker 0 : docker host설치 후 기본적으로 생성된다. 
          • 172.17.42.1로 IP 설정, virtual ethernet bridge이다.
          • subnet 정보를 통해 각 컨테이너들이 할당받을 IP range를 결정
          • 컨테이너가 외부로 통신할 때에는 무조건 docker0 지난다. 
          • 내가 원하는 bridge 생성하고 docker 0 대신 사용도 가능 (실제 개발시에는 이렇게 주로 사용)
      • host: 호스트의 네트워크를 직접 사용하는 방식이다. 
      • overlay: 서로 다른 도커 호스트의 컨테이너 간 통신 돕는다.

    Container가 외부와 통신하려면? 

    • 기본적으로 container 생성하면 외부와 통신이 불가능하다. 
      • 각 container에는 격리된 네트워크 환경이 제공되고, Docker host와 bridge방식으로 바인딩
      • container 끼리는 각자 할당받은 private IP 통해 통신 가능 
      • 웹 서비스를 위한 컨테이너는 http 통신을 위한 80번 포트가 외부와 통신이 되어야 서비스가 가능하다. 
    • 그렇다면 어떻게 해야할까? 
      • Port forwarding
        •  NAT가 동작하는 라우터 / 게이트웨이의 특정 포트 번호로 유입되는 트래픽을 내부 시스템의 특정 포트로 전달해주는 기법
      • p 옵션을 사용하여 Container Port를 외부로 노출할 수 있다. 
      • docker run -p [호스트포트번호]:[컨테이너 내부 포트번호] 이미지 이름 [기타 옵션]

    가상화 기술? 

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

    • VM (가상 머신 방식)과 Container 방식의 차이 ? 
      • 가상머신 : 하드웨어 레벨 가상화 
        • 가상화된 하드웨어 상에서 자체 운영체제(게스트 OS)를 포함한 모든 구성 요소를 실행하는 하나의 완전한 머신
        • 구현 기술 하이퍼바이저
          • 가상 머신을 생성하고 구동하는 소프트웨어, OS 자원을 할당 조율
          • OS들의 요청을 번역하여 하드웨어에 전달
          • 각 Guest OS들은 하이퍼바이저를 통해서 자원을 할당받는다. 
      • 컨테이너 :  애플리케이션 간에 운영체제(OS)를 공유, 각각의 컨테이너는 VM보다 가벼움
        • Guest OS 없이 컨테이너 엔진 통해 어플리케이션을 구동한다.
        • 각 어플리케이션들은 컨테이너 엔진으로 자원 할당받음
        • 도커 컨테이너가 OS에 요청, OS가 물리적인 자원을 가져다 준다.

     

     

     

     

     


     

    * 개인적으로 공부하며 작성한 내용이므로 틀린 내용이 있다면 지적 부탁드립니다. 

    * 기타 이미지 및 참고한 자료들

Designed by Tistory.