들어가며
ℹ️ Docker의 핵심은 '이식성'
이식성: 특정 프로그램을 다른 곳으로 쉽게 옮겨서 설치 및 실행할 수 있는 특성을 말합니다.
- Docker를 왜 배워야 하는가?
- 항상 일관되게 프로그램을 설치할 수 있습니다. (버전, 환경설정, 옵션, 운영체제 등)
- 각 프로그램이 독립적인 환경에서 실행되기 때문에, 프로그램 간 서로 충돌이 일어나지 않습니다.
- 즉, 환경에 종속되지 않고 애플리케이션을 실행시킬 수 있기에 Docker를 사용합니다.
1. Docker 개념
👀 참고
컨테이너 런타임 기술 중 하나가 'Docker' 입니다. 컨테이너 엔진인 Docker Engine을 통해 Host OS 커널을 공유하고, CPU가 메모리 자원을 격리한 가상 공간인 '컨테이너'를 생성합니다.
- Docker
- 컨테이너를 사용해 각 프로그램을 분리된 환경에서 실행 및 관리할 수 있는 툴입니다.
- 컨테이너(Container)
- 하나의 컴퓨터 환경 내에 독립적인 컴퓨터 환경을 구성, 각 환경에 별도의 프로그램을 설치할 수 있는 개념입니다.
=> 하나의 컴퓨터 환경 내에서 여러 개의 미니 컴퓨터 환경을 구성하는 형태라고 할 수 있습니다. - 이러한 미니 컴퓨터를 Docker에서는 컨테이너(Container)라고 부릅니다.
- 컨테이너와 가상머신의 차이점
- 가상머신: 하드웨어 수준에서 격리된 환경을 제공합니다.
- 컨테이너: 소프트웨어 레벨에서 경량화된 격리 환경을 제공합니다. (메모리/CPU 자원 절감, 실행/종료속도가 빠름)
- 하나의 컴퓨터 환경 내에 독립적인 컴퓨터 환경을 구성, 각 환경에 별도의 프로그램을 설치할 수 있는 개념입니다.
- 호스트(host) 컴퓨터
- 컨테이너를 포함하고 있는 컴퓨터입니다.
2. 컨테이너의 구성요소 및 독립성
1) 구성요소
- Package: 프로그램이 동작하기 위한 소스 코드들의 묶음
- Dependency: 코드 실행에 필요한 의존성
- 그외: 실행에 필요한 몇 가지 도구들
- 예시
- React.js 애플리케이션 구축 시 필요한 소프트웨어 유닛은?
1. 소스 코드 묶음
2. 코드 실행에 필요한 의존성 (package.json)
3. Node JS 실행환경 (Runtime) - 이렇나 구성요소들을 하나의 단위(Unit)로 모아서 구성해 주는 개념이 컨테이너의 본질입니다.
- React.js 애플리케이션 구축 시 필요한 소프트웨어 유닛은?
2) 독립성
- 디스크 (저장공간)
- 각 컨테이너마다 서로 각자의 저장 공간을 가지고 있습니다.
- 일반적으로 A 컨테이너 내부에서 B 컨테이너 내부에 있는 파일에 접근할 수 없습니다.
- 다만, 볼륨(Volume) 개념을 사용하여 컨테이너와 호스트 시스템 간 파일 시스템을 공유하거나, 서로 다른 컨테이너 간 데이터를 공유할 수 있습니다.
- 네트워크 (IP, Port)
- 각 컨테이너마다 고유의 네트워크를 가지고 있습니다.
- 컨테이너는 각자의 IP 주소를 가지고 있습니다.
3. 이미지(Image)
👀 참고
Docker 컨테이너 ≈ 자바 인스턴스
- 자바 인스턴스: 자바 클래스를 기반으로 메모리에 할당되어 실행되는 객체입니다.
- Docker 컨테이너: Docker 이미지를 기반으로 생성 및 실행되는 독립적인 실행 환경입니다.
즉, 자바 인스턴스가 클래스를 기반으로 실행되는 객체라면, Docker 컨테이너는 이미지를 기반으로 실행되는 프로세스라고 볼 수 있습니다.
Docker 이미지 ≈ 자바 클래스
- 자바 클래스: 객체를 생성하기 위한 설계도입니다.
- Docker 이미지: 컨테이너를 생성하기 위한 설계도 역할을 합니다.
이미지는 애플리케이션의 실행에 필요한 파일과 설정을 모두 포함한 패키지이고, 그 이미지를 바탕으로 컨테이너가 생성됩니다.
- 개념
- 프로그램을 실행하는데 필요한 설치과정, 설정, 버전정보 등을 포함하고 있습니다.
- 즉, 프로그램을 실행하는데 필요한 모든 것을 포함하고 있습니다.
- 하나의 이미지 파일로 여러 개의 컨테이너를 생성할 수 있기 때문에 서버를 쉽게 확장하고 관리할 수 있습니다.
- MySQL 서버를 이미지로 만들었다면?
- 이 이미지를 Docker로 실행시키는 순간, MySQL 서버가 컨테이너(Container) 환경에서 실행됩니다.
- MySQL을 하나하나 설치할 필요 없이 MySQL 데이터베이스를 사용할 수 있게 되는 것입니다.
- 이미지는 어디서 찾을 수 있나요?
- Docker Hub: https://hub.docker.com/
4. Dockerfile
- 개념
- 도커 이미지 및 애플리케이션을 직접 패키징할 수 있습니다.
- 스크립트 형태로 작성된 하나의 파일로, 몇 가지 명령어를 통해 작성합니다.
- 대표 명령어
명령어 | 상세설명 |
FROM | - 해당 이미지는 다른 이미지인 diamol/node에서 시작하도록 지정 - diamol/node 이미지에는 web-ping 애플리케이션을 실행하는데 필요한 Node.js 런타임이 설치되어 있음 |
ENV | - 환경 변수 값을 지정하기 위한 명령어 - 아래의 형식을 따름: [key]="[value]" → TARGET 이름을 가진 변수에는 기본값으로 "blog.sixeyed.com"을 지정 |
WORKDIR | - 컨테이너 내부에 파일 시스템으로 사용할 기본 경로를 지정 - WORKDIR /web-ping → /web-ping 경로를 기본 작업 경로로 지정 |
COPY | - 로컬 시스템에서 작성한 파일이나 폴더를 도커 이미지 내 파일 시스템에 복사하는 명령어 - 기본 작성 패턴: [원본 경로] [복사할 경로] - COPY app.js → 여기서는 복사할 경로를 생략하고 app.js 파일을 도커 이미지 내 파일 시스템의 기본 경로에 복사하도록 지정 |
CMD | - 도커가 이미지를 통해 컨테이너를 생성, 실행하였을 때 수행할 명령어를 지정하는 명령어 - CMD ["node", "/web-ping/app.js"] → 컨테이너가 실행되면 node 명령어를 통해 /web-ping 경로 내 app.js 파일을 실행하도록 지정 |
EXPOSE | - 컨테이너가 외부에 개방할 포트를 지정 - EXPOSE 80: nginx 웹서버에서 사용하는 80포트를 외부에 개방 |
# Dockerfile 내용
FROM diamol/node
ENV TARGET="blog.sixeyed.com"
ENV METHOD="HEAD"
ENV INTERVAL="3000"
WORKDIR /web-ping
COPY app.js
CMD ["node", "/web-ping/app.js"]
# Dockerfile을 통해 도커 이미지 생성(build)
docker build --tag web-ping .
5. Docker 사용 흐름 알아보기 (w. Nginx)
ℹ️ Nginx란?
웹 서버(HTML 웹 페이지를 렌더링 시키는 역할), 로드 밸런싱, 리버스 프록시를 담당합니다.
# 1. Nginx 이미지 다운로드
docker pull nginx
# 2. 다운로드된 이미지 확인하기
docker image ls
# 3. 이미지를 컨테이너에 올려 Nginx 서버 실행하기
docker run --name webserver -d -p 80:80 nginx
# 4. Nginx 서버가 잘 실행되는지 확인하기
# 5. 실행되고 있는 모든 컨테이너 상태 확인하기
docker ps
# 6. 특정 컨테이너 정지 시키기
docker stop webserver
반응형