Docker
컨테이너라고 부르는 운영체제 수준의 가상화방식으로 SW를 배포하는 방식을 사용하는 PaaS 제품
- PaaS : Platform as a Service, 애플리케이션, 데이터 단계만 사용자가 관리하는 서비스
- 운영체제 위에 도커 설치 → 도커는 컨테이너 단위로 애플리케이션을 실행함
- 컨테이너들은 서로 격리되어 있으므로 독립성을 보장함
컨테이너
SW를 배포할 때 필요한 코드, 라이브러리, 환경 설정 파일들을 한데 모아 격리시킨 후 실행가능한 패키지로 만든 것
- 서로 다른 컨테이너는 격리된 환경에서 작동 → 서로 충돌하지 않음
- 소프트웨어 시스템을 구축할 때 최소 구성 요소로 분할하여 구축하는 방식인 마이크로서비스 아키텍처의 기반이 됨
- 동일한 운영체제 위에서 작동하면 컨테이너는 서로 통신 가능
가상화
컴퓨터에서 활용하는 리소스를 추상화하는 개념을 의미함
- 여러 개의 가상 머신을 생성함 → 단일 컴퓨팅 자원을 여러 개의 논리적인 자원으로 나누어 동작시킴
도커 구성 요소
- 도커 클라이언트 : docker-cli, 우분투에서 실행하는 터미널, dockerd API 사용하여 명령 내립, 도커 데몬과 통신함
- 도커 데몬 : dockerd, 백그라운드에서 실행되는 데몬 프로세스에 해당함, 도커 API 요청을 수신하고 객체를 관리함
- containerd: 오픈소스 컨테이너 런타임, 컨테이너의 생명주기 모두 관리함
- runc : 컨테이너 실행과 관련된 작업을 수행하는 저수준 컨테이너 런타임, 실제 컨테이너 실행만 담당
- containerd-shim : containerd와 runc 사이에서 작동하는 중간 프로세스에 해당, 컨테이너 실행을 조정함
도커 기초 개념
- 도커 이미지
- 컨테이너 형태로 소프트웨어를 배포하기 위해 필요한 모든 요소를 실행할 수 있는 포맷
- 컴파일 및 빌드한 패키지
- 의존성 고려할 필요가 없음
- 경량화된 패키지이므로 비교적 작은 용량으로도 제 역할을 수행함
- 도커 이미지를 통해 동일한 환경을 가진 여러 개의 컨테이너를 생성할 수 있음
- 이미지는 여러 레이어로 구성되어 있고 도커 허브와 같은 중앙 저장소에 저장되어 관리됨
- 도커 컨테이너
- 도커 이미지를 실행할 수 있는 인스턴스
- 도커 이미지로부터 생성됨
- 컨테이너는 자체적으로 파일 시스템을 가지고 있음
- 각 컨테이너는 독립적으로 실행됨
- 컨테이너는 도커 엔진과 운영체제를 공유함 → 컨테이너는 도커 엔진이 설치되어 있는 호스트 운영체제를 이용함
도커 이미지 명령어
# 도커 이미지 다운로드
docker image pull {이미지 이름:태그이름}
# 이미지 삭제
docker image rm {이미지명}
# Dockerfile로부터 이미지 빌드
docker image build
# 사용하지 않는 이미지 삭제
docker image prune
도커 컨테이너 명령어
# 이미지를 컨테이너로 실행
docker container run {이미지명}
# 중지 중인 컨테이너 실행
docker container start {컨테이너 ID}
# 도커 컨테이너 목록 확인
docker container ls -a
# 컨테이너 내부 접속
docker container run -it {이미지명}
# 컨테이너 내부 접속
docekr container attach {컨테이너 ID}
# 실행 중인 컨테이너에 명렁어 실행
docker container exec
# 실행 중인 컨테이너 멈추기
docker container stop {컨테이너 ID}
# 컨테이너 삭제
docker container rm {컨테이너 ID}
Dockerfile
도커 이미지를 생성하기 위한 지시사항들을 포함하는 텍스트 파일
- 도커 이미지를 구성하는 과정을 자동화하고, 이미지가 어떻게 빌드되어야 하는지 세부 사항을 정의할 수 있음
- 이미지 빌드를 반복 가능하게 하고, 버전 관리 시스템을 통해 이미지 구성을 관리하기 편함
- 도커 이미지 저장
- 도커 파일 빌드
- 도커 파일은 이미지 빌드 과정이 완전히 재현 가능함
- 이미지 구성을 쉽게 유지보수 할 수 있음
- 컨테이너 커밋
- 커밋으로 생성된 이미지는 해당 컨테이너의 변경 사항만을 포함하므로, 컨테이너 커밋을 통해 생성된 이미지를 다른 환경에서 재현하기 힘듦
- 프로세스가 런타임 중 수행한 변경 사항을 포함할 수 있기에 이미지의 일관성, 안전성이 보장되지 않음
- 실행 중인 컨테이너의 파일 시스템 변경 사항을 그대로 포함하므로 이미지 크기가 커질 수 있음
- 도커 파일 빌드
Dockerfile 작성
- 베이스 이미지 선택
- 기존 이미지를 기반으로 시작하는데, 이를 베이스 이미지라 함
- 필요한 파일 및 명령 추가
- 베이스 이미지 위에 필요한 파일과 명령을 추가함
- 파일 복사, 환경 변수 설정, 응용 프로그램 설치 등의 작업
- 작업 디렉토리 설정
- 이미지 내에서 작업 디렉토리를 설정하여 파일을 추가하거나 명령을 실행하는 위치를 지정함
- 병렬 실행
- 이미지 내에서 실행할 명령을 정의함
- RUN, CMD, ENTRYPOINT 등의 명령어
- 포트 노출
- 이미지가 실행될 때 개발할 포트를 지정함
- EXPOSE 명령을 사용하여 컨테이너 내부에서 개방할 포트를 명시함
- 이미지 메타데이터 설정
- 이미지의 메타데이터를 설정함
명령어 설명 예시
| FROM | 베이스 이미지 지정 | FROM ubuntu:20.04 |
| WORKDIR | 작업 디렉토리 설정 | WORKDIR /usr/src/app |
| ENV | 환경 변수 설정 | COPY app /usr/src/app |
| COPY | 호스트 파일 시스템에서 파일이나 디렉토리를 이미지 내부로 복사 | COPY app /usr/src/app |
| ADD | COPY와 유사하지만 추가 기능을 지원함 / URL로부터 파일을 다운로드하거나 압축 파일을 풀 수 있음 | ADD https://example.com/file.txt/app/ |
| RUN | 컨테이너 내에서 실행할 명령어 정의 / 패키지 설치, 파일 복사, 응용프로그램 빌드 등 | RUN apt-get update |
| EXPOSE | 컨테이너가 개방할 포트 지정 | EXPOSE 80 |
| CMD | 컨테이너가 실행될 때 실행할 명령어 지정 | CMD [”npm”, “start”] |
| ENTRYPOINT | 컨테이너가 실행될 때 항상 실행할 명렁어 | ENTRYPOINT [”npm”, |
| ”start”] | ||
| VOLUME | 호스트와 컨테이너 간 볼륨을 공유 | VOLUME /data |
Dockerfile 예시
# 베이스 이미지 선택
FROM node:14
# 작업 디렉토리 설정
WORKDIR /app
# 애플리케이션 종속성 설치
COPY package.json package-lock.json /app/
RUN npm install
# 애플리케이션 파일 추가
COPY . /app/
# 포트 노출
EXPOSE 3000
# 컨테이너 실행 시 실행될 명령
CMD ["npm", "start"]
Dockerfile 빌드
- 도커 이미지를 빌드하기 위해 사용하는 명령어 : docker buile [옵션] 경로
- 옵션
- -t : 빌드된 이미지에 태그를 지정
- -f : 사용할 도커파일의 경로를 지정
- -q : 빌드 진행 상황 메시지를 출력하지 않음
- —build-arg : 도커 파일 내에서 ARG 지시문에 전달할 빌드 인자를 지정
- 빌드 예시
docker build -t my-node-app .
반응형
'Cloud' 카테고리의 다른 글
| 코드형 인프라 (IaC)란? (0) | 2025.05.28 |
|---|---|
| [IaC] Terraform을 사용한 AWS 인프라 배포 자동화 (1) | 2025.01.22 |
| [k8s] EKS에서 Karpenter 사용하기 (2) (1) | 2025.01.05 |
| [k8s] EKS에서 Karpenter 사용하기 (1) (0) | 2025.01.05 |
| [k8s] karpenter란? (2) | 2025.01.04 |