도커 이미지 구조
도커 이미지 구조는 새로운 변경사항이 하나씩 쌓이는 레이어 아키텍쳐 구조로 되어있다.
위의 예제를 보았을때 nginx 이미지의 경우 ubuntu 이미지를 기반으로 만들어졌기 때문에 ubuntu의 레이어가 그대로 있는 상태에서 nginx 이미지를 구성하기 위한 레이어들이 쌓이게 된다.
web app 이미지의 경우 구성된 nginx 이미지 위에 web app의 레이어가 쌓여 만들어지게 된다.
위의 예제는 web app image를 기반으로 컨테이너를 생성하였다.
컨테이너가 실행될 때 web app image layer가 복사되어 생성되는데 해당 레이어는 Read Only로 생성된다.
따라서 이미지 레이어에 있는 파일들은 변경이 불가능하다.
이와 함께 컨테이너가 생성될 때 마다 해당 컨테이너의 컨테이너 레이어가 생성되는데, 해당 레이어는 Read Write로 생성되어 수정이 가능하다.
컨테이너가 종료되어 삭제될때, 컨테이너 레이어도 함께 삭제된다.
// 도커 이미지 목록 확인
# docker images
// nginx:latest 이미지 상세정보 확인
# docker iamge inspect nginx:latest
Dockerfile 없이 이미지 생성
기존 컨테이너를 기반으로 새 이미지를 생성할 수 있다.
보통 기존 컨테이너를 실행 시킨 후, 해당 이미지에 변경성이 생겼을때 해당 변경성을 적용하여 새로운 이미지를 생성하는 경우 사용한다.
docker commit 명령어 = 변경성을 저장하는 명령어
# docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
// ubuntu 컨테이너의 현재 상태를 my_ubuntu:v1 이미지로 생성
ex) # docker commit -a fastcampus -m "First Commit" ubuntu my_ubuntu:v1
-a 옵션 : 어떤 사용자가 변경점을 남기는지를 히스토리로 남길 수 있음.
-m 옵션 : commit 메시지
Dockerfile 이용하여 이미지 생성
1. 아래와 같이 Dockerfile 작성
ex)
FROM node:12-alpine
RUN apk add --no-cache python3 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src.index.js"]
2. build 명령어를 통해 작성한 도커파일을 기반으로 이미지를 생성
# docker build [OPTIONS] PATH
ex)
./ 디렉토리를 빌드 컨텍스트로 my_app:v1 이미지 빌드 (Dockerfile 이용)
docker build -t my_app:v1 ./
./ 디렉토리를 빌드 컨텍스트로 my_app:v1 이미지 빌드 (example/MyDockerfile 이용)
# docker build -t my_app:v1 -f example/MyDockerfile ./
-t 옵션 : tag의 약자. build한 이미지에 대해서 태그를 지정해줌
-f 옵션 : 도커파일의 경로를 나타냄.
빌드 컨텍스트 (Build Context)
도커 빌드 명령 수행 시 현재 디렉토리(Current Working Directory)를 빌드 컨텍스트(Build Context)라고 한다.
Dockerfile로부터 이미지 빌드에 필요한 정보를 도커 데몬에게 전달하기 위한 목적이다.
도커 데몬이 도커 빌드 명령어를 받았을 때, 이러한 빌드 컨텍스트(Build Context)를 받음으로써 도커 빌드를 정상적으로 수행할 수 있다.
도커 빌드 명령어를 수행하게되면, 해당 디렉토리의 모든 정보가 도커 데몬한테 넘어가는것과 같다.
.dockerignore
도커 빌드 명령어를 수행했을 때, 현재 디렉토리의 안에 있는 데이터의 크기가 크다면 도커 빌드를 하는 시간이 길어지고 비효율적이게 될 수 있는데, 이러한 문제를 해결하기 위해 dockerignore 파일을 제공한다.
.gitignore와 동일한 문법을 가지고 있다. (공식 문서 참고)
특정 디렉토리 혹은 파일 목록을 빌드 컨텍스트에서 제외하기 위한 목적이다.
아래와 같이 dockerignore 파일을 지정해주면, 지정된 목록들 제외 후 빌드 컨텍스트로 전달되기 때문에 이미지에 포함되지 않아야 되는 파일들을 제외시킬 수 있다.
ex) dockerignore 파일 예시
# comment
* /temp *
* / * /temp *
temp?
*.md
!README.md
'Docker' 카테고리의 다른 글
[Docker] 도커 이미지 다루기 : 이미지 압축파일로 저장 및 불러오기 (0) | 2023.10.05 |
---|---|
[Docker] 도커 이미지 다루기 : Dockerfile 문법 (0) | 2023.09.22 |
[Docker] 도커 컨테이너 다루기 : 로그 (0) | 2023.09.22 |
[Docker] 도커 컨테이너 다루기 : 볼륨 (0) | 2023.09.20 |
[Docker] 도커 컨테이너 다루기 : 네트워크 (0) | 2023.09.20 |