[Cloud_Virtualization]Execute_Docker
도커 실행해보기(Execute Docker)
이번 포스트에서는 도커로 서비스하는 과정을 실습해보도록 하겠다.
앞의 글에서도 설명 되어있듯이, 도커 가상화에서는 각자의 서비스 실행됨에 있어서
"운영체제 설치 > 소프트웨어 설치 > 서비스 ..."등의 빌드 과정이 필요없이
서비스만 단독적으로 실행이 가능하다는 점이 존재한다고 했다.
그 예시로 웹 개발, 서버에 관한 공부를 하는 분들에게는 익숙할 수 있는 웹 엔진 "NginX"를
도커 컨테이너 가상화를 통하여 서비스하는 과정에 대한 실습을 진행해보았다.
* 실습환경 : Intel i7-1260P(AMD64) / VMWare Workstation 16
** 네트워크 대역 : 192.168.100.0/24
*** 해당 실습에서 사용된 가상머신 : Ubunser(.99), CentOS7(.140)
**** 실습 중 "docker" 커맨드가 alias = "dkr" 로 사용되었음
● 도커를 활용한 웹 서비스
먼저 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]" 옵션을 이용하여 새롭게 생성할 컨테이너에 이름을 부여하여
보다 편리한 관리를 가능하게 해준다.
"sudo ss -nltp | grep LISTEN" 명령어를 이용하여 도커 컨테이너(프로세스) 생성 시 지정한 포트가
LISTEN 상태가 되어있는 지 확인해본다.
"sudo docker ps" 명령어를 이용하여 현재 실행되고 있는 컨테이너 목록을 확인할 수 있으며,
앞에서 생성한 "NewNgin" 컨테이너가 외부(External) ANY(0.0.0.0)로 부터 8080 포트로 요청 시 -> NginX(80)컨테이너가
응답할 수 있도록 Port Redirect가 설정된 채로 생성 되어있는 것을 확인해볼 수 있다.
"firefox http://localhost:8080" 명령을 이용하여 우선 로컬(Ubunser)에서 먼저 접속을 시도해보면,
위의 그림과 같이 생성된 NginX 컨테이너가 정상적으로 응답하는 모습을 확인해볼 수 있다.
다음으로 외부에서 접근 시에도 정상적으로 서비스가 이루어지는가를 확인하기 위해
별도의 가상 머신(CentOS7)에서 "firefox http://192.168.100.99(Ubunser의 주소):8080" 를
입력하여 웹 사이트 요청을 진행했을 때에도 정상적으로 NginX의 Default 페이지가 출력되는 것을 확인해볼 수 있다.
● 도커 볼륨(Docker Volume)
도커에서 각종 이미지를 기반으로 한 컨테이너(APPs, OS, DB ...)가 실행될 때 해당 다양한 내용들에 대한
수정 / 변경이 발생하게 되는데, 실행되고 있는 컨테이너의 상태는 그저 메모리(Volatile)에 적재되어 실행되는
프로세스에 불과하기 때문에 작업이 종료되어 컨테이너를 삭제하게 되면 그간 작업했던 내용들도 함께 삭제가 된다.
이런 부분을 보완하기 위해서 사용되는 것이 바로 컨테이너 <-> 호스트 간 저장공간을 공유하는 도커 볼륨이다.
먼저 도커 볼륨의 동작 방식을 직접 확인해보기 위해서 임의의 경로에 index.html 파일을 생성해두었다.
새로운 컨테이너 생성 시 공유될 볼륨을 지정한 상태로 진행
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를 사용하였다.
"firefox http://localhost:10000" 를 입력하여 접속 시,
호스트머신에서 생성 후 호스트머신에 저장되었던 HTML 문서가
도커 볼륨 설정으로 인해 컨테이너에서 해당 웹 페이지를 서비스 해주는 것을 확인해볼 수 있다.
좀 더 직관적으로 구조를 확인해보기 위해서
"sudo docker exec -it [Container Name] bash"를 입력하여 실행되고 있는
컨테이너의 Shell 로 진입한 뒤, 컨테이너에서 파일을 생성한 뒤 저장을 했을 때,
호스트 머신의 저장공간에 컨테이너 안에서 생성한 파일이 저장 되어있는 것을 확인할 수 있었다.
▼ Docker & Bootstrap Template을 활용한 반응형 웹 페이지 서비스
웹 서비스를 제공할 호스트 머신(Ubunser)에서
"firefox http://startbootstrap.com/"를 입력하여 해당 Bootstrap 웹 사이트에 진입해본다.
Bootstrap은 유료 및 무료(MIT License) 디자인 템플릿을 제공해주는 프레임워크로,
공개 되어있는 반응형 웹 페이지를 컨테이너에 적재하여 서비스하는 것을 구현하고자 사용하였다.
해당 사이트 진입 후 본인 입맛에 맞는 공개된 웹 페이지의 코드를 다운로드하여
호스트 머신에 저장을 한 뒤 실습을 진행한다.
해당 포스트에서는 첨부 자료가 생략되었지만 템플릿 다운로드 후,
~/Download 경로에 저장된 아카이브를 "unzip" 으로 해제한 뒤,
기존 도커 볼륨으로 사용중인 "/home/master/Desktop/website/~" 디렉토리 아래로 옮겨주었다.
* 필자 기준
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 템플릿이 저장 되어있는 디렉토리를 컨테이너와 공유하는 컨테이너를 생성
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는 기존의 컨테이너와 충돌이 발생하지 않도록 한다.
기존 도커 볼륨이 설정 되어있는 컨테이너와 같은 디렉토리를 공유할 수 있도록 공유 경로를 참조하여 컨테이너를 생성할 수 있다.
호스트 머신에서 컨테이너의 정상 작동 여부를 확인하기 위해
"firefox http://localhost:8081(두 번째로 만든 컨테이너)" 로 웹 사이트를 요청하여
위의 그림처럼 Bootstrap Template 에서 다운받은 양식의 웹 페이지가 출력 된다면 정상적으로 실행되었음을 확인할 수 있다.
물리적인 서버에 웹 서버를 구축 ~ 서비스 하는 과정에 비하면 훨씬 간단하고 가볍게 진행되는 것을 확인해볼 수 있었다.
그에 따른 문제점도 분명히 존재 하겠지만, 전적으로 테스팅 및 공용 프로젝트를 진행하는 환경이라면 사용하지 않을 이유는 없을 것으로 생각된다.
수업을 진행하며 좀 더 깊이 있는 내용을 포스팅 해야겠다.