제목
[k8s] Docker&K8s
관련 게시글
[k8s] Docker&K8s
목차
0. 들어가면서
1. Docker 주요 개념
2. 컨테이너 이미지 빌드
3. 주요 명령어
4. 참고할 수 있는 사이트
0. 들어가면서
최근, 프로젝트 구성에 도커&쿠버네티스를 활용키로 했습니다.
프로젝트 서버는 linux, 개발 OS는 mac, windows를 사용하기에,
상대적으로 환경에 독립적인 docker를 사용하기로 했습니다.
추가로, 컨테이너 관리를 효율적으로 할 수 있는 쿠버네티스를 곁들이면서
유연성과 고가용성을 확보할 수 있을 것으로 보았습니다.
마침, 도커&쿠버네티스 스터디에 들어갈 기회가 생겼고,
이를 체득하여, 프로젝트에 잘 녹여내야겠다고 다짐하며 글을 작성해보려고 합니다.
1. Docker 주요 개념
1.1 도커(Docker)
Docker는 애플리케이션을
컨테이너라는 격리된 환경에서 실행하기 위한 오픈 소스 플랫폼입니다.
컨테이너는 가벼운, 실행 가능한 소프트웨어 패키지로,
애플리케이션이 실행되는데 필요한
코드, 런타임, 시스템 도구, 시스템 라이브러리, 설정 등 모든 것을 포함합니다.
1.2. 이미지(Image)
Docker 이미지는 애플리케이션과 그 종속성을 포함하는 경량의, 독립적인, 실행 가능한 소프트웨어 패키지입니다.
이미지는 애플리케이션을 실행하는데 필요한 모든 것을 포함하고 있으며,
컨테이너를 생성하는 데 사용됩니다.
1.3. 컨테이너(Container)
Docker 컨테이너는 Docker 이미지의 실행 인스턴스입니다.
이미지를 실행하면, 이미지의 스냅샷인 컨테이너가 메모리에서 실행됩니다.
각 컨테이너는 서로 격리되어 있으며,
자체 파일 시스템, 자체 네트워크 인터페이스를 가지며,
자체 프로세스 공간 내에서 실행됩니다.
1.3.1. 컨테이너 네트워크
컨테이너 간 연결, 또는 컨테이너와 외부 환경 간 연결을 위해서 네트워크 설정이 필요합니다.
도커 컨테이너 네트워크의 기본 모델은 Bridge, Host, None입니다.
None으로 네트워크 설정을 진행한다면, 컨테이너는 철저히 격리됩니다.
컨테이너 간, 외부 연결 모두 단절됩니다.
Host설정을 진행하면, 컨테이너는 Host 환경(127.0.0.1)을 사용합니다.
Bridge는 기본 설정으로, 도커의 ip(172.17.0.0)를 사용합니다.
1.4. 이점
1.4.1. 일관성
Docker를 사용하면 개발, 테스트, 프로덕션 환경 간에 일관된 환경을 유지할 수 있습니다.
Docker 이미지는 모든 곳에서 동일하게 실행됩니다.
1.4.2. 빠른 배포 및 확장성
Docker 컨테이너는 가볍고 빠르게 시작됩니다.
이를 통해 애플리케이션의 배포와 확장을 손쉽게 할 수 있습니다.
1.4.3. 격리성
각 컨테이너는 서로 독립적으로 실행되며,
애플리케이션 간의 충돌을 줄이고 보안을 강화합니다.
1.4.4. 자동화
Dockerfile과 Docker Compose를 사용하여 애플리케이션의 빌드, 배포, 실행 과정을 자동화할 수 있습니다.
Docker는 개발자와 시스템 관리자 모두에게 애플리케이션의 개발, 배포, 실행을 더 쉽고 빠르게 만들어주는 강력한 도구입니다.
2. 컨테이너 이미지 빌드
도커 컨테이너 이미지 빌드는 도커 파일을 통해 이루어집니다.
2.1. 도커 파일(Dockerfile)
Dockerfile은 Docker 이미지를 자동으로 빌드하기 위한 스크립트입니다.
이 파일에는 이미지를 생성하기 위한 명령어와 순서가 포함되어 있습니다.
Dockerfile을 사용하면 애플리케이션과 그 종속성을 코드 형식으로 관리할 수 있습니다.
2.2. 멀티 스테이지 빌드
이미지 빌드 시, 빌드 용 스테이지와 실행 용 스테이지를 분리하면,
이미지 크기를 줄일 수 있습니다.
아래 파일은, 최근에 작성한 DockerFile로,
이미지를 node로 빌드하는 스테이지와
실행 파일을 nginx로 서빙하는 스테이지로 분리한 스크립트입니다.
(1.5GB에서 220MB로 용량을 줄일 수 있었습니다)
### Stage 1: React 빌드
# 빌드를 로컬에서 진행하면 생략가능
FROM node:22-slim AS builder
# 작업 디렉터리 설정
WORKDIR /app
# package.json과 package-lock.json을 복사하여 캐시 활용
COPY package.json package-lock.json ./
# 의존성 설치
RUN npm install
# 소스 코드 전체 복사
COPY . .
# React 빌드 실행 (dist 폴더 생성)
RUN npm run build
### Stage 2: Nginx를 통한 정적 파일 서빙
FROM nginx:alpine
# 작업 디렉터리 설정 (기본 Nginx 루트)
WORKDIR /usr/share/nginx/html
# 빌드된 React 정적 파일 복사 (index.html 등 직접 서빙할 수 있도록)
# Stage 1을 생략하면 주석처리된 코드로 변경
#COPY dist /app/dist
COPY --from=builder /app/dist/ .
# 사용자 정의 Nginx 설정 파일 복사 (nginx 디렉터리 내 구성파일들이 있다고 가정)
COPY nginx /etc/nginx
# Nginx 실행 (foreground 모드)
ENTRYPOINT ["nginx", "-g", "daemon off;"]
3. 주요 명령어
# 가동중인 컨테이너 확인
docker ps
# 컨테이너 전체 확인
docker ps -a
# 도커 파일 빌드, 태그명 myapp, 파일 명 위치 설정
docker build -t myapp -f dockerfile .
# 컨테이너 detached 모드로 실행, 외부포트8088, 컨테이너 포트 8080, 컨테이너 이름 myapp
docker run -d -p 8088:8080 --name myapp
# 컨테이너 터미널에 접근
docker exec -it myapp /bin/bash
# 이미지 확인
docker images
# 모든 컨테이너 중지
docker stop $(docker ps -aq)
# 모든 컨테이너 삭제
docker rm $(docker ps -aq)
# 모든 이미지 삭제
docker rmi $(docker images -aq)
# 이미지 push
docker push 이미지이름
# 이미지 pull
docker pull 이미지이름
# 지원 가능한 아키텍처 확인
docker buildx ls
# 이미지에서 지원하는 아키텍처 확인
docker inspect 이미지명 | grep Architecture
4. 참고할 수 있는 사이트
docker compose와 dockerfile을 작성할 때 참고할 수 있는 repository를 소개드립니다.
https://github.com/docker/awesome-compose
GitHub - docker/awesome-compose: Awesome Docker Compose samples
Awesome Docker Compose samples. Contribute to docker/awesome-compose development by creating an account on GitHub.
github.com
근래까지 업데이트 되지 않은 아키텍처가 있지만,
전체적인 흐름을 파악하기 좋습니다.