Error rendering WebPanel: No renderer found for resource type: velocity Template contents: <meta name="ajs-keyboardshortcut-hash" content="$keyboardShortcutManager.shortcutsHash">
메타 데이터의 끝으로 건너뛰기
메타 데이터의 시작으로 이동

DevOps

DevOps

  • Dev(개발)과 Ops(운용)이 긴밀히 협조, 연계하여 비즈니스 측면의 가치를 높이는 근무 방식과 문화
  • 개발에 한정된 방법이 아니라, 팀 빌딩, 개발 프로세스 설계 등의 조직 구성, 문화의 형성까지 포함하고 있는 사고방식

등장 배경

  • 애자일 개발에 의한 계속적인 개발로의 변화
  • 계속적인 개발로 인해 나타나는 운용 과제
  • 1980년대부터 서비스 개발에 워터폴(waterfall)이라는 개발 방법은 현재의 Web 서비스에서 대응이 매우 어려움
  • 지속적 통합(continuous integration)
  • 문제 제기
  • 개발팀과 운용팀의 미션은 비즈니스를 유효하게 하는 것이다. (O'Reilly 2009 Velocity conference)
    (https://www.slideshare.net/jallspaw/10-deploys-per-day-dev-and-ops-cooperation-at-flickr)
    • Ops' job is NOT to keep the site stable and fast
    • Ops' job is to enable this business (this is dev's job too)
    • Lowering risk of change through tools and culture
  • 변화에 대응하기 위한 도구
    • Automated infrastructure (인프라 자동화)
    • Shared version control (버전 관리 공유)
    • One step build and deploy (원 스텝 빌드와 deploy)
    • Feature Flags (애플리케이션 기능의 유효/무효를 설정 파일로 관리하는 것)
    • Shared metrics (metrics 공유)
    • IRC and IM robots (IRC와 인스턴트 메신저 bot)
  • 변화에 대응하기 위한 문화
    • Respect (존중)
    • Trust (신뢰)
    • Healthy attitude about failure (실패에 대한 긍정적인 자세)
    • Avoiding Blame (비난을 하지 않는 것)
  • 2009년 10월 30일 DevOpsDays Ghent 2009에서 DevOps라는 말을 첫 언급
    (http://www.jedi.be/blog/2009/11/15/devopsdays09-two-weeks-later/)
  • 기존에는 명확했던 인프라 엔지니어와 서버 사이드 엔지니어의 영역 구분이 점점 희미해지고 있다.

Infrastructure as Code

  • 인프라의 코드화
  • 직접 실제 기기에 설정을 하는 대신, 서버나 미들웨어의 구성 정보와 설정 정보를 정의 파일에 기재하고 도구를 이용
  • 인프라의 구성과 설정에 있어서도 소프트웨어 개발 방법을 적용
  • 개발자도 구성 정보를 기술하는 인프라를 구축

Immutable Infrastructure

  • 불변 인프라
  • 어떤 시점의 서버 상태(= 이미지)를 저장해 복제할 수 있게 하자는 개념
  • 서버에 변경을 가하고 싶은 경우에는 기존 인프라를 수정하는 대신 새로운 서버를 구축하고 그 상태를 이미지로 저장한 다음 그 이미지를 복제한다.
  • 한번 설정된 서버는 수정 없이 파기되므로 멱등성을 신경 쓸 필요조차 없다.

Docker의 기초

Docker란 무엇인가?


  • Docker 사가 개발한 컨테이너 관리 소프트웨어
  • 컨테이너형 가상화 기술을 구현하기 위한 상주 애플리케이션과 이 애플리케이션을 조작하기 위한 명령행 도구로 구성되는 프로덕트
  • https://www.docker.com
  • 가상 환경에 운영 환경과 같은 운영 체제를 설치하고 문서를 참고해 패키지 관리자로 필요한 요소를 설치하는 작업은 고려해야 할 점도 많고 수고가 많이 드는 작업이다.
  • 하지만 도커는
    • 가상화 소프트웨어와 비교하여 오버헤드가 적다.
    • 기존 가상화 소프트웨어보다 더 가볍게 동작한다.
    • 이식성이 뛰어나다.

Docker의 기본 개념

  • 컨테이너형 가상화 자체는 도커 이전에도 존재하던 기술
  • 도커가 등장하기 전에는 LXC(Linux Containers)가 유명했고, 초기 도커도 LXC를 런타임으로 사용하였다. (현재는 runC)
    • LXC는 호스트 운영 체제 가상화보다 성능 면에서 유리하다는 장점으로 시스템 컨테이너(애플리케이션 배포 용도가 아닌 단순한 리소스 분리 목적)로서 어느 정도 자리를 잡았다.
    • 그러나 복제한 애플리케이션을 다른 LXC 호스트에서 실행했을 때 LXC 설정의 차이로 인해 기대했던 대로 애플리케이션이 동작하지 않는 등의 문제가 있었다.
  • 도커와 LXC의 차이점
    • 호스트 운영 체제의 영향을 받지 않는 실행 환경(Docker Engine을 이용한 실행 환경 표준화)
    • DSL(Dockerfile)을 이용한 컨테이너 구성 및 애플리케이션 배포 정의
    • 이미지 버전 관리
    • 레이어 구조를 갖는 이미지 포맷(차분 빌드가 가능함)
    • 도커 레지스트리(이미지 저장 서버 역할을 함)
    • 프로그램 가능한 다양한 기능의 API
  • 컨테이너에 애플리케이션 실행 환경이 함께 배포되는 방식
  • 도커가 널리 쓰이는 원인은 환경의 영향을 덜 받고 배포가 간편하기 때문이다.

호스트 운영체제형 가상화

  • 운영 체제 위에서 가상화 소프트웨어를 사용해 하드웨어를 에뮬레이션하는 방법으로 게스트 운영 체제를 만드는 방식
  • e.g. VMWare Player, 오라클 버추얼박스
  • 컨테이너의 개념을 설명하기 위해 자주 인용되는 것이 가상 머신
  • 가상 머신은 물리적 호스트와 그 위에 설치되는 가상화 하이퍼바이저에서 작동


컨테이너형 가상화

  • 가상화 소프트웨어 없이도 운영 체제의 리소스를 격리해 가상 운영 체제를 만들 수 있다.
  • 이 가상 운영 체제를 컨테이너라고 부른다.
  • 도커 컨테이너는 운영 체제(인프라)와 애플리케이션을 함께 담은 상자 같은 개념이다.
  • 각 컨테이너는 별도의 OS를 가지지 않고 옆에 있는 컨테이너와 동일하게 그 실행 환경인 Docker Engine을 공유

실습 1. 로컬 도커 환경 구축하기

  • 도커 다운로드: https://www.docker.com/products/docker-desktop
  • 윈도우용/macOS용 도커에는 하이퍼바이저형 가상화가 사용되는데, 운영 체제 자체에 내장된 가상화 시스템을 이용해 오버헤드를 최소한 억제한다.
    • 기존의 도커 툴박스는 버추얼박스와 함께 사용해야 했지만, 2016년 봄에 윈도우용/macOS용 도커가 발표되면서 이 문제가 해결됐다.
    • 호스트형 가상화 기술에서는 호스트 운영 체제를 거쳐 하드웨어를 제어하기 때문에 그만큼 오버헤드가 발생할 수밖에 없다. 윈도우용 도커는 Hyper-V를, macOS용 도커는 Hypervisor.framework를 각각 이용해 더 직접적으로 하드웨어를 다룸으로써 속도를 개선했다.
docker version
    • Docker Engine은 클라이언와 서버로 나누어져 있고 그 사이에 REST API로 소통을 한다.
    • 클라이언트는 요청을 할 뿐 `build`, `run`, `push` 등 실질적인 작업은 서버가 모두 수행한다.

실습 2. 도커 스타일 체험하기

# FROM 절은 컨테이너의 원형(틀) 역할을 할 도커 이미지(운영 체제)를 정의한다.
FROM ubuntu:16.04

# COPY 절은 셸 스크립트 파일(helloworld)을 도커 컨테이너 안의 /usr/local/bin에 복사하라고 정의한 것이다.
COPY helloworld /usr/local/bin
# RUN 절은 도커 컨테이너 안에서 어떤 명령을 수행하기 위한 것이다.
RUN chmod +x /usr/local/bin/helloworld

# CMD 절은 완성된 이미지를 도커 컨테이너로 실행하기 전에 먼저 실행할 명령을 정의한다.
CMD ["helloworld"]
docker image build -t helloworld:latest .
docker container run helloworld:latest

Docker를 사용하는 의의

  • 변화하지 않는 실행 환경으로 멱등성(Idempotency) 확보
  • 코드를 통한 실행 환경 구축 및 애플리케이션 구성
  • 실행 환경과 애플리케이션의 일체화로 이식성 향상
  • 시스템을 구성하는 애플리케이션 및 미들웨어의 관리 용이성
  • 2014년 발표에 따르면 구글은 모든 서비스들이 컨테이너로 동작하고 매주 20억 개의 컨테이너를 구동한다고 한다.
    (https://speakerdeck.com/jbeda/containers-at-scale)

Docker 컨테이너 배포

Docker 이미지와 Docker 컨테이너

Docker 이미지

  • 도커 컨테이너를 구성하는 파일 시스템과 실행할 애플리케이션 설정을 하나로 합친 것으로, 컨테이너를 생성하는 템플릿 역할을 한다.
  • docker image

    명령어옵션설명예시
    pull
    도커 이미지를 받아온다.docker image pull alpine:latest




    ls
    생성된 이미지의 REPOSITORY, TAG, IMAGE ID, CREATED, SIZE 값 등을 확인할 수 있다.docker image ls
    build



    -t이미지명을 지정한다. 태그명을 지정할 수 있으며, 생략 시에는 latest 태그가 붙는다.docker image build -t alpine:latest

    -fDockerfile이라는 이름 외의 파일명으로 된 Dockerfile을 사용할 수 있다.docker image build -f Dockerfile-test

Docker 컨테이너

  • 도커 이미지를 기반으로 생성되며, 파일 시스템과 애플리케이션이 구체화돼 실행되는 상태
  • docker container

    명령어옵션설명예시
    run
    이미지를 컨테이너로 실행한다.docker container run alpine:latest

    -i


    -t


    -p포트 포워딩docker container run -p 8080:80 alpine:latest

    -d백그라운드로 컨테이너를 실행한다.docker container run -d alpine:latest

    --name컨테이너에 이름 붙이기docker container run --name alpine alpine:latest




    ls
    현재 실행 중인 도커 컨테이너의 목록을 보여 준다.docker container ls

    -q컨테이너 ID만 출력한다.docker container ls -q
    stop
    컨테이너를 정지한다.docker container stop alpine:latest
    restart
    컨테이너를 재시작한다.docker container restart alpine:latest
    rm
    컨테이너를 파기한다.docker container rm alpine:latest

실습 3. 간단한 애플리케이션과 도커 이미지 만들기

docker image build -t example/echo:latest .
docker image ls
docker container run example/echo:latest
docker container run -d example/echo:latest
    • docker 축약 명령보다 축약되지 않은 긴 명령을 사용하는 것을 추천하는 분위기다.
    • 각 명령이 의미하는 바가 명확히 드러나기 때문이다.
curl http://localhost:8080/
docker container stop $(docker container ls --filter "ancestor=example/echo" -q)
docker container run -d -p 9000:8080 example/echo:latest
curl http://localhost:9000/

Docker 컨테이너의 생애주기

실행 중 상태

  • Dockerfile에 포함된 CMD 및 ENTRYPOINT 인스트럭션에 정의된 애플리케이션이 실행되는 동안 컨테이너는 실행 중 상태가 된다.
  • 애플리케이션 실행이 끝나면 정지 상태가 된다.

정지 상태

  • 사용자가 명시적으로 정지하거나 컨테이너에서 실행된 애플리케이션이 종료된 경우에 컨테이너는 정지 상태가 된다.

파기 상태

  • 정지 상태의 컨테이너는 명시적으로 파기하지 않는 이상 디스크에 그대로 남아 있다.
  • 컨테이너를 자주 생성하고 정지해야 하는 상황에서는 디스크를 차지하는 용량이 점점 늘어나므로 불필요한 컨테이너를 완전히 삭제하는 것이 바람직하다.

DockerFile

  • 코드를 기반으로 복제 및 배포가 이루어지기 때문에 재현성이 높은 것이 특징

Docker Compose

  • YAML 포맷으로 작성된 설정 파일로 컨테이너를 정의하거나 컨테이너 간의 의존 관계를 정의해 시작 순서를 제어할 수 있다.

실습 4. 도커 컴포즈로 여러 컨테이너 실행하기

실습 5. 젠킨스 컨테이너 실행하기

참고 자료


  • 레이블 없음

1 개의 댓글

  1. docker-compose.yml

    version: "3"
    services:
      echo-service01:
        image: example/echo:latest
        ports:
          - 10000:8080
      echo-service02:
        image: example/echo:latest
        ports:
          - 10001:8080


    결과

    CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS              PORTS                     NAMES
    c0ba46732e7b        example/echo:latest   "go run /echo/main.go"   About a minute ago   Up About a minute   0.0.0.0:10000->8080/tcp   exam3_echo-service01_1
    d951b922fc38        example/echo:latest   "go run /echo/main.go"   About a minute ago   Up About a minute   0.0.0.0:10001->8080/tcp   exam3_echo-service02_1