[DEVOPS-002][입문] Docker 이미지와 컨테이너 이해하기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[DEVOPS-002][입문] Docker 이미지와 컨테이너 이해하기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 263회 작성일 26-08-29 23:33

본문

[이번 수업]

Docker 이미지와 컨테이너의 관계를 배웁니다. Dockerfile로 작은 이미지를 만들고 비루트 사용자, 읽기 전용 파일시스템, capability 제거 옵션으로 컨테이너를 한 번 실행합니다.

[선수지식]

DEVOPS-001의 개발·배포·운영 흐름과 OS-002의 프로세스 개념을 알면 됩니다. Windows·macOS는 Docker Desktop, Linux는 Docker Engine이 설치되어 있어야 하며 docker version에서 Client와 Server가 모두 보여야 합니다.

[학습목표]

1. 이미지와 컨테이너를 설계도와 실행 인스턴스로 구분한다.
2. Dockerfile의 FROM·WORKDIR·COPY·USER·CMD를 설명한다.
3. 이미지를 빌드하고 제한된 옵션으로 컨테이너를 실행한다.


[핵심개념]

이미지는 애플리케이션 실행에 필요한 파일, 설정, 기본 명령을 담은 읽기 전용 템플릿입니다. Dockerfile 명령을 따라 빌드하며 변경 내용은 재사용 가능한 계층으로 쌓입니다.

컨테이너는 이미지로부터 만든 격리된 실행 인스턴스입니다. 실행할 때 쓰기 가능한 얇은 계층이 추가되며 같은 이미지에서 여러 컨테이너를 만들 수 있습니다. 각 컨테이너의 쓰기 내용은 서로 다르고 컨테이너를 삭제하면 사라질 수 있으므로 영속 데이터는 명시적인 볼륨이나 외부 저장소에 둡니다. 컨테이너는 완전한 가상머신이 아니라 호스트 커널을 공유하는 격리된 프로세스입니다.

Dockerfile은 이미지를 만드는 선언 파일입니다. FROM은 기반 이미지, WORKDIR은 이후 작업 위치, COPY는 빌드 컨텍스트의 파일 복사, USER는 실행 사용자, CMD는 기본 실행 명령을 지정합니다. docker build는 이미지를 만들고 docker run은 그 이미지에서 새 컨테이너를 생성해 시작합니다. 컨테이너의 주 프로세스가 끝나면 컨테이너도 중지되며 --rm은 중지된 컨테이너를 자동 삭제하지만 이미지는 남깁니다.

[따라하기]

빈 폴더에 Dockerfile과 message.txt를 만듭니다. message.txt 내용은 다음 한 줄입니다.

컨테이너 안에서 안전하게 실행됨

Dockerfile에는 다음을 저장하세요.

# syntax=docker/dockerfile:1
FROM busybox:1.37.0
WORKDIR /app
COPY --chown=65532:65532 message.txt .
USER 65532:65532
CMD ["cat", "message.txt"]

공식 BusyBox 이미지를 기반으로 파일 하나만 복사하고 숫자 UID·GID의 비루트 사용자로 실행합니다. Windows PowerShell·명령 프롬프트, macOS 터미널, Linux 셸에서 폴더로 이동한 뒤 같은 명령을 사용합니다.

docker build --pull -t lesson-message:1 .
docker image inspect lesson-message:1 --format '{{.Config.User}}'
docker run --rm --read-only --cap-drop=ALL lesson-message:1

예상 결과는 inspect에서 65532:65532, 실행에서 다음 문장이 나오는 것입니다.

컨테이너 안에서 안전하게 실행됨

--read-only는 컨테이너 루트 파일시스템 쓰기를 막고 --cap-drop=ALL은 Linux capability를 제거합니다. cat 프로세스가 끝나면 컨테이너는 자동 삭제됩니다. docker image ls lesson-message로 이미지는 남아 있는지 확인할 수 있습니다. 태그와 이미지 ID는 환경마다 다릅니다.

[흔한 실수]

첫째, 이미지를 실행 중인 프로세스라고 생각합니다. 실행되는 것은 컨테이너입니다. 둘째, 컨테이너 안에서 수동 수정한 내용을 배포 방법으로 사용합니다. 재현하려면 Dockerfile을 바꾸고 다시 빌드해야 합니다. 셋째, latest 태그만 믿어 같은 내용이라고 가정합니다.

[보안 주의]

Dockerfile, COPY 대상, ENV, 빌드 인자에 비밀번호나 API 키를 넣지 마세요. 이미지 계층과 기록에 남을 수 있습니다. 신뢰할 수 있는 최소 기반 이미지를 선택하고 취약점 점검과 정기 재빌드를 수행합니다. 기본적으로 비루트 USER를 쓰고, --privileged와 Docker 소켓 마운트는 피하며, 필요한 파일·네트워크·capability만 허용하세요. 운영에서는 CPU·메모리 제한도 정합니다.

[직접 해볼 과제]

message.txt를 바꾸고 lesson-message:2로 다시 빌드해 두 이미지의 ID를 비교하세요. 이어서 --read-only를 유지한 채 CMD가 /tmp에 파일을 쓰도록 바꾸면 왜 실패하는지 확인하고 원래 안전한 예제로 되돌리세요.

[확인문제]

1. 이미지와 컨테이너는 읽기·실행·수명 측면에서 어떻게 다른가요?
2. --rm이 삭제하는 것과 남기는 것은 무엇인가요?
3. Dockerfile에 비밀값을 넣으면 안 되는 이유는 무엇인가요?

[다음 학습]

순환 커리큘럼의 다음 글은 SEC-002 비밀번호·해시·MFA입니다. DevOps 트랙에서는 DEVOPS-003 Docker Compose로 여러 서비스 실행으로 이어집니다.

[공식 참고 자료]

Docker 이미지 개념
https://docs.docker.com/get-started/docker-concepts/the-basics/what-is-an-image/

Docker 컨테이너 개념
https://docs.docker.com/get-started/docker-concepts/the-basics/what-is-a-container/

Dockerfile 개요
https://docs.docker.com/build/concepts/dockerfile/

Docker 빌드 모범 사례
https://docs.docker.com/build/building/best-practices/

BusyBox 공식 이미지
https://hub.docker.com/_/busybox

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
402
어제
5,103
최대
16,772
전체
771,456
Copyright © 소유하신 도메인. All rights reserved.