티스토리 뷰

Infra Structure/.system

Docker #1

가그린민트 2019. 7. 21. 23:48

이 포스팅은 "도커/쿠버네티스를 활용한 컨테이너 개발 실전 입문" 책을 읽고 스터디한 내용을 다룬 포스팅입니다.

 

 

"Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼이다. Docker는 소프트웨어를 컨테이너는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있다. Docker를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있으며 코드가 문제없이 실행될 것임을 확신할 수 있다." AWS

 


1. OS를 가상화한 기존의 방식과 Docker는 어떤 차이가 있을까?


하이퍼바이저(VMM) 기술을 이용한 가상화 방식에는 native와 hosted 등 2가지가 있다.
native 혹은 베어메탈 하이퍼바이저를 이용한 방식은 전가상화/반가상화 등 2가지로 나뉜다. 전가상화란 하드웨어를 완전히 가상화하여 모든 가상머신의 요청은 항상 하이퍼바이저를 통해서 간다. GuestOS 운영체제의 별다른 수정없이 사용할 수 있다는 장점은 있지만, 하이퍼바이저가 모든 명령을 중재하기 때문에 성능이 비교적 느리다. 반면, 반가상화는 Hyper call이라는 인터페이스를 이용하여 하이퍼바이저에게 요청을 날릴 수 있으며 전가상화에 비해 성능이 빠르다는 장점이 있다. 
이에 비해 호스트형 가상화의 경우, Host 운영체제 위에서 하이퍼바이저가 동작하는 방식이다. 가상의 하드웨어를 에뮬레이팅하기 때문에 오버헤드가 크지만 Host OS에 크게 제약사항이 없다. 

그저 특정 환경에 종속되지 않은 상태로 애플리케이션을 띄우고 싶을 뿐인데 OS를 booting하는 것은 비경제적이다. 

"격리된 CPU, 메모리, 디스크, 네트워크를 가진 공간을 만들고 이 공간에서 프로세스를 실행해서 유저에게 서비스"하려면 어떻게 해야 할까?

 

     - cgroup을 사용하여 자원의 사용량을 제한
     - namespace로 특정 유저만 자원을 볼 수 있도록 제한
     - overlay network 등 네트워크 가상화 기술 활용
     union file system (AUFS, overlay2)로 이식성, 비용절감

 


2. Docekr와 LXC(Linux Container)는 어떤 차이가 있을까?


     - Host OS의 영향을 받지 않는 실행환경 (docker engine을 이용한 실행환경 표준화)
     - DSL(Dockerfile)을 이용한 컨테이너 구성 및 애플리케이션 배포 정의
     - 이미지 버전 관리
     - Layer 구조를 갖는 이미지 포맷(차분 빌드가 가능함)
     - Docker Registry(이미지 저장 서버 역할을 함)
     - 프로그램 가능한 다양한 기능의 API


즉, 도커는 컨테이너 가상화 기술을 사용하는 것은 물론이고, 그것을 관리하기 위한 명령행 도구로 구성된 Product이며 이미지 버전관리 및 Docker Registry 등 다양한 기능을 제공한다.

 


3. Docker 이점


- 변화하지 않는 실행환경으로 멱등성 확보
  코드 기반으로 인프라 구축을 관리한다고 해도 멱등성을 보장하기 위해 항구적인 코드를 계속 작성하는 것은 운영업무에 부담을 주기 쉽다. 그리고 서버 대수가 늘어날수록 모든 서버에 구성을 적용하는 시간도 늘어난다. Docker를 사용하여 Immutable Infra를 구성하여 해결할 수 있다. 즉, 서버에 변경을 가하고 싶은 경우에는 기존 인프라를 수정하는 대신 새로운 서버를 구축하고 그 상태를 이미지로 저장한 다음 그 이미지를 복제한다. 

- 코드를 통한 실행환경 구축 및 애플리케이션 구성
  인프라의 가변성으로 인한 문제를 해결하기 위해서는 애플리케이션이 의존하는 환경의 차이를 가능한한 배제하여야 한다. 도커는 특정 시점의 서버 상태를 저장해 복제(Docker image)하고 이를 코드로 관리하는 기능(Dockerfile)을 제공하여 Immutable Infra를 가능케 한다.
  
- 실행 환경과 애플리케이션의 일체화로 이식성 향상
  애플리케이션과 환경을 같이 묶어서 빌드할 수 있게함으로써 기존에 존재하던 환경의 차이를 최소한으로 줄였다. 빌드된 이미지는 도커가 설치된 머신이라면 어디서든 실행될 수 있다.
  
- 시스템을 구성하는 애플리케이션 및 미들웨어의 관리 용이성
  일정 규모 이상의 시스템은 여러 애플리케이션과 미들웨어의 조합으로 구성된다. docker compose, docker swarm 및 kubernetes 등 다양한 도구를 통해 이러한 아키텍처를 구현해낼 수 있다. 
  


4. 기본 용어


- 도커 이미지 : 도커 컨테이너를 구성하는 파일시스템과 실행할 애플리케이션 설정을 하나로 합친 것으로, 컨테이너를 생성하는 템플릿 역할을 한다.
- 도커 컨테이너 : 도커 이미지를 기반으로 생성되며, 파일시스템과 애플리케이션이 구체화되어 실행되는 상태이다.
Dockerfile : 도커 이미지를 만들 때 필요한 설정파일이다. 도커 이미지 빌드시에 이 파일의 인스트럭션들을 참조하여 이미지를 만든다.
- 인스트럭션 : Dockerfile 내에 있는 명령어들을 말한다. 

 

FROM 인스트럭션: 도커 이미지의 바탕이 될 베이스 이미지를 지정한다.
RUN 인스트럭션: 도커 이미지를 실행할 때 컨테이너 안에서 실행할 명령을 정의
COPY 인스트럭션: 도커가 동작중인 호스트머신의 파일이나 디렉터리를 도커 컨테이너 안으로 복사하는 인스트럭션
CMD 인스트럭션: 도커 컨테이너를 실행할 때 컨테이너 안에서 실행할 프로세스를 지정한다. RUN은 이미지를 빌드할 때 실행되고 CMD는 컨테이너를 시작할 떄 한번 실행된다.

 


5. 도커 명령어 - https://devhints.io/docker


1) 도커 이미지 다루기

- docker image build

   docker image build -t example/echo:latest .

   docker image build --pull=true -t example/echo:latest .  (베이스 이미지 강제로 받기)

   docker image build -f Dockerfile-test -t example/echo:latest . (도커파일의 이름이 Dockerfile이 아닌 경우)


- docker search

- docker image pull

- docker image ls

- docker image tag

- docker image push

 


2) 도커 컨테이너 다루기

- docker container run 
    docker container run -it alpine:3.7 uname -a

    -i : 컨테이너쪽 표준입력과의 연결을 그대로 유지, 파이프라인이나 키보드 입력 등이 이에 해당
    -t : 유사터미널 기능을 활성화

    --rm : 컨테이너를 종료할 때 컨테이너를 파기하도록 하는 옵션
    -v : 호스트와 컨테이너간 디렉터리 혹은 파일을 공유하기 위한 옵션

     

     즉, -i와 -t가 조합되면 가상 터미널로 표준 입력을 할 수 있게 됨 (-t 하나만 쓰면 터미널은 있는데 입력은 안되는 상황으로 의미가 없음)

     -d는 -i -t와 함께 쓰일 수 없다. background로 돌아가므로 -i로 입력을 대기할 수도, -t로 가상 터미널을 제공할 수도 없다.

     다만, background에서 돌아가는 상황에서도 docker exec 명령으로 -i와 -t 옵션을 사용할 수 있다.


- docker container ls

- docker container stop

   docker stop $(docker container ls -q)

 

- docker container restart

- docker container rm

- docker container logs
   docker container logs -f $(docker container ls --filter "name=bbd8855" -q)


- docker container exec

   컨테이너 내부의 상태를 확인하거나 디버깅하는 용도로 사용
   다만, 컨테이너 안에 든 파일을 수정하는 것은 애플리케이션에 의도하지 않은 부작용을 초래할 수 있으므로 운영환경에서는 절대 해서는 안된다.


- docker container cp

    COPY: 이미지를 빌드할 때 호스트에서 복사해온 파일을 정의하기 위한 것
    docker container cp: 실행 중인 컨테이너와 파일을 주고받기 위한 명령


- prune
   docker container prune
   docker image prune
   docker system prune

3) 운영과 관리를 위한 명령
- docker container stats

댓글
링크
최근에 달린 댓글
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Total
Today
Yesterday