Search
🤖

Inception

Created
2022/09/05 05:25
Updated
2022/09/07 14:36
Tags
Circle 04
Virtual Machine
Docker
System
Author
Created
Updated
mcha(Min-jae Cha)
2022. 09. 05.
2022. 09. 07.
이 과제의 목적은 도커(Docker)를 사용하여 시스템 관리에 대한 지식을 넓히는 것이다.

1. 하이퍼바이저(Hypervisor)

하이퍼바이저VM(Virtual Machine)생성하고 구동하는 소프트웨어이다. VM을 구동하기 위한 기존의 PC를 호스트(Host), VM게스트(Guest)로 명명한다. 호스트 PC에서 VM한 개가 아닌 여러 개VM이 실행 될 수 있는데 이를 가능하게 하는 것이 하이퍼바이저이다.
하이퍼바이저소프트웨어임과 동시에 이렇게 여러 개의 VM을 실행할 수 있는 논리적 플랫폼이다. 하이퍼바이저를 가상화 머신 모니터(Virtual Machine Monitor) 또는 가상화 머신 매니저(Virtual Machine Manager)라고도 부른다.
하이퍼바이저두 가지 유형으로 나뉘는데 이 유형은 다음과 같이 분류된다.
Native / Bare Metal hypervisor
하이퍼바이저호스트에서 직접 실행되어 하드웨어를 제어하고 게스트OS를 관리
여기서 호스트와 호스트 OS는 다르다. HardwareHyperVisorVirtual Machine(Guest)Guest OS
Host hypervisor
하이퍼바이저Host OS 위에서 실행되는 유형. Guest OSHost OS를 분리하고 Guest OSHost OS프로세스(Process)로 작동된다.
여기서 호스트와 호스트 OS는 다르다. HardwareHost OSHyperVisorVirtual Machine(Guest)Guest OS

2. Docker

도커(Docker)어플리케이션을 신속하게 구축, 테스트배포할 수 있는 소프트웨어 플랫폼이다.
도커소프트웨어( i.e. 어플리케이션 )컨테이너(Container)라는 표준화된 유닛으로 패키징한다.
도커를 사용하면 PCOS환경에 구애받지 않고 애플리케이션신속하게 배포확장할 수 있다.
도커VM(Virtual Machine)은 다르다.
VM서버 하드웨어를 가상화하는 방식을 채택하지만 컨테이너서버 운영체제(OS)를 가상화한다.
도커는 소프트웨어가 패키징 되어 있는 하나의 유닛인 컨테이너실행하고 관리하기 위한 운영체제이다.
0. 도커(Docker)와 VM(Virtual Machine)의 작동 방식
1. 도커(Docker)와 VM(Virtual Machine)의 작동 방식
도커의 작동방식
소프트웨어 패키지인 컨테이너를 동작시키기 위해 도커는 격리 환경을 생성하여 서로의 실행 환경을 구분한다. 설명하는 방식은 다를 수 있지만 중요한 점은 도커OS 수준에서 가상화를 진행한다는 점이다. VM하드웨어 수준에서 가상화를 진행하며 보다 많은 메모리를 소비한다. 결과적으로 도커 그리고 컨테이너는 VM보다 경량화 되어 있다.

3. Container

컨테이너운영체제(OS) 수준의 가상화 기술이다. 도커는 이 컨테이너를 격리된 환경에서 실행하는데 앞서 말한 것과 같이 하드웨어를 가상화하는 VM과 다르게 커널을 공유하고 OS 수준에서 가상화를 진행하기 때문에 실행 속도가 매우 빠르고 성능 상의 손실이 거의 없다고 알려져있다. 이 격리된 환경을 구현하기 위해 namespace 그리고 cgroup(Control Group), 루트 디렉토리 격리 등의 개념을 사용한다.
컨테이너Host에 종속된 것이 아닌 독자적인 실행 환경을 갖고 있다 이런 실행 환경을 포함한 것을 도커 이미지라고 한다. 컨테이너는 이 이미지를 실행한 상태이며 이미지는 변하지 않고 변하는 값은 컨테이너에 저장된다. 따라서 같은 이미지로 여러 개의 컨테이너를 실행할 수 있다.
다시, 위에서 언급 했던 것과 같이 도커를 사용하는 이유는 ‘PC나 OS에 종속받지 않고 빠르게 구현 및 테스트를 진행하기 위해서’라고 했다. 따라서 종속받지 않고 어느 환경에서나 이러한 도커의 장점을 살리기 위해서는 Host와 분리된 소프트웨어 패키지만의 환경이 반드시 필요하다. 이 환경 구성이 컨테이너이다.
결과적으로 독립적인 환경컨테이너높은 이식성을 갖고 상태를 갖고있지 않는 성질(Stateless) 때문에 같은 Docker Engine 위에서 돌아가는 컨테이너에 영향을 미치지 않는다. 그리고 재사용성이 높은 장점 또한 갖고 있다.
컨테이너의 종류는 두 종류로 나뉜다.
Type
Description
System container
컨테이너 기술을 활용하여 OS 위에 하드웨어 가상화 없이 운영체제를 실행. 다수의 프로세스같은 환경을 공유하는 것을 목표로 삼는다. 대표적인 예로는 LXC(Linux containers)LXD(Linux distributions)가 있다.
Application container
컨테이너 기술을 활용하여 하나의 프로세스(컨테이너, 어플리케이션)를 실행하는 것을 목표로 하는 컨테이너. 대표적인 예로 도커가 있다.

4. Docker compose

여러 개의 컨테이너로 이루어진 서비스를 구축, 실행하는 순서자동으로 지정, 하나로 통합하여 간단하게 관리하는 도구.
docker-compose.yml 파일은 컨테이너의 실행 옵션을 미리 정의한 문서이다. 이 파일을 통해 한 번의 실행으로 설정을 읽어들여 모든 컨테이너를 실행시키는 것이 가능하다.

5. Docker file

도커 파일컨테이너를 만들기 위한 시작 단계라고 할 수 있다. 위에서는 소프트웨어가 패키지화 되어있는 컨테이너에 대해서만 언급했지만 사실 컨테이너가 만들어지기 위해서는 도커 이미지(Docker image)가 필요하다. 이 전에는 도커 이미지를 만들기 위한 준비물이 필요한데 바로 이 준비물도커 파일(Docker file)이다.
도커 컨테이너 구성까지의 과정
Docker file → Build → Docker Image → Run → Docker Container
Docker Container를 만들기 위해서는 Docker Image가, Docker Image를 만들기 위해서는 Docker file이라는 준비물이 필요하다. 이 항목의 제목도 Docker file인 것 만큼 도커를 실행시키기 위해서는 Docker file필수적이고 아주 중요한 재료이다.
Docker file도커 이미지를 생성하기 위해 작성하는 파일이다. 다시 말해 도커 컨테이너설치해야 하는 소프트웨어, 코드, 명령어 등을 기록한 파일이다.
Dockerfile은 아래 문법(명령문)을 따라 작성된다.
# Comment # INSTRUCTION의 대소문자는 구분하지 않으나 보통 구분을 위해 대문자로 쓰인다. INSTRUCTION(명령) argument(인자)
Docker
복사
FROM
# Prototype FROM <base-image> FROM <base-image>:<tag> # Example FROM ubuntu:latest FROM ubuntu:16.04 FROM node:16
Docker
복사
도커 파일을 통해 작성한 도커 이미지는 처음부터 모든 패키지의 묶음으로 구성된 것이 아니다.
다시 말해 Dockerfile을 빌드해 모든 패키지가 한 번에 설치된 것이 아니라 top-down 방식으로 여러 개의 패키지가 층(Layer)으로 쌓여져 있는 형태이다. 이 Layer의 기반이 되는 층이 필요한데 이 기반층을 불러오고 지정하는 명령이 FROM 명령어이다. 보통 이 FROM 명령어는 Dockerfile최상단에 위치한다.
WORKDIR
# Prototype WORKDIR <directory> # Example WORKDIR ~/Desktop
Docker
복사
Shellcd와 같이 디렉토리를 이동하는 명령문이다. WORKDIR 이후의 명령문은 해당 디렉토리에서 수행된다.
RUN
# Prototype # 0. 쉘을 거치지 않고 직접 실행 RUN ["<command>", "<param-1>", "<param-2>"] # 1. 디폴트 쉘을 사용하여 실행 # -. 디폴트 쉘은 ["/bin/sh", "-c"] 형식 RUN <whole-commands> #Example RUN ["echo", "Hello World"] RUN apk add curl RUN npm install --silent
Docker
복사
Docker Image 안에 패키지를 설치하기 위한 용도로 사용.
ENTRYPOINT
# Prototype ENTRYPOINT ["<command>", "<param-1>", "<param-2>"] ENTRYPOINT <whole-commands> # Example ENTRYPOINT ["npm", "start"] ENTRYPOINT ["python", "manage.py", "runserver"]
Docker
복사
ENTRYPOINT 명령문은 이미지컨테이너실행할 때 항상 실행되어야 하는 커맨드를 지정할 때 사용된다.
CMD
# Prototype CMD ["<command>", "<param-1>", "<param-2>"] CMD ["<param-1>", "<param-2>"] CMD <whole-commands> # Example CMD ["/bin/df", "-h"] CMD ["index.js"] ENTRYPOINT ["node"] CMD ["index.js"]
Docker
복사
CMD 명령문은 ENTRYPOINT같이 쓰이거나 단독적으로 쓰일 수 있는데, ENTRYPOINT와 비슷하게 이미지를 컨테이너로 실행할 때 기본으로 실행할 커맨드ENTRYPOINT에 파라미터를 지정할 때 사용한다.
CMD 명령문은 컨테이너가 실행될 때 딱 한 번 실행되며 만약 docker run 커맨드에 인자를 넘길 경우 CMD의 기능은 상실된다.
# node index.js 실행 $ docker run <docker-image> # node main.js 실행 $ docker run <docker-image> main.js
Shell
복사
EXPOSE
# Prototype EXPOSE <port> EXPOSE <port>/<protocol> # Example # 80/TCP 포트 리스닝 EXPOSE 80 # 9999/UDP 포트 리스닝 EXPOSE 9999/UDP
Docker
복사
EXPOSE 명령문은 네트워크 내에서 컨테이너로 들어오는 트래픽을 리스닝하는 포트프로토콜을 지정하기 위해 사용된다. 프로토콜은 TCPUDP가 있으며 둘 중 하나를 선택할 수 있다. 지정하지 않으면 TCP가 기본으로 설정된다. 이 EXPOSE로 지정된 포트와 프로토콜은 컨테이너 내에서만 유효하며 만약 Host에서 접근을 가능하게 하려면 docker run-p 옵션으로 포트포워딩을 해주어야한다.
COPY, ADD
# Prototype COPY ["<src>", "<dest>"] COPY <src> <dest> # Example COPY package.json package.json
Docker
복사
Host디렉토리파일Docker Image의 파일 시스템으로 복사하기 위해 사용한다. 만약 상대경로를 사용할 경우 현재 WORKDIR이 어디인지 참고하여 경로를 지정해야한다.
ADD 명령문은 강력한 COPY라고 할 수 있다. 특수한 파일을 대상으로 할 때 ADD 명령을 사용하며 여기서 말하는 특수한 파일일반 파일 뿐만 아니라 압축 파일이나 네트워크 상의 파일을 포함한다.
ENV
# Prototype ENV <Key> <Value> ENV <key>=<Value> # Example ENV NAME mcha
Docker
복사
환경변수를 설정하기 위해 사용하는 명령문으로 이미지를 빌드할 때 사용 될 뿐만 아니라 실행 중인 컨테이너 어플리케이션에서도 접근할 수 있다.
ARG
# Prototype ARG <Name> ARG <Name>=<Default-Value> # Example # 01. ARG 지정 ARG port # 02. Shell에서 build 실행 $ docker build --build-arg port=8080 . # 03. ARG 사용 CMD start.sh -h 127.0.0.1 -p ${port}
Docker
복사

6. Virtual Machine Setting

약 20번간의 재설치 끝에 GUI 환경 설정에 성공했던 방법을 공유합니다.
OS
Debian Buster
Version
debian-10.12.0-amd64-netinst
Storage
15GB
Subject에서 제시했던 부분 중 OS에 대한 내용은 Container OS 부분이었다. 위의 설명 중 FROM 명령에 들어가는 부분이었는데 Alpine Linux 또는 Debian Buster에 레이어를 올리는 지시사항이 있었다.
Virtual Machine OSDebian을 선택한 이유는 이전 Born2beRoot에서 사용해 본 경험이 있었고 친숙한 운영체제였기 때문이다. 그리고 타 OS와 비교하여 용량이 비교적 적어 적용하기에 적합하다고 판단하였다.
Debian은 현재 Stable 버전은 11버전까지 나와있다. 하지만 최근 버전이 아닌 10버전을 사용했는데 그 이유는 설치에 있어서 오류가 발생했기 때문이다. 평가에 있어서 GUI(Graphic User Interface)가 필수적이라고 느껴져 GUI로 설치하던 중 Installation step failed 오류가 지속적으로 발생하였다.
Installation step failed error
똑같은 과정을 Buster(10버전)에서 진행했을 때에는 문제 없이 정상적으로 작동되어 10버전을 사용하였다. 아래는 설치 과정을 소개한다.
VM 기본 설정
Virtual Machine이름, 경로, 타입버전을 설정한다.
Virtual Machine Memory size
가상 머신의 메모리를 설정한다. 4096MB(약 4GB)로 설정하면 적절할 것 같다.
Virtual Machine Hard disk
→ Create a virtual hard disk now
→ VDI (VirtualBox Disk Image)
→ Dynamically allocated
→ 15.00GB
여기서 15GB로 설정한 이유는 백업과 관련이 있다. 현재 사용하고 있는 구글 드라이브에서 기본적으로 제공하는 클라우드 크기는 15GB이다. 이보다 더 많은 Storage를 사용하면 좋겠지만 그렇게 많이 필요할 것 같진않다. 추가적으로 위에서 발생한 Installation step failed는 이 Storage를 증가시켜주면 되는데 그 이유는 파티셔닝과 관련이 있다. Inception은 파티셔닝에는 크리티컬하게 주어진 문항이 없어 개인이 주도적으로 파티셔닝을 해도 되고 하지 않아도 된다. 하지만 CLI를 사용했던 B2B와는 달리 이 과제는 GUI를 사용해야하기 때문에 이 패키지가 설치될 수 있는 공간을 확보해야한다.
Installation
디스크 사이즈를 설정한 후 만든 VM을 실행시킨다. 그 후 다운로드 받은 iso 파일을 설정하고 아래 단계까지 진행한다.
Graphical installInstall이 있는데 Graphical install을 한다고 해서 GUI가 설치되지는 않는다. GraphicalGraphical이 붙지 않은 Install의 차이는 설치 과정에서 마우스를 사용할 수 있는지 없는지의 차이이다. 따라서 Install 메뉴를 사용하여 설치하였다.
Select a language
언어 선택 단계이다. Default로 선택 되어있는 English를 선택하고 진행한다.
Select a location
맨 아래의 otherAsiaKorea, Republic of 선택
Configure locales
United Stated - en_US.UTF-8 선택
Configure the keyboard
하단의 Korean 선택
Hostname
Hostname 설정
Domain name
<login>.42.fr로 설정 <login>intra ID
Root password
루트 패스워드 설정
Default user
기본 유저 설정. Intra ID를 기입하고 진행하였다.
→ User password 설정
Partition setting
Guided - use entire disk 선택
LVM으로 유동적으로 관리할 필요가 없을 것 같기 때문 필요시 선택
→ 디스크 선택
Partition type
세 가지 옵션이 있는데 마지막 옵션용량이 충분하지 않으면 선택하는 것을 추천하지 않는다.
Separate /home partition 옵션 선택
/home, /var 그리고 /tmp까지 가장 필수적인 파티션만 자동으로 구분해주는 옵션인데 용량이 충분하지 않으면 GUI 패키지가 정상적으로 설치되지 않는다. 따라서 /home 파티션 또는 파티션 없이 하나의 파티션에 모든 파일을 저장하는 방식을 선택하는 것을 추천한다. 유동적으로 선택하면 된다.
Finish partitioning
Finish partitioning and write changes to disk 선택
→ <Yes> 선택
Scan
CD나 DVD를 추가적으로 스캔하지 않을 것이기 때문에 <No> 선택
Mirror site region
패키지를 다운받을 미러 사이트의 위치를 선택한다. Korea, Republic of 선택
deb.debian.org 선택 위에 ftp.kaist.ac.kr를 사용해보았지만 속도가 많이 느리다.
Proxy
프록시 정보가 없으므로 빈 칸으로 놔두고 <Continue>
Additional
<No> 선택
Package
1.
Debian desktop envirionment
2.
print server
3.
SSH server
4.
standard system utilities
Debian desktop envirionmentGUI 환경을 사용하기 위한 기본적인 환경 패키지를 포함한다.
하위 메뉴에 GNOME이 있는데 이 1번 패키지를 설치하면 GNOME도 같이 설치된다.
print server는 말 그대로 인쇄기를 위한 서버이다. 선택하여 설치하면 된다.
GRUB
<Yes> 선택
Install GRUB
설치 위치 지정 /dev/sda 선택
Restart Virtual Machine
<Continue> 선택
Finale
lsblk 명령어를 통해 현재 파티셔닝이 어떻게 되어있는지 확인할 수 있다. df 명령어를 통해 파일 시스템을 얼마나 사용하고 있는지 알 수 있다. 현재 /dev/sda1 파일 시스템인 루트 디렉토리84%의 사용량을 기록하고 있다. 거의 가득 찬 상태인데 이 부분은 추후에 개선이 필요할 수 있다.

Reference