본문 바로가기
CM/docker

Docker 리서치

by 태하팍 2021. 2. 3.
반응형

도커

도커 등장 배경

  • docker 관련 문서 : https://github.com/remotty/documents.docker.co.kr
  • 서버를 관리한다는 것
    • 복잡하고 어려운 서버관리
  • 시간이 흐르면서 서버환경이 종종 바뀌거나 오픈소스가 바뀌거나 하는 걸 볼수 있습니다.
    • CentOS -> Ubuntu
    • Chef -> Ansible -> 또 다른 오픈소스
  • DevOps의 등장으로 짧은 개발주기와 잦은 배포
  • 마이크로서비스 아키텍처의 유행 -> 프로그램은 더 잘게 쪼개어져 관리는 더욱 복잡해짐.
  • 새로운 툴은 계속 나오고 클라우드의 발전으로 설치해야 할 서버가 수백, 수천대에 이르는 상황(?)
  • 이런 노답인 상황에서 Docker가 등장하고 서버관리 방식이 완전히 바뀌게 됩니다.

도커의 역사

  • 도커는 2013년 3월 산타클라라에서 열린 Pycon Conference에서 dotCloud의 창업자인 Solmon Hykes가 The future of Linux Containers 라는 세션을 발표하면서 처음 세상에 알려졌습니다.

도커란?

  • 도커는 컨테이너 기반의 오픈소스 가상화 플랫폼 입니다.

    • 컨테이너 하면 화물 수송용 박스를 생각할 수 있는데 여기에는 여러가지 화물들이 들어 있고 규격화 되어 컨테이너선이나 트레일러 등 다양한 운송 수단으로 쉽게 옮길 수 있다.
    • 마찬가지로 서버에서 이야기하는 컨테이너도 다양한 프로그램, 실행환경을 컨테어니로 추상화 하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해준다.
      백엔드, 데이터베이스, 메시지큐 등 어떤 프로그램도 컨테이너로 추상화 할 수 있고 조립PC, AWS, Azure, Google Cloud등 어디서든 실행 할 수 있다.
  • 기존 가상화 방식은 OS를 가상화!

    • VMware, VirtualBox같은 가상머신
      • 무겁고 느림

컨테이너

  • 컨테이너
    • 프로세스를 격리하는 방식 -> 다수의 컨테이너를 OS커널에서 직접 구동.
      • 격리된 실행환경을 제공하기 위한 인프라 기술.
    • 하나의 서버에 여러개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행되어 마치 가벼운 Virtual Machine을 사용하는 느낌을 줍니다.
    • 실행 중인 컨테이너에 접속하여 명령어를 입력할 수 있고 apt-get or yum으로 패키지 설치 가능

이미지

  • 컨테이너 실행에 필요한 파일과 설정 값 등을 포함하고 있는 것
  • 이미지를 실행한 상태라고 볼수 있고 추가되거나 변하는 값은 컨테이너에 저장
  • 같은 이미지에 여러개의 컨테이너를 생성 할 수 있고 컨테이너의 상태가 변경되거나 삭제되더라도 이미지는 변하지 않고 그대로 남아 있습니다.
    • 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 더이상 의존성 파일을 컴파일하고 이것저것 설치할 필요가 없습니다.
    • 이제 새로운 서버가 추가되면 미리 만들어 놓은 이미지를 다운받고 컨테이너를 생성만 하면 됩니다.
    • 한 서버에 여러개의 컨테이너를 실행 할 수 있고, 수십, 수백, 수천대의 서버도 문제 X

레이어 저장방식

  • 도커 이미지는 컨테이너 실행하기 위한 모든 정보를 가지고 있기 때문에 용량이 큼.(MB)
    • 처음 이미지를 다운받을 때는 크게 부담이 안가지만 기존 이미지에 파일하나 추가했다고
      다시 다운 받는다면 매우 비 효율적 일 수밖에 없다.
    • 도커는 이런 문제를 해결하기 위해 레이어(layer)라는 개념을 사용.
    • 유니온 파일 시스템을 이용하여 여러개의 레이어를 하나의 파일 시스템으로 사용할 수 있게 해줍니다.
    • 이미지는 여러개의 읽기 전용(read only) 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성 됩니다.
    • 예를 들어 CentOS 이미지가 A라고 하자.
      CentOS 이미지를 베이스로 만든 톰캣 이미지는 A+tomcat이 된다.
      webapp 이미지를 톰캣 이미지 기반으로 만들었다고 한다면
      A+tomcat+source 레이어로 구성된다.
      webapp 소스를 수정하면 A, tomcat 레이어를 제외한 새로운 source(v2) 레이어만
      다운 받으면 되기 때문에 굉장히 효율적으로 이미지를 관리할 수가 있다.
    • 컨테이너를 생성할 때도 레이어 방식을 사용
      • 기존 이미지 레이어 위에 읽기/쓰기 레이어를 추가
      • 이미지 레이어를 그대로 사용하면서 컨테이너가 실행 중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러개의 컨테이너를 생성해도 최소한의 용량만 사용.

url 방식으로 관리

  • 이미지는 url방식으로 관리하며 태그(tag)를 붙일 수 있음.

Dockerfile

  • 도커는 이미지를 만들기 위해 Dockerfile 이라는 파일에 자체 DSL(Domain Specific Language)언어를 이용하여 이미지를 생성 합니다.

Docker Hub

  • 도커 이미지 용량은 보통 수백메가로 수기가가 넘는 경우도 흔합니다.
    이렇게 큰 용량의 이미지를 서버에 저장하고 관리하는 것은 쉽지 않은데 도커는 Docker Hub를 통해 공개 이미지를 무료로 관리해 줍니다.

Docker Command&Api

  • 도커 클라이언트 Command가 있으며 http기반의 Rest Api도 지원
    • 확장성 Up!

Docker 설치

도커 기본 명령어

이미지 관련

  • 이미지 목록 보기
    • sudo docker images
  • 이미지 검색
    • sudo docker search [이미지 이름]
  • 이미지 받기
    • sudo docker pull [이미지 이름]:[버전]
    • 버전에 latest를 쓰면 최신 버전으로 받을 수 있음.
  • 이미지 삭제
    • sudo docker rmi [image id]
    • 컨테이너를 삭제하기 전에 이미지를 삭제 할 때 -f 옵션으로 컨테이너도 강제 삭제 가능
      • sudo docker rmi -f [image id]

컨테이너 관련

  • 컨테이너 목록 보기

    • sudo docker ps
      • -a 옵션 : 모든 컨테이너 목록 출력
  • 컨테이너 실행

    • sudo docker run [options] image[:TAG | @DIGEST] [COMMAND] [ARG..]
  • 컨테이너 정지

    • docker stop [컨테이너 id or name]
  • 컨테이너 시작

    • docker start [컨테이너 id or name]
  • 컨테이너 재시작

    • docker restart [컨테이너 id or name]
  • 컨테이너 삭제

    • docker rm [컨테이너 id or name]
  • 모든 컨테이너 삭제

    • docker rm docker ps -a -q
  • 컨테이너 로그 보기(logs)

    • docker logs [OPTIONS] CONTAINER
      • 기본 옵션, -f, --tail 옵션을 살펴보자
  • sudo 없이 Docker 명령어 쓰기

    • sudo usermod -aG docker $USER # 현재 접속중인 사용자에게 권한 주기
    • sudo usermod -aG docker your-user # your-user 사용자에게 권한 주기

스프링부트+도커

  • 참고 : https://spring.io/guides/gs/spring-boot-docker/

  • docker는 리눅스 베이스로 돌아간다.

    • macOS에서는 Boot2Docker가 필요 함.
      • virtualBox 가상머신 안에 리눅스를 설치하고 도커를 실행.
    • 다행히 MacOS용 도커를 깔면 기본으로 boot2docker를 제공 해줌.(개꿀~)
  • Dockerfile 만들기

  • 예제)

    FROM openjdk:8-jdk-alpine
    ARG JAR_FILE=target/*.jar
    COPY ${JAR_FILE} app.jar
    ENTRYPOINT ["java","-jar","/app.jar"]
    

* 참고
  * FROM : 이미지를 생성할 때 사용할 기반 이미지를 지정한다. 예제에서는 openjdk:8-jdk-alpine 이미지를 사용했다. 이 이미지는 알파인 OS에 JDK 8을 설치한 이미지이다.
  * RUN : 이미지를 생성할 때 실행할 코드를 지정한다. 예제에서는 패키지를 설치하고 파일 권한을 변경하기 위해 RUN을 사용했다.
  * WORKDIR : 작업 디렉토리를 지정한다. 해당 디렉토리가 없으면 새로 생성한다. 작업 디렉토리를 지정하면 그 이후 명령어는 해당 디렉토리를 기준으로 동작한다.
  * COPY : 파일이나 폴더를 이미지에 복사한다. 위 코드에서 두 번째 COPY 메서드는 entrypoint.sh 파일을 이미지에 run.sh 이름으로 복사한다. 상대 경로를 사용할 경우 WORKDIR로 지정한 디렉토리를 기준으로 복사한다.
  * ENV : 이미지에서 사용할 환경 변수 값을 지정한다. 위 코드는 PROFILE 환경 변수의 값으로 local을 지정했는데 이 경우 컨테이너를 생성할 때 PROFILE 환경 변수를 따로 지정하지 않으면 local을 기본 값으로 사용한다.
  * ENTRYPOINT : 컨테이너를 구동할 때 실행할 명령어를 지정한다. 위에서는 run.sh을 실행하도록 설정했다.'

  
반응형

'CM > docker' 카테고리의 다른 글

Dockerfile 명령어 정리  (0) 2022.06.10
docker 빌드로 이미지를 만들어보자!(작성 중)  (0) 2022.01.25
Docker ?  (0) 2017.06.27
about docker  (0) 2017.04.27