배우는 이유?

 

우리가 사용하는 어떤 앱을 만들기 위해 서버, 데이터 베이스 등 몇 개의 앱을 사용하는데,
이런 것들을 한꺼번에 할 수 없을까?

이런 상황을 위해 각각의 실행하되, 격리된 환경에서 실행되게 하면 되지 않을까?
그렇게 격리된 환경에서 네트워크로 연결해서 필요한 정보를 주고받으면 되겠구나.
격리된 환경에는 운영체제가 존재하진 않지만 앱을 실행시키기 위한 것들만 존재하게 하면 많은 것들을 아낄 수 있다.

이렇게 하나의 컴퓨터에 여러 개의 격리된 환경을 만들 수 있게 하는 것이 Docker다.

하나의 컴퓨터는 Host, 격리된 각각의 환경을 Container라고 칭한다.
그렇다면 Host와 Container의 운영체제는 같아야 하는가? 아니다.

Docker는 기본적으로 Linux에서 돌아간다.
그래서 Mac, Windows에서 Docker를 설치하면 경량화된 Linux가 가상화되어 그 위에서 Docker가 실행되는 것이다.

그렇다면, VM과 다를 것이 없을 텐데 왜 사용하는가? 아니다.
VM과는 명백하게 다른 점이 있다.

  1. VM은 운영체제를 완전히 설치해야 하기 때문에 어떤 운영체제도 받을 수 있다.
    • Docker는 Linux의 위에서만 돌아가기 때문에 Linux계열의 운영체제만 지원된다.
  2. VM은 Host와 완전히 분리되어 있다.
    • VM은 논리적 가상화로 인해 운영체제를 완전히 설치해서 사용한다.
    • Docker는 Kernel의 공유로 Host의 운영체제에서 부족한 부분의 운영체제를 설치해서 사용한다.
      • 즉, Docker에서의 명령은 Host를 통해 실행된다.
  3. VM은 해킹당해도 문제없지만, Docker는 해킹당하면 Host가 위험하다.
    • VM은 Host와 분리되어 있기에 영향이 없지만, Docker는 Host와 연결되어있기에 다른 컨테이너 또한 위험하다.

 

결과적으로, 관리만 잘하면 자원의 낭비 없이 효율적으로 사용하는 유용한 도구가 Docker인 것이다.

 


네트워크

 

내 컴퓨터에서 어떤 웹페이지를 띄운다면 Host의 Port를 통해 접근해서 어떤 html 파일을 열게 된다.
근데 이런 과정을 Docker를 이용해서 한다면,
Host의 Port를 통해 들어가면 해당 Port와 연결된 Container의 Port로 들어가서 Container에 저장된 어떤 html을 열게 된다.

이런 Host와 Container의 Port를 연결하는 과정을 Port-Forwarding이라 한다.

ps. 호스트와 컨테이너의 파일 시스템을 연결시킬 수 있는 방법도 있다.


Docker의 Image 만드는 법

 

Image는 Container를 만들기 위한 설계도로 모든 파일과 설정값을 갖고 있다.
또한, Image는 변하지 않고, 여러 개의 컨테이너를 생성할 수 있다.
이런 Image는 Container에서 commit을 이용해서 생성할 수 있고, Dockerfile를 build 하여 생성할 수 있다.

Container에서의 commit은 현재 상태를 백업하는 용도로 Image를 생성하는 느낌이다.

Dockerfile은 Image의 초기 설정값, 실행할 명령어 등을 문서상으로 작성해놓은 것.


Dockerfile 작성법

 

FROM ubuntu:20.04

Docker의 Image 환경을 지정하는 방식이다.

- Image의 환경을 Ubuntu의 20.04 Version을 사용하는 것이다.

RUN apt update && apt install -y python3

Image의 환경에서 실행되는 명령어인데, 실행할 때마다 Layer가 생성되기 때문에 한 줄에 여러 개의 명령어를 작성하는 것이 좋다.
Build 되는 시점에 실행되는 명령어 -> Image에 반영

- 현재 apt의 상태를 최신으로 해준 뒤 python3을 설치해주는데, Yes/No의 대답에 항상 Yes를 해주겠다는 내용이다.

WORKDIR /var/www/html

Shell에서 "mkdir -p /var/www/html"과 같은 명령어이다.

- 해당하는 폴더가 없다면 만들어주고, 해당 폴더로 현재 경로를 옮겨준다.

COPY ["index.html", "."]

- Host의 현재 경로에서 첫 번째 변수를 Image의 현재 경로에 복사한다.

CMD ["python3", "-u", "-m", "http.server"]

Container를 만들 때 실행되는 Default 명령어 -> Container에 반영
즉, Docker Run 하면서 명령어를 지정하면 실행되지 않는다.

- python3의 기본 Web Server를 실행시킨다.(8000번 Port로 연결된다.)

Dockerfile 실행 방법

 

docker build -t <Image의 이름> <Dockerfile의 경로>
// 경로의 Dockerfile을 찾아 실행시켜 Image를 생성한다.

docker rm --force <Container의 이름>
// 만약 생성할 Container가 이미 있는 이름이라면 제거한다.

docker run -p <Host의 Port>:<Container의 Port> --name <Container의 이름> <Image의 이름> (<명령어>)
// Container를 생성하는데, Port-Forwarding해준 뒤, 이름 지정, 명령어를 실행시켜 준다.(명령어는 생략 가능)

Docker Compose를 이용한 Docker Container 제어하기

 

실제 Docker Container는 하나의 프로그램을 실행하는데, 하나의 프로그램으로 서비스가 된다면 Docker는 필요하지 않았을 것 같다.
예시로 WordPress를 컨테이너로 만들게 되면, SQL이 필요하여 또 하나의 컨테이너가 필요하게 된다.
그렇게 두 개의 컨테이너가 만들기 위해 Dockerfile을 실행시킬거나 Image를 가져올 때 몇 개의 명령어를 위해 Docker-compose.yml파일을 만들게 된다.

  • 컨테이너의 이름 설정
  • 컨테이너 생성 순서 설정(의존성)
  • Port-Forwarding(Host와 Container 간의 통신이 필요한 경우)
  • Volume 공유
  • 컨테이너 환경 변수 설정
  • 네트워크 생성, 설정

 


왜 Inception에서 MariaDB, Nginx, Wordpress를 사용할까?

 

  • Nginx는 웹 서버를 위한 도구
  • Wordpress는 손쉽게 웹 사이트를 만들 수 있는 도구
  • MariaDB는 관계형 데이터 베이스 관리를 위한 도구
    • 데이터 베이스 : 컴퓨터 시스템에서 전자적으로 저장되는 구조화된 정보 또는 데이터의 조직화된 모음

Wordpress의 모든 정보는 데이터 베이스에 저장, 저장된 데이터는 웹 사이트를 만든다.
웹 사이트를 구성하는 대부분이 데이터 베이스에 저장되어 있다.
예를 들면, 사용자 이름, 비밀번호, 포스트, 페이지, 댓글, Wordpress 구성 설정 등

작동방식

사용자가 웹 사이트를 방문하면 해당 브라우저가 Nginx에게 Request를 전달하고,
Nginx는 받은 Request를 WordPress에게 전달해준다.
그리고 WordPress는 Request를 받아 MariaDB에서 필요한 데이터를 추출한다.
추출된 데이터에 따라 웹 사이트를 만들어 Nginx로 보내진 뒤 사용자에게 보여준다.

 

'42일기' 카테고리의 다른 글

kqueue의 사용법  (0) 2022.07.23
I/O Multiplexing  (0) 2022.07.23
ft_containers[Red-Black Tree]  (1) 2022.04.29
ft_containers[Map]  (0) 2022.04.26
CPP [템플릿]  (0) 2022.03.02

+ Recent posts