시작하며
안녕하세요! 저는 데보션영 3기 Techwave팀의 신중은입니다! 오늘은 지난 실용주의 글쓰기 세미나를 이어서 9월 26일에 열린 37차 테크 세미나의 리뷰를 작성하겠습니다. 이번 세미나는 Docker Captain인 염근철님의 발표로 진행되었습니다. 세미나 주제는 "Docker를 활용한 효율적 개발 및 보안전략"이었으며, Docker의 핵심 기능들을 보다 효율적으로 활용하는 방법과 최신 기능에 대한 소개를 하는 것이 세미나의 주요한 내용입니다.
발표자 소개
발표자는 도커캡틴으로 활동하고 계씬 염근철님이었습니다.
- 현) 당근 SRE팀 소속
- Docker Captain 🐳
- 프로젝트
- SKHynix: 사내 머신러닝 대회 플랫폼 (If-Kaggle) 개발
- 우리은행: AI 서비스 허브 개발
발표 목차
발표 목차는 다음과 같습니다.
1. Docker 이미지 Best Practices
2. Docker에서 제공하는 효율적 개발 기능
- Docker Init
- Compose Watch
- Compose Profile
3. Docker Build Cloud
4. Docker 보안 (Docker Scout)
5. Docker Extensions
6. Docker 커뮤니티와 참여 방법
7. Q&A 세션
게시물 홍보
주요 내용을 정리하기 전에 도커가 무엇인지 익숙하지 않은 분들은 과거에 작성해둔 블로그가 있어서 해당 게시물을 읽고 이 게시물을 읽으면 많은 도움이 될 것 같습니다.
시리즈 시작 : https://haward.tistory.com/182
1. Docker 이미지 Best Practices
DockerFile은 도커에서 독자적으로 만들었고 개선되고 있는 기술입니다. 컨테이너 기술의 기본이 되지만 도커에서 만든 것입니다.
Docker 이미지를 최적화하는 방법은 빠른 빌드 속도와 보안성 강화를 위해 반드시 알아야 할 중요한 내용입니다. 도커 파일을 이용해서 빌드할 때 활용 가능한 여러 기능이 있는데, 그런 기능을 소개하도록 하겠습니다.
시작하면서 강사님께서 도커파일에 대한 가벼운 설명을 해주셨습니다.(자세한 내용은 강의참고)
1.1 슬림(Slim) 이미지와 알파인(Alpine) 이미지 사용
기본 이미지는 기능이 풍부하지만 용량이 큽니다.예를 들어, node:16 이미지는 300MB가 넘는 반면, node:16-slim은 62MB에 불과합니다.작은 이미지를 사용하면 빌드와 실행 속도가 빨라지고, 보안상 취약점도 줄어듭니다. 불필요한 패키지가 제거되므로 공격 표면이 줄어듭니다. 프로덕션에서 이미지 용량에 영향을 많이 끼치기 때문에 베이스 이미지의 크기가 작아지는 건 큰 의미가 있습니다.
[사용 예시]
FROM node:16-slim
1.2 특정 버전 명시 (latest 태그 지양)
latest 태그는 항상 최신 버전으로 업데이트되어 예상치 못한 문제를 일으킬 수 있습니다.
특정 버전을 명시하여 안정적인 환경을 유지하는 것을 권장합니다.
FROM python:3.9-slim
1.3 멀티 스테이지 빌드 활용
Dockerfile에서 여러 단계로 나누어 빌드하여 최종 이미지를 최적화해서 크기를 줄일 수 있습니다.
예를 들면 빌드를 하기 위한 스테이지를 따로 두고, 최종 프로덕션을 하기 위한 스테이지를 따로 두면, 이미지의 크기를 확실하게 줄일 수 있습니다.(예시 리액트의 모듈 다운로드 이후 빌드 진행 → 프로덕션에는 그러한 라이브러리는 필요 없이 빌드된 결과물만 필요하지만 잔여 패키지의 용량이 너무 크다.)
빌드 과정에서 필요한 라이브러리는 첫 번째 단계에서 설치를 진행하고 이후 최종 이미지에는 빌드 이후에는 굳이 라이브러리가 필요 없습니다. 최종 프로덕션 이미지는 경량화된 결과물만 포함하는 장점을 얻을 수 있습니다.
# Stage 1: Build Stage
FROM node:16 AS builder
WORKDIR /app
COPY package.json ./
RUN npm install
COPY . .
RUN npm run build
# Stage 2: Production Stage
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
1.4 Health Check 추가
헬스체크를 도커파일에 추가해주면 컨테이너가 정상적으로 실행되고 있는지 알 수가 있습니다. 컨테이너 상태를 지속적으로 확인하고 문제가 발생하면 즉시 감지하도록 설정합니다. 이 기능은 쿠버네티스에서 컨테이너를 올릴 때도 의미가 있습니다.
HEALTHCHECK --interval=30s --timeout=10s \\
CMD curl -f <http://localhost:8080/health> || exit 1
1.5 .dockerignore 파일 활용
.dockerignore 파일을 사용하여 빌드 과정에서 불필요한 파일을 제외할 수 있습니다.
이 기능은 Docker에서 Copy 명령을 자주 수행하는데 그 때 속도를 많이 단축하고 환경설정 파일을 숨기는데 유용하게 사용할 수 있습니다.
node_modules/
.env
*.log
이를 통해 빌드 속도의 증가와 보안적 안정성을 얻을 수 있습니다.
1.6 마운트 캐시 활용
도커파일에서 RUN Command 뒤에 --mount=type=cache 라고 적어주면 바인딩타입, 시크릿타입, 캐시타입 등 다양한 타입이 있습니다.
런 커맨드를 실행하면 특정 명령어를 리눅스 명령어를 실행하는 건데, 이걸 두면 커맨드를 실행할 때 해당 환경으로 마운트를 해준다.는 의미 입니다.
빌드 시 반복적으로 사용되는 데이터는 -mount 옵션을 사용해 캐싱할 수 있습니다.
RUN --mount=type=cache,target=/root/.cache \\
pip install -r requirements.txt
2. Docker에서 제공하는 생산성 도구
2.1 Docker Init
새로운 프로젝트를 시작할 때 docker init 명령어를 사용하면 프레임워크에 맞는 초기 설정 파일이 자동 생성됩니다. (oh.. 그동안 저는 다 만들었어요..)
docker init
자동 생성 파일은 Dockerfile과 docker-compose.yml 입니다.
2.2 Compose Watch
Compose Watch는 로컬파일 즉 코드 변경 사항을 자동으로 감지하여 컨테이너를 재시작하거나 동기화하는 기능입니다.
발표자님은 이 기능을 실제 개발 환경에서 어떻게 사용할 수 있는지 직접적인 예시와 함께 보여주셨습니다. Watch 기능을 활용하면 코드를 저장하는 즉시 변경 사항이 반영되어, 개발 생산성을 높이고 디버깅 과정을 단축시킬 수 있습니다.
Compose Watch의 세 가지 중요한 옵션
1. Sync 옵션: 파일을 단순히 동기화하여 컨테이너 내부에 반영함
2. Rebuild 옵션: 지정된 파일이 수정될 때 컨테이너를 재구축
3. Restart 옵션: 변경된 파일을 반영하기 위해 컨테이너를 재시작
사용 예시
services:
app:
build:
context: .
dockerfile: Dockerfile
volumes:
- .:/app
command: npm start
실습 예제: Compose Watch의 활용
실습에서는 requirements.txt 파일과 app.py 파일을 대상으로 Watch 기능을 적용하였습니다. requirements.txt 파일이 변경되면 패키지를 다시 설치하고 컨테이너를 재구축하는 동작을 설정했고, app.py가 수정될 경우, 해당 파일이 컨테이너 내부에서 실시간으로 반영되어 즉각적으로 변화를 확인할 수 있었습니다. 특히, 파일 저장만으로도 컨테이너가 즉각적인 반응을 보여주는 것은 전통적인 서버 환경보다 훨씬 빠르게 피드백을 받을 수 있다는 점이 큰 장점으로 다가왔습니다.
2.3 Compose Profile
개발과 배포 환경을 분리하여 효율적으로 관리하는 기능입니다.
개발 환경에서는 디버깅 컨테이너 추가를 하는 것이 가능하고 배포 환경에서는 필요한 컨테이너만 실행하는 것이 가능합니다.
흔히 Spring에서 profile prod, dev로 나눠서 개발하는 것을 생각했습니다.
3. Docker Build Cloud
Docker Build Cloud는 로컬 환경이나 특정 서버에서 빌드를 실행하는 대신, Docker가 제공하는 클라우드 환경에서 빌드를 실행해 로컬 자원을 절약할 수 있는 새로운 기능입니다.
이 기능을 활용하면, 로컬 자원을 사용하지 않고 클라우드에서 빠르고 효율적으로 빌드를 진행할 수 있으며, 빌드 캐시를 클라우드에 저장하여 빌드 시간도 크게 단축시킬 수 있습니다.
3.1 주요 장점
주요 장점은 크게 3가지가 있습니다.
- 캐시 공유: 로컬 환경과 클라우드 간 캐시를 공유해 빌드 속도를 대폭 향상.
- 다양한 아키텍처 지원: ARM 기반 환경이나 다양한 아키텍쳐를 지원해서 어디서도 원활히 빌드가 가능.
- 비용 절감: 과금이 발생할 수 있지만, 실제 CI/CD 환경에서 많은 빌드가 필요하다면 비용 대비 시간 절약 효과가 클 것이다.
3.2 꿀팁
발표자님은 Docker Build Cloud를 CI/CD 환경에 쉽게 적용할 수 있는 방법도 소개해 주셨습니다.
Git 저장소와 직접 연결하여 코드를 클론하고, 즉각적으로 클라우드에서 빌드를 수행함으로써 GitHub Actions 또는 Jenkins와 같은 도구와 통합해 사용할 수 있습니다. 이를 통해 회사와 팀이 구축한 클라우드 환경에 빌드 작업을 분산시켜 로컬 자원을 절약하고, 개발 환경의 일관성을 유지할 수 있습니다.
4. Docker Scout
Docker Scout는 이미지와 패키지의 보안 취약점을 탐지 및 관리하는 도구입니다.
이 기능은 단독으로 취약점을 검사하는 스캐너라기보다, 여러 보안 스캐닝 도구에서 제공하는 취약점 정보를 종합하여, 개발자가 쉽게 이해하고 대응할 수 있도록 돕는 도구입니다.
4.1 주요 기능
- SBOM(Software Bill of Materials): 이미지 내 사용된 패키지를 확인.
- 오픈소스 취약점 관리 : 오픈소스 컴포넌트의 취약점을 체계적으로 관리하여 보안성을 높입니다.
- 통합 취약점 점검: 다른 보안 도구의 데이터를 취합하여, 취약점에 대한 상세한 정보를 이미지와 패키지의 보안 취약점을 종합적으로 분석.
- CI/CD 통합 가능: 빌드 프로세스(CI/CD 환경) 에서 Docker Scout를 통합해 빌드 및 배포 단계에서 발생하는 보안 위협을 관리해서 자동 점검 가능
docker scout sbom my-image:latest
발표자님은 실제로 Docker Scout를 통해 취약점을 확인하는 예시를 보여주며, Scout를 CI 환경과 통합하면 빌드 프로세스에서 발생하는 보안 취약점을 자동으로 감지하고 관리할 수 있다고 강조하셨습니다. 특히, Scout를 CI 파이프라인에 추가하면, 취약점이 심각한 경우 빌드를 중단하여 문제를 미리 방지할 수 있는 점이 큰 장점입니다.
5. Docker Extensions
Docker Desktop에서는 Docker Extension 기능을 통해 다양한 도구를 설치하여 Docker를 더욱 확장해서 사용할 수 있습니다.
추천 확장 기능
1. Log Explorer : 컨테이너 로그를 실시간으로 모니터링 분석할 수 있는 기능을 제공. 특정 컨테이너에서 발생하는 문제나 에러 로그를 빠르게 파악하여 디버깅을 효율적으로 수행할 수 있다. 다양한 필터링과 검색 기능을 통해 필요한 로그만 선택적으로 확인할 수 있는 점도 큰 장점이다. (https://hub.docker.com/r/docker/logs-explorer-extension)
2. Disk Usage Analyzer: Docker에서 사용 중인 디스크 공간을 분석하고 관리할 수 있도록 도와준다. 이미지, 컨테이너, 볼륨이 차지하는 용량을 시각적으로 표현해주기 때문에 불필요하게 차지하고 있는 저장 공간을 쉽게 식별하고 관리할 수 있다. 이를 통해 Docker 환경의 디스크 사용량을 최적화할 수 있다.(https://hub.docker.com/extensions/docker/disk-usage-extension)
이외에도 발표에서 여러 오픈소스 확장 프로그램을 직접 설치하고 사용하는 방법을 시연하며, 실제 개발자들이 일상에서 유용하게 사용할 수 있는 다른 도구들을 소개해주셨습니다.
마치며
세미나는 Docker의 기본부터 고급 기능까지 깊이 있는 내용을 다뤘습니다. 특히, Build Cloud와 Scout를 활용해 프로젝트의 효율성을 높이고 보안을 강화할 수 있는 구체적인 방안을 배울 수 있었습니다.
도커를 이미 개발하면서 많이 사용하고 있지만, 정말 모르는 기능도 많았고, 새롭게 알게된 부분이 많아서 앞으로 개발할 때 소중한 자원이 될 것 같습니다. Docker의 고급 기능을 효과적으로 활용하여 개발 생산성을 높일 수 있을 것 같고 명확하게 이해하도록 도와주셔서 몰입이 잘 되었습니다.
유익한 세미나를 준비해주신 염근철님과 데보션 테크세미나 주최를 해주시는 모든 분들께 감사드리고 언젠가 저도 이렇게 세미나에 초대받는 개발자가 되도록 오늘도 열심히 공부해보겠습니다.
감사합니다.
강의 영상
- https://devocean.sk.com/vlog/20240926_docker.mp4
- https://devocean.sk.com/blog/techBoardDetail.do?ID=166851&boardType=techBlog
'후기' 카테고리의 다른 글
데보션 전문가를 만나다) 커리어, 기술, 그리고 성장의 비결 (2) | 2024.11.25 |
---|---|
SKT 미래기술 체험관 티움(T.um) 투어 후기 (1) | 2024.11.24 |
[9월 데보션영 영전용 세미나 후기] 개발자로서 성장과 취업을 모두 잡은 세미나 후기 공유 (3) | 2024.11.23 |
[취업준비에 대한 현실적인 조언!] 취업준비가 막막할 때 찾아온 데보션영 3기 영전용 8월 세미나 후기 (0) | 2024.11.22 |
Aws saa C03 후기 (1) | 2024.08.07 |