참고
https://www.youtube.com/watch?v=LXJhA3VWXFA&t=146s
Docker
도커란 소프트웨어를 컨테이너라는 격리된 환경에서 실행할 수 있도록 하는 플랫폼이다. 애플리케이션, 시스템 설정, 의존성 등을 하나로 묶어 배포할 수 있다. 도커를 사용하게 되면 일관된 환경에서 애플리케이션을 배포 및 실행할 수 있게 된다. 이는 애플리케이션의 이식성을 높인다.
패키징된 애플리케이션(컨테이너)는 OS와 무관하게 실행 가능하며, 비슷한 동작을 하는 가상 머신보다 가볍고 빠르다. 이는 도커가 호스트 OS의 커널을 공유하고 각 컨테이너가 독립적인 user space를 가지기 때문이다. 따라서 컨테이너는 더 적은 리소스를 사용하게 되는 것이다. 이는 보안 측면에서도 이점이 있다.
도커의 이미지는 버전 관리가 가능하여 특정 버전의 애플리케이션을 쉽게 배포할 수 있다.
도커는 Kubernetes와 같은 오케스트레이션 도구와 함께 사용되어 여러 컨테이너를 관리하고 자동화할 수 있다.
Docker vs. VM
공통점
- 애플리케이션을 격리된 환경에서 실행할 수 있도록 한다.
- 서로 다른 애플리케이션 간 충돌을 방지한다.
- 애플리케이션을 다양한 환경에서 쉽게 배포하고 실행할 수 있도록 한다.
차이점
Docker
- 호스트 OS의 커널을 공유한다.
- 더 적은 리소스를 가진다.
- 컨테이너는 독립된 user space를 갖는다.
- 더 가볍고 빠르다.
- 호스트 OS와 더 가까운 수준에서 실행되기 때문에 성능이 더 우수하다.
- 이미지를 사용하기 때문에 배포와 관리가 더 간편하다.
VM
- 하이퍼바이저 위에서 실행되며 자체적인 OS와 커널을 포함한다.
- 자체적인 OS를 실행하기 때문에 더 많은 리소스를 소모한다.
- 하이퍼바이저를 통한 가상화로 성능이 다소 저하될 수 있다.
- 배포 및 관리가 다소 복잡하다.
Docker의 구성 요소
Dockerfile
Dockerfile은 도커 이미지를 생성하기 위한 텍스트 파일이다. 이미지의 구성 요소와 설정을 정의하는 명령어들이 포함되어 있다.
FROM으로 베이스 이미지를 지정하고, RUN으로 패키지 설치와 같은 명령어를 수행한다.
COPY나 ADD를 통해 파일 또는 디렉터리를 이미지에 복사할 수 있다. COPY는 단순히 파일 또는 디렉터리를 이미지에 복사하는 데 사용되며 ADD는 COPY의 기능을 포함하면서 URL에서 파일 다운로드 또는 압축 파일 자동 추출 등과 같은 기능도 제공한다.
CMD 또는 ENTRYPOINT를 통해 컨테이너가 시작될 때 실행할 기본 명령어를 지정할 수 있다. CMD는 기본적으로 컨테이너가 시작될 때 실행될 명령어를 지정하며 ENTRYPOINT는 컨테이너가 항상 실행하야 하는 명령어를 지정한다.
Image
도커 이미지는 컨테이너를 실행하기 위한 템플릿이다. 이미지에는 애플리케이션 코드, 라이브러리, 종속성, 환경 변수, 설정 파일 등이 포함되어 있다. 애플리케이션의 스냅샷이라고 생각하면 된다.
이미지는 읽기 전용이며, 여러 컨테이너가 동일한 이미지를 기반으로 실행될 수 있다. 또한 이미지는 레이어로 구성되어 있다.
Container
도커 컨테이너는 이미지의 실행 인스턴스이다. 컨테이너는 격리된 환경에서 애플리케이션을 실행하며 이미지를 통해 모든 종속성이 이식된다.
컨테이너는 독립적인 파일 시스템을 가지며 독립적인 환경에서 애플리케이션을 실행한다.
동작 과정
도커를 통해 개발을 할 때, 보통 다음과 같은 과정을 통해 진행된다.
1. 로컬 및 서버에 도커 설치
2. Dockfile 작성 및 이미지 빌드
3. 이미지를 docker hub와 같은 container registry에 push
4. 서버에서 해당 이미지를 pull
5. 서버에서 이미지를 통해 컨테이너 실행
실습
https://docs.docker.com/desktop/install/windows-install/
Install Docker Desktop on Windows
Get started with Docker for Windows. This guide covers system requirements, where to download, and instructions on how to install and update.
docs.docker.com
운영체제에 맞는 도커를 다운로드한다.
VSC를 통해 개발하는 경우 docker 익스텐션을 설치하면 도움이 된다.
npm init -y
터미널을 열고 위의 명령어를 입력하여 프로젝트를 초기화한다.
npm i express
express 프레임워크를 설치한다.
index.js
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello World');
});
app.listen(8080, () => {
console.log('Server is running on port 8080');
});
index.js 파일을 생성한다. 8080 포트에 서버를 구축한다.
node index.js
index.js를 수행한다.
localhost:8080에 접속하면 작성한 "Hello World"가 출력되는 것을 확인할 수 있다.
프로젝트를 만들었으니, dockerfile을 생성한다.
Dockerfile
FROM node:16-alpine
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY index.js .
ENTRYPOINT [ "node", "index.js" ]
FROM node:16-alpine
도커 이미지의 기본 이미지를 설정한다. node에서 이미 만들어진 이미지를 사용한다. Node.js 16 버전이 설치된 Alpine Linux 기반의 경량화된 이미지를 사용한다.
WORKDIR /app
작업 디렉터리를 /app으로 설정한다. 이후의 모든 명령은 이 디렉터리 내에서 실행된다.
COPY package.json package-lock.json ./
현재 디렉터리에서 패키지 관련 파일들을 컨테이너의 현재 작업 디렉터리인 /app으로 복사한다.
RUN npm ci
package-lock.json에 정의된 의존성을 설치한다. 'npm install'은 패키지의 최신 버전을 설치하는 반면, 'npm ci'는 package-lock.json에 명시된 버전의 패키지를 설치한다.
COPY index.js .
현재 디렉터리에서 index.js를 컨테이너의 /app으로 복사한다. 이 파일은 애플리케이션의 entry point 역할을 한다.
ENTRYPOINT [ "node", "index.js" ]
컨테이너가 시작될 때 실행되는 기본 명령이다. 'node index.js'를 실행하여 애플리케이션을 시작한다.
dockerfile은 제일 빈번히 발생하는 곳일수록 나중에 작성하는 것이 좋다. 이는 명령어가 레이어로 구성되기 때문에 만약 레이어를 수정한다고 할 때 현재 레이어와 그 상단 레이어만 업데이트하고 나머지 레이어는 업데이트하지 않아도 되기 때문이다. 즉, 이미지를 재생성할 때 변경되지 않은 레이어는 캐시된 레이어를 사용하여 효율성 및 시간 단축 효과가 있다.
dockerfile을 작성하였으니 이미지를 생성한다.
docker build -f Dockerfile -t fun-docker .
위 명령을 수행했을 때, ''docker'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는
배치 파일이 아닙니다.' 가 출력되는 경우 docker가 정상적으로 설치되었는지 확인하고, VSC나 PC를 재시작하면 된다.
'.'은 build context로, 도커 파일이 위치한 디렉터리와 그 하위 파일들을 포함한다.
-t fun-docker는 생성할 이미지의 이름과 태그를 지정한다. 태그를 지정하지 않은 경우 기본 태그인 latest가 사용된다.
-f Dockerfile은 사용할 도커 파일의 경로를 지정한다.
docker images
위 명령을 통해 생성된 이미지들을 볼 수 있다.
생성된 이미지를 사용하여 컨테이너를 실행하자.
docker run -d -p 8080:8080 fun-docker
-d는 detached 모드로 컨테이너를 실행한다는 의미이다. 즉, 컨테이너가 백그라운드에서 실행되며 터미널을 차지하지 않는다.
-p 8080:8080을 통해 포트 포워딩을 설정한다. 왼쪽 8080은 호스트 머신의 포트 번호, 오른쪽 8080은 컨테이너 내부의 포트 번호이다.
docker ps
현재 실행 중인 컨테이너를 확인할 수 있다.
docker stop <컨테이너_ID 또는 이름>
컨테이너의 실행을 중지하는 명령이다.
docker logs <컨테이너_ID>
컨테이너의 로그를 확인할 수 있다.
이미지 배포하기
Docker Hub Container Image Library | App Containerization
Increase your reach and adoption on Docker Hub With a Docker Verified Publisher subscription, you'll increase trust, boost discoverability, get exclusive data insights, and much more.
hub.docker.com
docker hub에 접속하여 레포지토리를 생성한다.
docker tag <이미지_이름> <태그명>
docker tag를 통해 이미지 이름과 태그 이름을 수정할 수 있다.
docker login
docker에 로그인한다.
docker push <이미지_이름>:<태그명>
docker hub에 이미지를 push하는 명령이다.
정상적으로 이미지가 푸시되었다.
'Databases > Data Engineering' 카테고리의 다른 글
Hadoop과 구성 요소 (0) | 2024.11.03 |
---|---|
[Airflow] DAG 선언 및 실행하기 (2) | 2024.10.01 |
[Airflow] Airflow의 Branching 알아보기 (0) | 2024.09.11 |
[Airflow] Airflow 실행하기 with Docker (0) | 2024.09.10 |
데이터 파이프라인이란? (0) | 2024.08.26 |