Posts Docker란 무엇인가
Post
Cancel

Docker란 무엇인가

배경

  • Environment Disparity 문제를 해결해준다.
  • 다른 머신에서도 같은 환경을 구현할 수 있다.
  • ex) 작업하는 머신은 윈도우고, 서버 머신은 리눅스라고 할 때, 코드를 고치고 배포할 때 environment disparity때문에 동작을 하지 않을 수 있다. 이때 도커를 윈도우와 리눅스에 설치를 하고, Dockerfile을 생성해 구현하고 싶은 환경(ubuntu, python, git..)을 설정하면 된다. docker는 이 Dockerfile을 읽고, 필요한 자료를 다운받고, 해당 설정 환경과 같은 버추얼 컨테이너를 컴퓨터에 만들 것이다.

특징

  • Docker 컨테이너들은 독립적이다.
  • 한 개의 서버에 각기 다른 많은 수의 컨테이너를 가질 수 있다.
    • Python/Django 컨테이너, Node.js 컨테이너, Java/Spring 컨테이너..
  • Docker 덕분에 많은 컨테이너를 관리할 수 있다.
    • Java 컨테이너에 사람들이 많이 들어온다면 같은 서버에서 컨테이너를 생성하고 복제하면 된다.
    • 매번 다시 서버를 구입하고, 환경을 설정하고, 시작하는 복잡한 과정을 거치지 않아도 된다.

DockerFile

  • DockerFile이란 Docker Image를 만들기 위한 여러 가지 명령어의 집합이다.
  • 배경: AWS에서는 AMI(Amazon Machine Image) 형태로 이미지를 관리하고, Docker에서는 Docker Image 형태로 이미지를 관리한다. 보통 생성된 이미지를 통해 OS를 실행하게 되고, 실행된 OS에서 요청에 따라 설정을 변경하고, 이를 통해서 다시 이미지를 재생성한다. 그러나 시간이 지나며 이미지가 쌓이게 되면서, 무엇이 변경되었는지 알 수 없는 상태가 된다. 이미지 내용도 확인하고 버전 관리까지 해야 하기 위해서 이미지 내용을 코드화하는 도구를 사용한다. 여기에는 ansible, puppet, terraform, packer 등의 도구가 있고, 그 중 하나가 Docker File 이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 기반으로 할 이미지(베이스 이미지)를 가져온다.
FROM ubuntu:14.04 
# 작성자의 정보를 가져온다
MAINTAINER Hayeon Kim "hayeon17kim@gmail.com"
# RUN이라는 명령어를 통해 쉘 스크립트를 실행한다.
RUN apt-get update
# 도커 빌드 중에는 키보드를 입력할 수 없기 때문에 -y 옵션을 넣어준다.
RUN apt-get install -y nginx 
# 이후 CDM 명령어가 실행할 경로로 먼저 이동해준다.
WORKDIR /etc/nginx 
# nginx를 백그라운드로 실행한다.
CMD ["nginx", "-g", "daemon off;"] 
# 80번 포트를 오픈하여 웹서버에 정상적으로 접근할 수 있게 해준다. 
EXPOSE 80 
  • FROM: 베이스 이미지는 반드시 지정해주어야 하며, 버전 정보는 latest 보다는 구체적인 버전을 지정해주는 것이 좋다.
    • FROM <image>:<tag>
  • RUN: 직접적으로 쉘 스크립트 내에서 실행될 명령어 앞에 적어준다.
    • RUN <command>
  • CMD: 도커가 실행될 때 실행할 명령어를 정의해준다.
    • CMD [“executable”, “param”, “param]
    • CMD nginx라고 입력하면 nginx 서버를 구동시키게 된다.
  • WORKDIR: 이후 명령어가 작업할 디렉토리로 이동한다. 각 명령어는 줄마다 초기화가 되기 때문에 같은 디렉토리에서 계속 작업하기 위해서 WORKDIR을 사용한다.
    • WORKDIR /path
  • EXPOSE: 공개하고자 하는 포트를 지정해준다.
    • EXPOSE <port>

Docker Image

docker-process 출처: [Container 시리즈] 03. Docker File, Docker Image - 도커파일 및 이미지에 대하여

  • 도커는 Dockerfile이라는 파일로 이미지를 만든다. Dockerfile 에는 소스와 함께 의존성 패키지 등 사용했던 설정 파일을 버전 관리하기 쉽도록 명시되어 있다.
  • 완성된 이미지를 push 명령어를 통해 이미지 저장소인 Docker Hub에 업로드한다.
  • Docker Hub는 Github와 유사한 서비스로, 버전 관리 및 배포가 가능하다.
  • 업로드된 이미지는 pull 명령어를 통해 각 서버에서 다운받아 사용할 수 있다.
  • 특정 프로세스를 실행하기 위한 (컨테이너 생성(실행)에 필요한) 모든 파일과 설정값(환경)을 지닌 것으로, 더 이상의 의존성 파일을 컴파일하거나 이것저것 설치할 필요 없는 상태의 파일을 의미한다.
  • 도커 이미지의 용량은 보통 수백MB ~ 수GB가 넘는다. 그러나 가상머신의 이미지에 비하면 적은 용량이다.
  • 이미지는 상태값을 가지지 않고 변하지도 않는다.
  • 하나의 이미지는 여러 컨테이너를 생성할 수 있고, 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아 있다.

Docker Container

이미지를 실행한 상태로, 응용 프로그램의 종속성과 함께 응용 프로그램 자체를 패키징 or 캡슐화하여 격리된 공간에서 프로세스를 동작시키는 기술이다.

docker-container 출처: Understanding Layered Architecture of Docker Container Images

  • 컨테이너는 이미지 Layer에 읽기/쓰기 Layer를 추가하는 것으로 생성/실행된다. 여러 개의 컨테이너를 생성해도 최소한의 용량만 사용되며, 바뀐 부분을 읽기/쓰기 Layer에 적는다.
  • 컨테이너를 삭제했다는 것은 컨테이너에서 생성한 파일이 사라진다는 것을 말한다. (DB로 따지면 그동안 쌓였던 데이터가 모두 사라진다는 것과 동일하다.)
  • 한 서버는 여러 개의 컨테이너를 가져도 상관 없으며, 컨테이너는 각각 독립적으로 실행된다.
  • 컨테이너는 커널 공간과 호스트OS 자원(시스템 콜)을 공유한다.

요약

  • 원하는 개발 환경을 Dockerfile에 저장하면 docker는 이를 원하는 어떤 머신에든 해당 환경을 시뮬레이션 해준다.
  • 이런 환경은 각기 독립적으로 존재하기 때문에 어떤 환경이든 모듈 식으로 관리할 수 있다.
  • Python 서버, Java 서버, DB 서버 등 추가적으로 구입할 필요가 없다. 모든 독립적인 운용은 Docker 하나로 충분하다.

Reference

This post is licensed under CC BY 4.0 by the author.

🐥 주니어 성장일기: 2021.05.01

시스템 디자인 개념정리: Latency, Throughput, CDN, Availability

Loading comments from Disqus ...