개발환경을 구성하는 것은 상당히 귀찮고 까다로운 작업이다.
예를 들어 내가 만든 JS코드를 배포했는데 내 환경에서는 잘 작동하는데 다른 사람의 환경에서 잘 안되는 상황이라면, 서로의 nodejs버전이 다르기 때문에 발생하는 것이다. 이러한 모든 상황을 처리하기 수월하게 하는 것이 도커이다 즉 빠르게 여러 환경설정을 구축할 수 있다.
Virtual Machine
하이퍼바이저(Virtual Box)를 사용해서 호스트os와는 독립된 새로운 Guest OS 위에서 새로 할당한 자원을 사용한다. 따라서 도커보다 느리지만 저마다의 커널을 활용하기 때문에 보안성 문제에서는 더 우수하다.
도커
Host OS에서 설치된 컨테이너 엔진(제일 잘 나가는 것이 도커)에 의해서 돌아간다. 독립됐지만 자원은 Host OS의 자원을 공유하기 때문에 가상머신에 비해서 가볍고 실행속도가 훨씬 빠르다.
Dockerfile : makefile과 비슷하다. (도커 이미지를 만들기 위한 레시피)
환경설정 및 스크립트 등 모든 실행할 요소를 설정해주는 파일이다.
이미지 : 위의 도커파일을 기반으로 설정된 스냅샷 상태. (컨테이너를 주문하기 위한 메뉴)상태가 불변하다. 객체지향의 클래스와 같이 템플릿과 같은 역할이다.
컨테이너 : 이미지를 이용해서 컨테이너를 만들어 구동할 수 있다. (내가 원하던 음식) 객체지향의 객체와 같은 상태.
Docker-Compose
여러 개의 컨테이터를 모아 한 개의 어플리케이션으로 구성할 수 있게 도와준다. inception 과제와 같이 세 개의 컨테이너로 나누어진 구성에서 활용할 수 있다.
Docker-Compose 예제
Docker-Network
여러 개의 도커 컨테이너 or 도커가 아닌 것들과 네트워크로 연결할 수 있다. 대표적으로 세 개의 네트워크 드라이버가 존재한다.
Docker-Volume
기본적으로 컨테이너의 값들은 컨테이너가 삭제되면 모두 사라진다. 그래서 컨테이너에서 돌아가는 프로그램들의 값을 영구적으로 보존하기 위해 Volume을 활용한다.
위의 흐름도처럼 우리는 호스트에서 디렉토리를 만들어 마운팅 해준다.
포어그라운드(ForeGround)
터미널로 직접 연결해 터미널을 통해서 입/출력을 주고 받는 프로세스.
프로세스가 포어그라운드로 실행되는 동안에는 터미널을 통해서 작업할 수 없고, 터미널 세션을 종료하거나 프로세스를 종료하면 포어그라운드는 종료된다. ex) node.js 서버 돌리면 커맨드가 안 먹히는 거
백그라운드(ForeGround)
프로세스가 실행되는 동안에도 터미널에서 작업을 할 수 있다.
백그라운드로 프로세스를 실행하면 프로세스의 종료 여부와는 상관없이 다른 명령어 수행이 가능하다.
데몬프로세스
백그라운드 프로세스 중 하나이다. 정확히는 PPID가 1이거나 부모 프로세스가 데몬 프로세스인 프로세스를 의미한다. 데몬 프로세스와 백그라운드 프로세스의 차이는 터미널이 종료됐을 때 터미널에서 실행한 프로세스가 함께 종료되는가이다.
PPID가 1이라는 의미는 다음과 같다. PID가 1인 프로세스는 최초의 프로세스로 시스템이 종료될 때까지 유지되는 프로세스이다. 부모 프로세스가 자식 프로세스를 만든 후에 죽으면 자식 프로세스는 고아 프로세스가 되는데 이때 부모 프로세스를 init Process로 지정하면 시스템이 종료될 때까지 유지되는 데몬 프로세스가 된다.
PID & PPID
PID : 운영체제에서 프로세스를 각각 구분하기 위해 부여하는 값
PPID : 프로세스를 생성한 부모 프로세스의 PID를 나타낸다.