도커 실행해보기(Execute Docker)

이번 포스트에서는 도커로 서비스하는 과정을 실습해보도록 하겠다.

앞의 글에서도 설명 되어있듯이, 도커 가상화에서는 각자의 서비스 실행됨에 있어서

"운영체제 설치 > 소프트웨어 설치 > 서비스 ..."등의  빌드 과정이 필요없이

서비스만 단독적으로 실행이 가능하다는 점이 존재한다고 했다.

 

그 예시로 웹 개발, 서버에 관한 공부를 하는 분들에게는 익숙할 수 있는 웹 엔진 "NginX"

도커 컨테이너 가상화를 통하여 서비스하는 과정에 대한 실습을 진행해보았다.

 

 

* 실습환경 : Intel i7-1260P(AMD64) /  VMWare Workstation 16

** 네트워크 대역 : 192.168.100.0/24

*** 해당 실습에서 사용된 가상머신 : Ubunser(.99), CentOS7(.140)

**** 실습 중 "docker" 커맨드가 alias = "dkr" 로 사용되었음

 

 

● 도커를 활용한 웹 서비스

Docker NginX

먼저 Docker를 이용하여 웹 서비스를 제공해줄 가상머신(필자기준 Ubunser)에서

"sudo docker run -p 8080:80 -d --name "NewNgin" nginx:latest" 명령으로

"nginx:latest" 태그에 해당하는 도커 이미지가 로컬에 존재하지 않는다면 

Docker Registry에서 Pull하여 자동으로 실행되게 된다.

** Docker Registry는 로컬이 될 수도 있고, Docker Hub와 같은 네임드 레지스트리일 수도 있다.

 

"-p 8080:80" 옵션의 의미로는 현재 도커 위에서 실행되는 컨테이너에는 

각자의 IP주소를 부여받지 않았기 때문에 나의 호스트 머신(Ubunser)의 8080포트로 요청 전송 시,

컨테이너로 실행되는 웹 서비스로 Redirect 해주기 위해서 위와 같은 옵션이 사용되었다.

* 외부(External) 요청 포트번호는 임의적으로 지정해주어도 된다.

 

"--name [Name]" 옵션을 이용하여 새롭게 생성할 컨테이너에 이름을 부여하여 

보다 편리한 관리를 가능하게 해준다.

 

 

Docker NginX

"sudo ss -nltp | grep LISTEN" 명령어를 이용하여 도커 컨테이너(프로세스) 생성 시 지정한 포트가

LISTEN 상태가 되어있는 지 확인해본다.

 

 

Docker NginX

"sudo docker ps" 명령어를 이용하여 현재 실행되고 있는 컨테이너 목록을 확인할 수 있으며,

앞에서 생성한 "NewNgin" 컨테이너가 외부(External) ANY(0.0.0.0)로 부터 8080 포트로 요청 시 -> NginX(80)컨테이너가

응답할 수 있도록 Port Redirect가 설정된 채로 생성 되어있는 것을 확인해볼 수 있다.

 

 

Docker NginX

"firefox http://localhost:8080" 명령을 이용하여 우선 로컬(Ubunser)에서 먼저 접속을 시도해보면,

위의 그림과 같이 생성된 NginX 컨테이너가 정상적으로 응답하는 모습을 확인해볼 수 있다.

 

 

Docker NginX

다음으로 외부에서 접근 시에도 정상적으로 서비스가 이루어지는가를 확인하기 위해

별도의 가상 머신(CentOS7)에서 "firefox http://192.168.100.99(Ubunser의 주소):8080" 

입력하여 웹 사이트 요청을 진행했을 때에도 정상적으로 NginX의 Default 페이지가 출력되는 것을 확인해볼 수 있다.

 

 

● 도커 볼륨(Docker Volume)

도커에서 각종 이미지를 기반으로 한 컨테이너(APPs, OS, DB ...)가 실행될 때 해당 다양한 내용들에 대한

수정 / 변경이 발생하게 되는데, 실행되고 있는 컨테이너의 상태는 그저 메모리(Volatile)에 적재되어 실행되는

프로세스에 불과하기 때문에 작업이 종료되어 컨테이너를 삭제하게 되면 그간 작업했던 내용들도 함께 삭제가 된다. 

이런 부분을 보완하기 위해서 사용되는 것이 바로 컨테이너 <-> 호스트 간 저장공간을 공유하는 도커 볼륨이다.

 

 

Docker Volume

먼저 도커 볼륨의 동작 방식을 직접 확인해보기 위해서 임의의 경로에 index.html 파일을 생성해두었다.

 

Docker Volume

새로운 컨테이너 생성 시 공유될 볼륨을 지정한 상태로 진행

 

sudo mkdir /home/[UserName]/Desktop/website && su -c "echo \"<h1>This is Docker Site</h1>\" > /home/master/Desktop/website/index.html

# 컨테이너와 공유될 디렉토리를 새롭게 생성한 뒤, NginX에서 표현될 HTML 코드를 간단하게 작성한 뒤 저장


sudo docker run --name [ContainerName] -v ${pwd}:/usr/share/nginx/html:ro -p 10000:80 -d nginx:latest

# [ContainerName] 이름의 컨테이너를 생성하는 과정으로, 
# -v 옵션으로 상호간 연결시켜줄 디렉토리의 경로를 지정해준다.
# ${pwd} -> 현재 호스트(Ubunser)머신에서 작업중인 디렉토리를 공유하겠다는 의미이며,
# 경로지정은 상대적인 요소로 필자의 경우 현재 위치를 공유하기 위해 ${pwd} 환경변수를 이용함
# :/usr/share/nginx/html -> 컨테이너의 ~html 디렉토리에 공유된 데이터 볼륨을 마운트한다는 의미로,
# 현재 ${pwd} 경로에는 index.html 파일이 저장 되어있다.
# :ro -> 읽기 전용(Read Only)로 실행되는 것을 의미한다.
# -p 10000:80 -> 외부(External) 요청 포트번호는 임의의 숫자 10000을 부여해주었다.
# 도커 이미지는 nginx:latest를 사용하였다.

 

 

Docker Volume

"firefox http://localhost:10000" 를 입력하여 접속 시, 

호스트머신에서 생성 후 호스트머신에 저장되었던 HTML 문서가

도커 볼륨 설정으로 인해 컨테이너에서 해당 웹 페이지를 서비스 해주는 것을 확인해볼 수 있다.

 

 

Docker Volume

좀 더 직관적으로 구조를 확인해보기 위해서 

"sudo docker exec -it [Container Name] bash"를 입력하여 실행되고 있는

컨테이너의 Shell 로 진입한 뒤, 컨테이너에서 파일을 생성한 뒤 저장을 했을 때,

호스트 머신의 저장공간에 컨테이너 안에서 생성한 파일이 저장 되어있는 것을 확인할 수 있었다.

 

 

▼ Docker & Bootstrap Template을 활용한 반응형 웹 페이지 서비스

Docker & Bootstrap

웹 서비스를 제공할 호스트 머신(Ubunser)에서 

"firefox http://startbootstrap.com/"를 입력하여 해당 Bootstrap 웹 사이트에 진입해본다.

 

Bootstrap은 유료 및 무료(MIT License) 디자인 템플릿을 제공해주는 프레임워크로,

공개 되어있는 반응형 웹 페이지를 컨테이너에 적재하여 서비스하는 것을 구현하고자 사용하였다.

 

해당 사이트 진입 후 본인 입맛에 맞는 공개된 웹 페이지의 코드를 다운로드하여 

호스트 머신에 저장을 한 뒤 실습을 진행한다.

 

해당 포스트에서는 첨부 자료가 생략되었지만 템플릿 다운로드 후,

~/Download 경로에 저장된 아카이브를 "unzip" 으로 해제한 뒤,

 

기존 도커 볼륨으로 사용중인 "/home/master/Desktop/website/~" 디렉토리 아래로 옮겨주었다.

* 필자 기준

 

 

Docker & Bootstrap

sudo docker run --name [ContainerName] -v ${pwd}:/usr/share/nginx/html:rw -p 8080:80 -d nginx:latest

# -v{pwd} -> 컨테이너와 공유할 위치를 지정
# :/usr/share/nginx/html -> NginX 컨테이너의 마운트포인트
# :rw -> 마운트포인트에 Read, Write를 허용
# 8080:80 -> Redirect 할 Port를 명시
# -d -> 컨테이너를 Daemon(백그라운드) 형태로 실행
# 컨테이너 생성에 사용할 도커 이미지를 지정

위 처럼 Bootstrap 템플릿이 저장 되어있는 디렉토리를 컨테이너와 공유하는 컨테이너를 생성

 

 

Docker & Bootstrap

sudo dkr run --name [Old Container Name] --volumes-from [New Container Name] -p 8081:80 -d nginx:latest

# 위 명령어는 앞에서 먼저 생성된 A(Old) 컨테이너가 도커 볼륨으로 사용중인 호스트 머신의 디렉토리를 
# B(New) 컨테이너에서도 동일한 디렉토리를 사용한다는 의미로, --volumes-from ~ 옵션이 그 역할을 한다.
# Port Redirect는 기존의 컨테이너와 충돌이 발생하지 않도록 한다.

기존 도커 볼륨이 설정 되어있는 컨테이너와 같은 디렉토리를 공유할 수 있도록 공유 경로를 참조하여 컨테이너를 생성할 수 있다.

 

 

Docker & Bootstrap

호스트 머신에서 컨테이너의 정상 작동 여부를 확인하기 위해 

"firefox http://localhost:8081(두 번째로 만든 컨테이너)" 로 웹 사이트를 요청하여 

위의 그림처럼 Bootstrap Template 에서 다운받은 양식의 웹 페이지가 출력 된다면 정상적으로 실행되었음을 확인할 수 있다.

 

물리적인 서버에 웹 서버를 구축 ~ 서비스 하는 과정에 비하면 훨씬 간단하고 가볍게 진행되는 것을 확인해볼 수 있었다.

그에 따른 문제점도 분명히 존재 하겠지만, 전적으로 테스팅 및 공용 프로젝트를 진행하는 환경이라면 사용하지 않을 이유는 없을 것으로 생각된다.

수업을 진행하며 좀 더 깊이 있는 내용을 포스팅 해야겠다.

'Cloud_Virtualization' 카테고리의 다른 글

[Cloud_Virtualizaiton]Build_Docker  (0) 2023.03.13

도커(Docker)

도커 설치에 앞서 도커를 사용하는 이유에 관해서 간단하게 짚어본다.

우리가 도커를 사용하는 가장 큰 목적은 무엇보다 "개발의 편리함""빠른 배포" 일 것이다.

"어느 환경에서나 도커 엔진만 있다면 컨테이너 이미지를 실행하여 동일한 환경을 만들어 준다" 가 위 두 가지 목적의 근거가 될 수 있다.

 

결론적으로 도커란 "서비스 개발 및 편리한 배포"를 위한 도구로써,

2013년에 새롭게 등장한 "컨테이너" 기반의 가상화 도구이다.

 

가상화의 대표적인 두 가지 방법으로는,

 

- Hypervisor Virtualization(하이퍼바이저) :

• Type 1:  

베어메탈(Bare-Metal Hypervisor)라고도 불리우며 아무 것도 설치 되어있지 않은

물리적 하드웨어 위에 하이퍼바이저가 위치하여 N개의 OS를 하이퍼바이저가 관리하는 구조로,

구조상 가상머신과 하드웨어 사이에 별도의 호스트 OS가 없기 때문에 Type 2보다 효율적인 면에서 우세하다고 하여

가상화 서버를 구축할 때 주로 이용된다고 하지만, 구축 및 관리면에서 단점이 존재한다고 한다.

이 베어메탈(Type 1)가상화 방식도 세부적으로 또 한 번 나누어지지만 해당 포스트에서는 다루지 않는다.

 

(좌) Container 가상화 구조의 도식화 / (우) Bare-Metal 가상화 구조의 도식화

 

 

• Type 2:

현재 우리가 공부를 함에 있어서 가장 많이 사용되는 가상화 구조로 호스트 기반 하이퍼바이저(Hosted Based Hypervisor)라고 불리우며

물리적인 하드웨어(PC / Workstation)의 기존의 OS(Windows, MacOS, Linux ...)위에 가상화 소프트웨를 통하여,

해당 소프트웨어가 호스트(Host)와 가상 호스트(Guest)에게 물리적인 리소스를 분리/할당 하여 가상머신을 생성하는 형태를 의미한다.

(VMWare, Virtualbox, UTM(For Mac) ... 등이 이에 해당)

 

(좌) Hosted Based 가상화 구조의 도식화 / (우) Container 가상화 구조의 도식화

 

 

- Container Virtualization(컨테이너 가상화):

리눅스 커널(Kernel)에 기반하여사용되는 가상화 방식으로, 프로세스를 격리해서 실행하고 관리할 수 있도록 도와주며

계층화된 파일 시스템을 기반으로 해서 효율적으로 이미지 API를 프로세스 실행환경으로 구축하게 된다.

앞에서 소개된 가상화 방식과 가장 큰 차이점으로는 VM(가상머신) 이 각각의 프로세스로

존재하기 때문에 호스트 머신의 물리적인 하드웨어를 할당받는 것이 아닌

Linux OS 안에 하나의 프로세스로 존재하게 된다는 것이다.

 

풀어서 말한다면 여타 다른 가상화와는 달리 컨테이너 가상화 서비스에서는

서비스(NginX, Apache, Database ...)가 별도의 운영체제 위에서 실행되는 것이 아닌

그저 시스템이 실행중인 프로세스의 형태로 구동되는 것으로 가볍고 빠르다는 장점이 존재한다.

따라서 리소스에 대한 부담이 감소하게 된다. 물론 이에따른 단점도 분명 존재한다.

 

 

* 실습환경 : Intel i7-1260P(AMD64) /  VMWare Workstation 16

** 네트워크 대역 : 192.168.100.0/24

*** 해당 실습에서 사용된 가상머신 : Ubunser(20.04)

 

 

● 도커 수동 설치(Docker Manual Build)

Build Docker

본격적인 도커 환경 구축에 앞서 VMWare Workstation을 사용하는 독자라면

Setting(가상머신) -> Processors -> 우측 Virtualization Engine -> Virtualization Intel VT-x/EPT or AMD-V/RVI

에 진입하여 체크박스에 체크가 되어있는지 확인해준다.

(체크가 되어있어야 가상화 지원이 가능)

 

 

[Docker Maunual Build]
sudo apt update -y && sudo apt upgrade -y
# 최신 패키지 유지를 위한 레포지토리 업데이트를 진행

sudo apt install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common 
# 도커환경 구성에 필요한 종속 패키지를 Install

su -c "curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -"
# 외부 저장소에서 Install 해줄 Docker 패키지의 무결성 검증을 위한 Key를 추가

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# Docker 패키지를 다운받기 위한 레포지토리를 임의로 추가

sudo apt update -y
# 추가된 레포지토리 적용을 위한 업데이트

sudo apt install -y docker-ce docker-ce-cli containerd.io 
# Docker 실행에 필요한 구성 패키지 다운로드

 

 

/etc/docker/daemon.json 파일의 내용

 

sudo vim /etc/docker/daemon.json
# Docker 데몬을 새롭게 생성해주기 위해 에디터로 파일을 편집

[편집 내용]
{
        "exec-opts" : ["native.cgroupdriver=systemd"],
        "log-driver" : "json-file",
        "log-opts" : { "max-size" : "100m" },
        "storage-driver" : "overlay2"
}
# json 포맷으로 파일을 작성해주었으며, 오타에 유의하여 작성

sudo mkdir -p /etc/systemd/system.docker.service.d
# rootless 모드에서 사용될 디렉토리를 새롭게 생성

sudo systemctl daemon-reload && sudo systemctl restart docker && sudo systemctl enable docker.service
# 새롭게 생성된 데몬 적용을 위해 reload, Docker 서비스를 재시작하여 Service Status를 확인

 

 

Build Docker

"systemctl status ~" 커맨드를 이용하여 도커 서비스의 작동 여부를 확인한다.

(Error 발생 시 경험 상 대부분의 문제가 앞에서 json 포맷으로 작성한 데몬파일인 경우가 많았으니 이 부분 참고)

 

 

Build Docker

필자는 alias를 사용하여 "docker"를 "dkr"로 줄여서 사용함

기존 명령어는 "sudo docker run hello-world"

 

위의 그림을 확인해보면

내가 구축 한 도커의 로컬 영역에 "Hello World"라는 이미지가 존재하지 않기에

Docker Image를 도커의 Default Regitstry "https://hub.docker.com/" 경로에서 Pull 하여

가져오는 것이 확인되면 정상적으로 도커 엔진이 설치된 것

'Cloud_Virtualization' 카테고리의 다른 글

[Cloud_Virtualization]Execute_Docker  (0) 2023.03.14

+ Recent posts