docker
도커 컨테이너는 도커 이미지를 기반으로 실행되는 독립적인 프로세스
-
높은 이식성: 어떤 환경에서도 동일하게 실행 가능
-
가벼움: 가상 머신보다 리소스 사용이 적음
-
빠른 시작/중지: 게스트 OS 부팅 없이 빠르게 실행
-
BORA (Build Once, Run Anywhere): 한 번 만든 이미지로 어디서나 실행
도커 이미지란?
도커 이미지는 컨테이너를 생성하기 위한 템플릿
구성
- 애플리케이션 코드
- 런타임 환경
- 시스템 도구
- 시스템 라이브러리
- 설정 파일
- 직접 생성: Dockerfile을 작성하여 빌드
이미지와 컨테이너의 관계
- 이미지는 정적인 템플릿 - > 요리 레시피
- 컨테이너는 이 이미지를 기반으로 실행되는 동적인 인스턴스 -> 레시피로 만든 실제 요리
컨테이너라는 이름의 유래와 의미
물류 산업의 컨테이너에서 유래
표준화된 크기의 상자로, 다양한 물건을 담아 쉽게 운송할 수 있음
-
도커 컨테이너와의 유사성
-
표준화: 어디서나 동일하게 작동하는 환경을 제공
-
독립성: 내용물(애플리케이션)을 외부 환경과 분리
-
이동성: 다양한 환경(서버, 클라우드 등)으로 쉽게 이동 가능
-
효율성: 자원을 효율적으로 사용하고 빠르게 배포 가능
'옮기는' 의미의 중요성
-
개발 환경에서 테스트 환경, 프로덕션 환경으로의 쉬운 이동
-
클라우드 간, 서버 간 애플리케이션 이동의 용이성
-
"Build Once, Run Anywhere" 개념 실현
-
도커 컨테이너는 애플리케이션과 그 실행 환경을 담아 쉽게 '옮기고' 실행할 수 있게 해줌
-
컨테이너는 애플리케이션과 그 실행에 필요한 모든 환경을 포함하는 패키지
도커 컨테이너 설계 시 주의해야 할 점

-
한 컨테이너에 한 프로세스
이유: 단일 책임 원칙을 따르며, 관리와 스케일링이 용이함
-
변경 불가능한 인프라 구현
의미: 환경 변경 시 기존 환경을 수정하지 않고 새로운 환경을 생성
방법: 필요한 모든 것을 이미지에 포함시킴
DockerFile

도커 파일의 기본 구조

- FROM: 기반 이미지 지정
- COPY: 로컬 파일을 컨테이너로 복사
- RUN: 빌드 시 실행할 명령어
- USER: 실행 계정 지정
- ENTRYPOINT: 컨테이너 실행 시 실행할 명령어
기반 이미지 선택 시 고려사항
- 알파인 리눅스: 경량화된 이미지, 많이 사용됨
- Distroless: 특정 런타임만 포함된 최소화 이미지
- scratch: 가장 기본적인 이미지, 디버깅 어려움
- UBI: 레드햇 지원 이미지, 기술 지원 필요시 유용
도커 파일 작성 원칙
- 필요한 최소한의 구성요소만 포함
- 보안을 고려한 사용자 권한 설정
- 명확하고 재현 가능한 빌드 과정 정의
이미지 크기의 중요성
- 이미지 크기는 5MB에서 210MB까지 다양함
- 작은 이미지는 빠른 배포와 효율적인 리소스 사용에 유리
ENTRYPOINT와 CMD의 관계
- ENTRYPOINT: 변경이 적은 기본 명령어
- CMD: 자주 변경되는 인수나 기본값
- 실행 시 $ENTRYPOINT $CMD 형태로 동작
이미지 빌드

빌드 명령어
- docker image build -t [이미지이름]:[태그][도커파일 위치]
- docker image build -t sample-image:0.1
빌드 과정
- 도커 파일의 각 명령어가 순서대로 실행됨
- 각 단계마다 중간 컨테이너가 생성되고 삭제됨
결과 확인
- docker image ls 명령어로 생성된 이미지 확인
- 기반 이미지도 함께 다운로드되어 로컬에 저장됨
이미지 크기
- 생성된 이미지는 기반 이미지보다 약간 더 큼
- sample-image가 기반 이미지보다 7MB 더 큼
멀티 스테이지 빌드
문제점
- 기본 빌드 방식은 컴파일 도구 등으로 인해 이미지 크기가 커짐 (예: 377MB)
해결책 : 멀티 스테이지 빌드


- 빌드 단계와 실행 단계를 분리
- 빌드 결과물만 실행용 이미지로 복사
- 이미지 크기 대폭 감소 (예: 377MB → 13.1MB)
- 보안 향상 (불필요한 도구 제거)
- 빌드 속도 향상 가능 (병렬 처리)
구현 방법
- 여러 FROM 구문 사용
- COPY --from 명령어로 이전 단계 결과물 복사
ENTRYPOINT ["./go-app"]
- 컨테이너가 시작될 때 실행할 기본 명령을 정의
- 컨테이너를 실행 가능한 애플리케이션처럼 사용할 수 있게 함
- 현재 디렉토리에 있는 'go-app'이라는 실행 파일을 실행하라는 뜻
도커 레지스트리로 이미지 업로드
- 도커 레지스트리 선택 (예: Docker Hub)
- 이미지 이름 형식 지정: [레지스트리 주소]/[사용자명]/[이미지명]:[태그]
- docker login 명령어로 레지스트리에 로그인
- docker image tag 명령어로 이미지 태그 변경
- docker image push 명령어로 이미지 업로드
- 필요시 docker logout으로 로그아웃