이미지란?
컨테이너를 실행하기 위한 모든 파일, 라이브러리, 설정 등을 포함한 읽기 전용 템플릿
- Dockerfile을 사용하여 이미지를 생성
- 컨테이너를 생성하기 위한 템플릿 역할
이미지 이름 구성
<레지스트리>/<계정 이름>/<이미지 이름>:<태그>
- 레지스트리: 이미지를 저장하고 관리하는 원격 저장소
- 계정 이름: 이미지 소유자를 구분하기 위한 네임스페이스
- 이미지 이름: 이미지의 고유 이름
- 태그: 이미지 버전
예시
Docker Hub의 공식 Nginx 이미지
- docker.io/library/nginx:latest 를 의미
nginx:latest
이미지 레이어
도커의 이미지는 여러 이미지 레이어가 중첩된 형태로, 각 레이어는 이전 레이어의 변경 사항을 가지고 있음
- 예를 들어 nginx 이미지를 다운 받을 때, ubuntu 이미지가 존재하는 경우 nginx 레이어만 다운받음 → 이를 통해 효율성과 재사용성을 높임
- 이미지 레이어는 Dockerfile의 RUN, COPY, ADD 명령 실행 결과로 생성됨
- 이미지 레이어는 읽기 전용 계층(Read-Only layer) → 이미지의 불변성 유지를 위해
- 컨테이너 생성 시, 읽기/쓰기 전용 레이어(R/W layer)를 추가하여 애플리케이션 실행 중 변경사항을 저장함

nginx 이미지의 레이어 구조 확인하기
nginx 이미지는 debian 기반의 베이스 이미지에 LABEL, ENV, RUN, COPY 등 명령어를 통해 생성된 여러 레이어가 중첩된 형태임을 확인할 수 있음
$ docker history nginx
IMAGE CREATED CREATED BY SIZE COMMENT
bdf62fd3a32f 2 weeks ago CMD ["nginx" "-g" "daemon off;"] 0B buildkit.dockerfile.v0
<missing> 2 weeks ago STOPSIGNAL SIGQUIT 0B buildkit.dockerfile.v0
<missing> 2 weeks ago EXPOSE map[80/tcp:{}] 0B buildkit.dockerfile.v0
<missing> 2 weeks ago ENTRYPOINT ["/docker-entrypoint.sh"] 0B buildkit.dockerfile.v0
<missing> 2 weeks ago COPY 30-tune-worker-processes.sh /docker-ent… 4.62kB buildkit.dockerfile.v0
<missing> 2 weeks ago COPY 20-envsubst-on-templates.sh /docker-ent… 3.02kB buildkit.dockerfile.v0
<missing> 2 weeks ago COPY 15-local-resolvers.envsh /docker-entryp… 389B buildkit.dockerfile.v0
<missing> 2 weeks ago COPY 10-listen-on-ipv6-by-default.sh /docker… 2.12kB buildkit.dockerfile.v0
<missing> 2 weeks ago COPY docker-entrypoint.sh / # buildkit 1.62kB buildkit.dockerfile.v0
<missing> 2 weeks ago RUN /bin/sh -c set -x && groupadd --syst… 99.9MB buildkit.dockerfile.v0
<missing> 2 weeks ago ENV DYNPKG_RELEASE=1~bookworm 0B buildkit.dockerfile.v0
<missing> 2 weeks ago ENV PKG_RELEASE=1~bookworm 0B buildkit.dockerfile.v0
<missing> 2 weeks ago ENV NJS_RELEASE=1~bookworm 0B buildkit.dockerfile.v0
<missing> 2 weeks ago ENV NJS_VERSION=0.8.7 0B buildkit.dockerfile.v0
<missing> 2 weeks ago ENV NGINX_VERSION=1.27.3 0B buildkit.dockerfile.v0
<missing> 2 weeks ago LABEL maintainer=NGINX Docker Maintainers <d… 0B buildkit.dockerfile.v0
<missing> 2 weeks ago # debian.sh --arch 'arm64' out/ 'bookworm' '… 97.2MB debuerreotype 0.15
dive 명령으로 레이어마다 어떤 디렉터리가 속하는지 확인할 수 있음
$ dive nginx

컨테이너를 이미지로 만들기
실행 중인 nignx 컨테이너 내부로 접속
$ docker exec -it some-nginx /bin/sh

html 내용 변경하기
$ cd /usr/share/nginx/html
$ echo "My awesome website" > index.html
localhost:8080 접속해보면 내용이 변경됨

container commit 명령으로 some-nginx 컨테이너를 frontend 이미지로 생성
$ docker container commit some-nginx frontend:latest
$ docker images

기존에 실행 중이던 some-nginx 컨테이너 삭제하고, frontend 이미지로 새로운 컨테이너 생성
$ docker stop some-nginx
$ docker rm some-nginx
$ docker run --name my-website -d -p 8080:80 frontend:latest

localhost:8080 접속해보면, 기본적인 nginx에 html 내용이 변경된 컨테이너가 생성된 것을 확인할 수 있음

'DevOps > Docker' 카테고리의 다른 글
[Docker] Multi-stage build (0) | 2024.12.31 |
---|---|
[Docker] docker compose (0) | 2024.12.31 |
[Docker] Volume (0) | 2024.12.31 |
[Docker] Dockefile (0) | 2024.12.31 |
[Docker] Docker 설치 및 기본 명령어 (0) | 2024.12.31 |