Updated:

 위와 같은 상황에서 software entity that contains same and all dependencies 가 필요하다.

Docker

Docker는 Container engine을 만든 대표적인 회사로서 docker사의 container engine을 지칭한다. 즉, container를 실행시키는 platform이다.

  • Container engine: A set of Platform as a Service(PaaS) that uses OS level virtualization to deliver software packages called containers  Container는 GB size인 VM image를 50MB size정도로 Container image를 줄일 수 있었다.

Docker image는 화물을 실어 나르는 컨테이너 배와 동일한 개념으로 임의의 다양한 화물들을 패키지로 묶어 일정한 규격(인터페이스)의 컨테이너에 적재하여 보내면 컨테이너를 내린 항구(VM)에서 규격 컨테이너를 부리고(discharge, container engine) 원하는 작업을 수행(app 실행)하는 개념이다.

Container

Container는 App과 app 실행에 필요한 모든 dependency를 묶은 package이다. 지정된 OS 위에서는 container가 실행될 수 있도록 container engine을 기계에 장착한다. 결국, container engine은 OS level에서의 vitrualization을 app에 제공하는 것이다(Container engine은 OS 별도로 제공된다, OS level virtualization).
 App을 container로 만드는 것을 containerization이라 하며, app은 어떤 dependency 모듈을 호출하므로 container는 container engine을 통해 해당 system call 등을 호출할 수 있도록 container 엔진과 인터페이스가 되도록 만들어진 패키지이며 container 엔진은 OS 별도로 제공되어 장착한다. 당연히 container 엔진은 H/W 기계는 물론 VM 위에 장착되며 VM의 OS 종류에 따라서 엔진이 제공되어야 한다.
 만일 host 기계의 OS와 다른 OS위에서 containerized app을 실행하려면 hypervisor 위에 target OS용 container 엔진을 장착한다. 이와 같은 경우에도 hypervisor 위에 VM을 설치하여 app을 실행하는 것보다 hypervisor 위에 container 엔진을 설치하고 실행하는 것이 메모리 점유가 적고 실행 속도가 빠르다.

Docker container commands

Docker Container image는 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일, sytem tools and other platforms 을 묶는 형태이다. 다시 말해, 특정 프로세스를 실행하기 위한(컨테이너 생성, 실행에 필요한) 모든 파일과 설정값(환경)을 지닌 것으로, 더 이상의 의존성 파일을 컴파일하거나 이것저것 설치할 필요 없는 상태의 파일을 의미한다. Image is a template that acts as a set of instructions to build a Docker container. The image shares the OS kernel of host machine(image NEVER has OS kernel inside).
 A Container imageis complied from file system layers built onto a parent or base image reusing various SW components, so the user does not create everything from scratch for every project. 즉, Docker container는 image를 실행한 상태로, 응용프로그램의 종속성과 함께 응용프로그램 자체를 패키징 또는 캡슐화하여 격리된 공간에서 프로세스를 동작시키는 기술이다. 기본적으로 하나의 컨테이너에는 하나의 프로세스만 실행되도록 image를 만드는 것이 권장되며, 두 개 이상의 프로세스가 필요한 app의 경우 다수의 container를 만들어서 사용한다. 그러나 필요하다면 하나의 컨테이너에 다수의 프로세스가 실행되도록 만들 수 있다.

  • sudo apt-get update
  • sudo apt install docker.io
    • sudo apt-get install docker.io: 두 명령어는 거의 동일한 명령어이지만, apt명령어는 사용자 친화적인 인터페이스를 제공하고 apt-get보다 조금 더 직관적이며 편리한 기능을 제공한다.
  • docker –version
  • docker –help

  • docker run hello-world
    • 작동하지 않는다.
  • cat /etc/group
    • docker:x:112: 가 빈 상태임을 볼 수 있다.
  • sudo usermod -aG docker $USER
    • -aG: usermod 명령어에 대한 옵션, -a는 append의 약자로, 기존 그룹 맴버십에 새 그룹을 추가한다는 의미이고, -G는 새 그룹의 이름을 지정한다.
    • docker: 사용자를 docker 그룹에 추가한다는 의미로, Docker 그룹에 속한 사용자는 Docker를 사용하여 컨테이너를 실행할 수 있다.
    • $USER: 현재 로그인한 사용자의 이름을 나타낸다.
  • cat /etc/group
    • docker:x:122:ubuntu가 추가되었다.

  • docker run hello-world
    • logout하고 다시 login하니 작동한다.
  • docker images

  • docker pull ubuntu
    • 최신 버전의 우분투 이미지를 내려받아 컨테이너를 생성한다.
  • docker images

  • docker run -it -d ubuntu
    • -it: 컨테이너를 대화형으로 실행하고 터미널에 연결하도록 지정, -i: interactive, -t: tty(terminal)
    • -d: 컨테이너를 백그라운드(detached) 모드로 실행하도록 지정
  • docker ps
    • 현재 실행 중인 Docker 컨테이너의 목록을 표시한다.

  • docker exec -it c5b20bc9259a bash
    • 실행 중인 Docker 컨테이너에 셸을 실행하여 해당 컨테이너에 대한 대화형으로 접속하라는 명령어이다.
    • 이 명령을 실행하면 지정된 컨테이너에서 bash 셸을 실행하게 된다.
    • ubuntu container 안으로 root로서 진입한 것을 볼 수 있다.
  • mkdir test
  • cd test
  • ls -al
  • docker –version
    • 확인 차원에서 시도했다. container에는 docker가 설치되어 있지 않다.
  • exit
    • container에서 나올 때 하는 명령어
    • container에서 EC2 기계로 나온 것을 확인할 수 있다.

  • docker ps
  • docker stop c5b20bc9259a
    • docker stop : 컨테이너 내부의 프로세스에 SIGTERM 신호를 보내어 컨테이너가 자연스럽게 종료될 수 있도록 한다.
    • docker kill : 컨테이너 내의 프로세스에 SIGKILL 신호를 보내어 프로세스를 즉시 중지한다.
  • docker ps
  • docker ps -a
    • 현재 실행 중인 Docker 컨테이너뿐만 아니라 중지된 모든 Docker 컨테이너의 목록을 표시한다.
    • 만약 컨테이너를 삭제하고 싶다면, 해당 컨테이너 ID를 확인하고 docker rm 명령어를 사용하면 된다.

  • docker run -itd ubuntu
  • docker ps
  • docker rm b7e9dabbdba0
    • 컨테이너가 실행 중이지 않을 때에만 컨테이너를 제거한다. 컨테이너가 이미 중지된 상태여야 하며,그렇지 않으면 제거되지 않는다.
  • docker rm -f b7e9dabbdba0
    • -f 옵션을 사용하여 컨테이너를 강제로 제거한다. 실행 중인 컨테이너든, 중지된 컨테이너든 상관없이 해당 컨테이너를 강제로 제거한다.
  • docker ps
  • docker images
  • docker rmi 7af9ba4f0a47
    • 해당 이미지가 현재 사용 중이지 않아야 하며,이 이미지를 기반으로 한 컨테이너가 없어야 삭제할 수 있다.
  • docker rmi -f 7af9ba4f0a47
    • -f 옵션을 사용하여 이미지를 강제로 삭제한다. 해당 이미지를 사용중이더라도 강제로 삭제된다.
  • docker images

  • docker ps
  • docker images
  • docker run -itd –name=myubuntu ubuntu
  • docker exec -it myununtu bash

  • apt-get update
  • apt-get install -y apache2

  • cd /var/www/html
    • default root of apache2
  • ls -al
  • cat index.html
    • default ubuntu apache page

  • vim 1.html
  • apt-get install -y vim
  • vim 1.html
<html>
  <head>
    <title>My First Web Service</title>
  </head>
  <body>
    <div style ="text-align:center">
      <h2 style="color: dodgerblue"> Hello, Hongik!</h2>
      <h1>Welcome to DevOps world!</h1>
    </div>
  </body>
</html>
  • cat 1.html
  • exit

 이후 인바운드 규칙을 추가해 주었다.

  • docker exec -it myubuntu bash
  • service apache2 status
  • service apache2 start
  • service apache2 statue
  • exit

Dockerfile

Dockerfile은 Docker image를 만들기 위해 실행하는 command 들을 모아 둔 text 파일이다. docker build 명령을 사용하여 docker image를 만드는 가장 일반적인 방법은 dockerfile을 작성하고 dockerhub애 배포하는 것이다. Docker image의 크기는 매우 크지만 dockerfile은 단순 text 파일로서 크기가 작은 이점이 있다.

 지금까지의 docker container 작업 과정은 image - (run) → container - (exec) → inside the container - (do jobs) → (exit) → (commit) → save a new image이다. Dockerfile에 이러한 수작업 명령을 기재하여 자동화하는 것이다. 즉, Dockerfile은 docker image를 만들기 위한 모든 순차적인 명령들을 포함한 text 파일이다. Dockerfile의 기본 구문은 다음과 같다.

  • FROM: base image 지정
  • ADD <source> <destination in container>: 파일들 복사(copy)
    • ADD와 COPY는 서로 비슷하나 ADD는 <source>로 url을 사용할 수 있음
  • RUN: base image 위에 추가 SW 계층 설치
  • CMD: container 안에서 실행하려는 command
  • ENTRYPOINT: CMD와 유사
    • Docker는 /bin/sh -c를 default entrypoint로 하지만 -c (command 입력 option) 뒤에 입력할 command는 default로 지정된 것이 없다.
    • 우리가 사용하던 docker run -it ubuntu bash의 예에서는 entrypoint가 /bin/sh -c, image는 ubuntu, command는 bash이다.
    • docker run -it ubuntu <cmd>
      • <cmd>는 the entrypoint의 parameter
    • CMD에 비해 ENTRYPOINT는 내가 만든 image를 다른 사람이 run할 때 run이 시작될 때 다른 command를 입력하여 dockerfile의 CMD에 지정된 명령을 생략할 수 없게 할 때 사용한다.
  • ENV: container에서 사용할 environment 변수 지정

Docker volume

Container는 cgroups(control groups)에 의해 배정된 자신만의 OS 자원을 사용하며 다른 container의 OS와 별도의 자원을 사용한다. 즉, 다른 container와는 공유하지 않는 자신만의 DRAM 영역과 CPU 시간을 사용하도록 되어 있으며 디스크와 같은 persistent storage를 사용하지 않고 기본적인 in-memory 파일시스템을 사용한다. 즉, Container는 read-only app으로 사용하는 것이 기본이다.
 Container가 run 명령에 의해 시작될 때는 container의 filesystem은 read-only layer위에 read-write layer로 만들어진 virtual file system으로서 일단 container를 시작한 후 만들어진 파일은 container가 동작하는 동안에는 우리에게 익숙한 persistent file system에 저장된 것처럼 사용되지만 실제에서는 persistent 장치, 즉 디스크에 저장되는 것이 아니라 in-memory file system에 쓰이는 것이므로 container가 종료되면 사라진다. 그래서 동일한 image로부터 container를 다시 만들어보면 예전에 file system에 저장했다고 생각한 데이터는 온데간데 없이 사라진다.
 이러한 단점을 해소하기 위해 호스트 OS의 persistent 파일 시스템을 mount하여 container에서 사용할 수 있도록하는 container volume 기능이 제공 되지만, container의 장점 중 하나는 container들 사이에 file system을 통한 간섭이 없어서 보안이 뛰어나다는 것인데 volume가능은 잘못된 코딩 등에 의해 이러한 장점을 훼손시킬 수 있다.
docker volume create <volume name>으로 호스트 기계의 /var/lib/docker/volumes에 <volume name>의 docker volume을 만들고 docker run –mount souce=<volume name>, destination=<path in container> <image name> 명령을 통해 원하는 docker volume을 마운트하여 container에서 호스트 기계의 persistent 스토리지에 데이터를 저장할 수 있고 이를 이용하여 여러 컨테이너들 사이에서 persistent한 데이터를 공유할 수 있다.

  • 호스트 기계의 on-disk persistent filesystem을 컨테이너의 in-memory virtual filesystem에 mount하여 컨테이너가 종료되어도 데이터가 사라지지 않고 호스트 기계의 파일시스템에 저장되어 다시 동일 컨테이너가 시작되어 과거 데이터를 사용할 수 있도록 제공된 기능
  • DB를 사용하는 컨테이너의 경우에는 필수적이다.

Docker compose & Docker volume

Docker Compose는 단일 서버에서 여러개의 컨테이너를 하나의 서비스로 정의해 컨테이너의 묶음으로 관리할 수 있는 작업 환경을 제공하는 관리 도구이다(Docker Compose is a tool that was developed to help define and share multi-container applications). Compose를 사용하면, 단일 command로 서비스를 정의하는 YAML file을 만들 수 있고(With Compose, we can create a YAML file to define the services and with a single command), can spin eveything up or tear it all down.

  • Dockerfile은 하나의 container image를 build하는 단계를 기술한 파일이고, docker compose는 한 개 이상의 container를 규정하고 run하는 내용을 기재한 docker-compose.yml 파일을 실행, 중지, 제거하는 도구이다.

댓글남기기