해당 포스팅은
Wanted 프리온보딩 챌린지 8월 "도커 이미지 제작부터  클라우드 배포까지"를 수강한 내용을 토대로 정리한 글입니다.

 

 

공식 문서에서 도커를 알아보자

  • 애플리케이션 개발, 배포, 실행을 위한 Open Platform
  • 애플리케이션을 인프라에서 분리하여 신속한 소프트웨어 제공
  • 인프라를 애플리케이션을 관리하는 것처럼 관리할 수 있다.
  • 코드 배포 및 테스트에 용의하다.

https://docs.docker.com/get-started/overview/

 

Docker overview

 

docs.docker.com

Docker란 무엇일까?

  • 컨테이너 기반 가상화 도구(리눅스 컨테이너 기술인 Linux Containers 기반)
  • 애플리케이션을 컨테이너 단위로 격리하여 실행하고 배포하는 기술
  • 다양한 운영체제에서 사용할 수 있으며,
    컨테이너화 된 애플리케이션을 손쉽게 빌드, 배포, 관리할 수 있는 다양한 기능 제공
  • 위 기능들을 통해 애플리케이션을 빠르게 개발하고, 효율적으로 배포, 관리할 수 있음

여기서 의문이 하나 생긴다. 컨테이너란 대체 무엇일까?

한 번 찾아보자.

컨테이너(Container)란?

  • 컨테이너는 가상화 기술 중 하나
  • 호스트 운영체제 위에 여러 개의 격리된 환경을 생성
  • 각각의 컨테이너 안에서 애플리케이션을 실행

다시 꼬리 물기로 의문이 생긴다. 가상화 기술이란 무엇일까?

 

가상화(Virtualization) 기술이란?

하나의 물리적인 컴퓨터 자원(CPU, 메모리, 저장장치 등)을 가상적으로 분할하여
여러 개의 가상 컴퓨터 환경을 만들어 내는 기술이다.
이를 통해 물리적인 컴퓨터 자원을 더욱 효율적으로 사용할 수 있으며,
서버나 애플리케이션 등을 운영하는 데 있어 유연성과 안정성을 제공한다.

즉, 하나의 서버나 컴퓨터를 다양한 용도에 따라 가상 분할하여 사용하는 것이다.

VM


위 사진의 VM 구조를 보면 하이퍼바이저(HyperVisor)라는 게 있다.
하이퍼바이저란 가상 머신을 생성하고 구동하는 소프트웨어이다.

하이퍼바이저는 가상 머신 모니터(Virtual Machine Monitor, VMM)라고도 불리며, 하이퍼바이저는
하이퍼바이저 운영 체제와 가상 머신의 리소스를 분리해 VM의 생성과 관리를 지원합니다.

하이퍼바이저로 사용되는 물리 하드웨어를 호스트라고 하며, 리소스를 사용하는 여러 VM을 게스트라고 한다.
OS들의 요청을 번역하여 하드웨어에 전달하며, OS에 자원을 할당 및 조율한다.

 

여기서 다시 의문이 생긴다. 
VM과 Container 둘 다 가상 환경을 만들어서 사용하는 기술 아닌가?

둘의 차이점은 뭘까?

 

  • 가상화 수준: VM은 하이퍼바이저를 사용하여 물리적인 하드웨어 위에 여러 개의 독립적인 가상 머신을 생성한다.
    각 가상 머신은 호스트 운영체제와 완전히 격리되어 독립적인 운영체제와 커널을 실행한다.
    반면에 컨테이너는 호스트 운영 체제의 커널을 공유하여 각 컨테이너는 독립적인 파일 시스템과 프로세스 공간을 갖는다. 이로 인해 컨테이너는 VM보다 더 가볍고 빠르며 효율적으로 리소스를 활용한다.
  • 시작 속도 : VM은 가상 머신마다 별도의 운영체제를 실행해야 하기 때문에 시작 속도가 상대적으로 느릴 수 있다. 반면에 컨테이너는 호스트 운영 체제의 커널을 공유하고, 이미지를 레이어로 캐싱하므로 빠르게 시작할 수 있다.
  • 이식성 : 컨테이너는 환경에 독립적으로 동작하므로 개발한 애플리케이션을 동일한 환경에서 쉽고 빠르게 실행할 수 있다. 또한 클라우드나 다른 환경으로도 쉽게 이동이 가능하다. VM의 경우, 가상 머신 이미지를 다른 환경으로 이동하기 위해서는 추가적인 설정이 필요하다.
  • 성격 : VM은 보다 격리된 환경을 제공하므로 다양한 운영 체제와 응용 프로그램을 호스팅 하고, 다양한 운영 체제를 동시에 실행하는데 적합하다. 반면에 컨테이너는 하나의 운영 체제에서 여러 개의 서비스와 마이크로서비스를 실행하는 데 더 적합하다.

VM은 강력한 격리와 호환성이 필요한 경우에 적합하며, 컨테이너는 빠른 개발과 배포가 필요한 마이크로서비스에 더 적합하다고 볼 수 있다.

 

도커에 관한 이론을 알아보았으니, 도커의 구조에 대해서 알아보자.
다음은 공식 홈페이지의 도커 아키텍처이다.

도커 아키텍처

도커는 클라이언트-서버 아키텍처를 사용한다.

클라이언트는 Docker Daemon과 통신하여 컨테이너를 빌드, 실행, 배포한다. 

 

도커 데몬(Docker Daemon)

  • 도커 엔진의 핵심 구성 요소
  • 도커 호스트에서 컨테이너를 관리하고 실행하는 역할
  • 컨테이너를 생성, 시작, 중지, 삭제하는 등의 작업을 수행
  • 컨테이너 이미지를 관리
  • 외부에서 이미지를 다운로드하고 빌드하는 작업을 수행

도커 클라이언트(Docker Client)

  • 도커 데몬과 상호작용하기 위한 인터페이스
  • 커맨드라인 인터페이스(CLI) 제공
  • docker 명령어를 사용하면 Docker Daemon으로 보내어 실행

도커 오브젝트(Docker Object)

  • 도커 이미지(Docker Image)
    - 도커 컨테이너를 만들기 위한 읽기 전용 템플릿
  • 도커 컨테이너(Docker Container)
    - 한 도커 이미지의 실행 가능한 인스턴스
    - 애플리케이션을 실행하기 위한 모든 파일과 설정 정보를 포함하는 패키지

도커 레지스트리(Docker Registries)

  • 도커 이미지를 관리하고 저장하는 곳
  • Docker Hub : 디폴트 레지스트리, 누구나 접근 가능한 공개 저장소이다.

Docker Hub에서 docker pull로 원하는 이미지를 가져와 docker run 명령어를 통하여 컨테이너화 하고 실행할 수 있다.

 

그럼 Docker 명령어를 알아보자.

먼저 Docker Hub에서 httpd를 받아와 보자.

docker pull httpd

명령어를 통하여 잘 받았는지 확인해 보자.

docker images

docker images는 내 이미지 리스트를 불러온다.

 

 docker run

docker run은 주로 -p, -it, -d, -v옵션을 자주 사용한다.
-p 옵션은 도커 컨테이너와 호스트 간의 포트포워딩을 하는 옵션이다. 

예를 들면 다음 명령어는 호스트의 8888 포트를 컨테이너 내부 80 포트로 포워딩되어 호스트의 8888 포트로 Apache Web을 접근하는 예시이다.

 docker run -p 8888:80 httpd

-it는 컨테이너가 터미널과 인터랙티브 하게 동작하며, 터미널로 컨테이너에 입력하고 출력 결과를 확인할 수 있습니다.
주로 명령어 실행, 디버깅, 로그 확인 등에서 유용하게 사용할 수 있다.

-d 옵션은 백그라운드에서 실행하는 옵션이다.

 

-v 옵션은 -v <호스트 경로>:<컨테이너 경로> 형태로 사용하며 컨테이너와 호스트 간의 디렉터리 또는 파일을 마운트하는 옵션이다.

docker run -p 8888:80 -v 프로젝트 경로:/usr/local/apache2/htdocs httpd

docker run은 이미지로부터 새로운 컨테이너를 생성하고 실행까지 한다.

 

docker ps는 도커의 현재 실행 중인 컨테이너 목록을 확인할 수 있다.

-a 옵션을 주면 중지된 컨테이너를 포함한 모든 컨테이너를 조회할 수 있다.

 

docker ps

docker 도커 컨테이너를 중지한다.
컨테이너 ID로 중지가 가능한데 ID는 docker ps 명령어에서 찾을 수 있다.

 docker stop CONTAINER_ID

docker logs는 컨테이너의 로그를 확인하는 명령어이다.

docker logs CONTAINER_ID_또는_CONTAINER_NAME

docker rm 은 컨테이너를 삭제하는 명령어이다.
컨테이너가 실행 중이라면 삭제되지 않는다.

docker rm CONTAINER_ID

docker rmi는 이미지를 삭제하는 명령어이다.

마찬가지로 컨테이너에서 해당 이미지로 실행 중인 경우  이미지를 삭제할 수 없다.

docker rmi IMAGE_ID

docker exec 명령어는 지정된 컨테이너 내에서 셸을 실행하여 사용자가 컨테이너 내부에서 명령을 실행하고 상호 작용 할 수 있게 한다.

docker exec -it CONTAINER_ID /bin/sh

DockerFile 실습

이미지는 가져오는 것만 뿐만 아니라 직접 만들어서 컨테이너화 하여 실행할 수 있다.

먼저 Dockerfile을 작성한다.

FROM httpd:latest
COPY  index.html /usr/local/apache2/htdocs/index.html
EXPOSE 80

해당 Dockerfile은 Apache HTTP Server(httpd)를 사용하여 웹 서버를 실행하기 위한 설정이다.

httpd:latest는 Docker Hub의  httpd이미지 중 최신 버전을 사용하겠다는 의미이다.

Copy는 호스트에 있는 index.html 파일을 Docker image로 복사하겠다는 의미이다. 도커 이미지 내의 경로는 /usr/local/apache2/htdocs/index.html로 하겠다는 의미이다. 이 경로는 Apache HTTP Server에서 웹 콘텐츠를 제공하는 기본 디렉터리이다.

Expose 80은 Docker Container가 80 포트를 노출시킨다는 것을 명시하는 것이다.

index.html의 내용은 다음과 같이 구성되어 있다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>원티드 온보딩 챌린지 - 백엔드</title>
</head>
<body> 도커 실습 </body>
</html>

해당 명령어는 이미지를 my-httpd라는 태그를 가진 Docker 이미지를 빌드하는 명령어이다.

-t는 태그를 의미하며, '.'은 dockerfile을 빌드하기 위한 경로를 의미하며, 현재 디렉터리를 의미한다.
즉 Dockerfile이 있는 경로에 들어가서 해당 명령어를 사용해야 한다는 의미이다.

 docker build -t my-httpd .

 

docker images 명령어를 통하여 확인해 보면 다음과 같이 새로운 이미지가 생긴 걸 확인할 수 있다.

docker run IMAGE_ID를 통해 실행한다.

'Study > On-boarding' 카테고리의 다른 글

Wanted 프리온보딩 챌린지 백엔드 도커 - 2  (0) 2023.08.04

+ Recent posts