컨테이너 기반 가상화 플랫폼 도커의 이해

Posted by yunki kim on September 13, 2021

1
docker run -it ubuntu:latest echo "hello world"
cs

  위 명령어를 입력하면 hello world가 출력이 된다. 하지만 이 hello world는 단순히 로컬에서 echo "hello world"를 통해 입력한 출력한 hello world와는 차이가 있다. 위 명령어를 실행을 하면 로컬이 아닌 우분투 최신 버전에서 hello world를 출력한다. 

  도커는 이미지를 통해 다양한 환경을 제공하고 이런 환경에서 실행되는 것을 컨테이너라 한다. 따라서 VMware와 같은 가상머신이라 생각할 수 있지만 여기에도 차이가 존재한다. 가상머신의 경우에는 소프트웨어를 통해 하드웨어를 가상화 한다. 하지만 컨테이너의 경우 하드웨어 가상화를 하지 않는다. 컨테이너는 하드웨어의 가상화 없이 격리된 환경에서 실행되는 프로세스이다. 

  리눅스에서는 다양한 프로세스를 격리시킬 수 있는 기능이 존재하는데 도커는 해당 기능들을 사용해 격리된 프로세스인 컨테이너를 만든다. 

이미지

  특정 프로세스를 실행하는 환경이다. 계층화된 파일 시스템을 사용하고 있고 이미지는 파일들의 집합니다. 따라서 프로세스가 실행되는 환경도 결국에는 파일들의 집합이다. 도커의 파일 시스템은 계층구조를 가진다. 여기서 하나의 계층 역시 이미지이며 이미지들이 모여 이미지가 생성된다. 이런 대부분의 레이어는 read only이기 때문에 쓰기를 하면 또 다른 하나의 레이어가 생성된다. 

 

이미지 파일 만들기

  우선 컨테이너에 저장된 데이터는 컨테이너 실생이 종료되면 사라진다. 따라서 반드시 사용해야할 데이터의 경우 레이어를 하나 만드는 방식으로 새로운 이미지로 만들어야 한다. 새로운 이미지를 만드는 방식은 간단하다. 현재 이미지화를 원하는 컨테이너가 실행중인 상태로  docker commit [container ID] [new image name] 를 실행하면 된다. 

  위의 과정으로 Dockerfile로도 실행할 수 있다. Dockerfile은 이미지 생성 과정을 기술한 dsl이다. 

1
2
3
4
5
6
7
#ubuntu:latest 이미지 파일에서
FROM ubuntu:latest
 
#RUN을 하면 FROM 으로 불러온 이미지에서 명령어 실행
RUN apt-get update
#실행 중 Y를 입력할 수 없기에 -y가 필요
RUN apt-get install -y git
cs

위와 같은 Dockerfile을 만든 후 'docker build -t ubuntu:git .' 이라는 명령어를 입력하면 현재 디렉토리에 ubuntu:git이라는 이미지가 생성된다. 

Dockerfile 명령어

1
2
3
4
5
6
7
8
9
FROM [image name] #베이스 이미지 지정
ADD [file] [file path] #파일 추가, 단 현재 디렉터리의 하위 디렉터리만 사용 가능
RUN [command] #명령어 실행, interactive한 명령어면 -y 사용
WORKDIR [directory] #RUN 명령어가 실행되는 디렉터리 변경
ENV [env value] [value] #환경변수 기본값 지정
EXPOSE [port] #컨테이너 실행 시 노출시킬 포트
CMD [command] #도커를 실행할 때 사용할 기본 명령어
cs

docker hub 사용하기

docker hub를 사용하면 자신이 만든 이미지를 관리할 수 있다. docker login을 통해 로그인을 하고 docker push [image name]을 입력하면 hub에 push가 된다. 여기서 image name은 자신의 계정 닉네임/이미지이름 형태여야 한다. 그 후 해당 이미지를 가져오고 싶다면 docker pull [image name]을 사용하면 된다. 

 

Docker image 자동 빌드, 배포

  CI/CD - 지속적 통합 및 전달. 빠르고 효과적으로 제품을 출시하기 위해 지속적으로 소스를 통합하고 빌드하고 테스트하고 배포하는 과정.

  도커를 이용해 제품을 배포하는 과정

    1. 소스저장소에 최신 소스를 저장

    2. 전체 소스를 다운로드

    3. 테스트

    4. Docker 이미지 만들기

    5. Docker 이미지 저장하기

    6. 애플리케이션 업데이트

  여기서 CI/CD를 하게 된다면 1번만 수동으로 하고 나머지 부분은 젠킨스 등을 활용해 자동으로 수행할 수 있다. 젠킨스는 빌드, 테스트, 코드 분석, 배포, 알람 등 다양한 기능을 제공한다. 기본적인 아키텍쳐는 하나의 master, 여러개의 agent로 이뤄진다. 빌드가 많이 이루어 질때 각 서버에 agent를 심고 master로 빌드를 해 master가 agent에게 분산해 빌드, 테스트를 수행한다. 또 한 커뮤니티가 잘 발달되 있다.