- Dockerfile의 목적은 애플리케이션 배포를 자동화 하는 것이다.
도커 이미지와 이미지 레이어 이해하기
- 도커 이미지는 물리적으로 여러 개의 작은 파일로 구성돼 있다.
- 도커 이미지에는 우리가 패키징에 포함된 모든 파일이 들어있다.
- 이미지 레이어를 제대로 이해해야 도커를 효율적으로 사용 할 수 있다.
- 도커 이미지는 이미지 레이어가 모인 논리적 대상이다. 레이어는 도커 엔진의 캐시에 물리적으로 저장된 파일이다. 이 점이 꽤 중요하냐면, 이미지 레이어는 여러 이미지와 컨테이너에서 공유되기 때문이다.
- 만약 Node.js 애플리케이션이 실행되는 컨테이너를 여러 개 실행한다면 이들 컨테이너는 모두 Node.js 런타임이 들어있는 이미지 레이어를 공유한다.
이미지 레이어를 이용한 Dockerfile 스크립트 최적화
- 도커는 캐시에 일치하는 레이어가 있는지 확인하기 위해 해쉬값을 이용한다.
- Dockefiel script의 인스트럭션은 각각 하나의 이미지 레이어와 1:1로 연결된다.
- 기존 이미지 레이어에 해쉬값이 일치하는 것이 없다면, 캐시 미스가 발생하고 해당 인스트럭션이 실행된다.
- 한번 인스트럭션이 실행되면 그 다음에 오는 인스트럭션은 수정된 것이 없더라도 모두 실행된다.
- Dockerfile 스크립트의 인스트럭션은 잘 수정되지 않는 것이 인스트럭션 값 앞에 오고, 자주 수정되는 인스트럭션이 뒤에 오도록 배치되어야 한다. 이렇게 해야 캐시에 저장된 이미지를 많이 사용할 수 있다.
컨테이너 이미지 빌드하기
- 이미지를 빌드하려면 Dockerfile 스크립트 외에도 필요한 것이 몇 가지 더 있다. 이미지의 이름, 패키징에 필요한 파일의 경로를 추가로 지정해 주어야 한다.
- 실습 : docker image build 명령을 사용해 Dockerfile 스크립트로 이미지를 빌드하라— tag의 인자값(web-ping)은 이미지의 이름이고, 이어지는 인자는 Dockerfile 및 이미지에 포함시킬 파일이 위치한 경로다. 도커에서는 이 디렉터리를 컨텍스트라고 한다.
- docker image build --tag web-ping .ddddd
- build 명령에서 어떤 오류가 발생한다면, 먼저 도커 엔진이 정상적으로 동작 중인지 확인하고, 현재 작업 디렉터리가 정확한지 확인. 마지막으로 build 명령을 정확하게 입력했는지
연습 문제
- 내용
- 도커 허브에 공유된 diamol/ch03-lab 이미지가 있고, 이 이미지 안에는 /diamol/ch03.txt 파일이 있다. 연습 문제는 이 파일 뒤에 독자 여러분의 이름을 추가한 다음, 수정된 파일을 포함하는 새로운 이미지를 빌드하는 것이다.
- docker images로 확인하면 (Repository)
- docker commit
- doecker commit [컨테이너명] [원하는 이미지명 : 태그]
- 정답
# it 플래그를 사용하면 컨테이너를 대화형으로 실행할 수 있다.
docker container run -it --name ch03lab diamol/ch03-lab
echo Elton >> ch03.txt
exit
docker container commit ch03lab ch03-lab-soln
docker container run ch03-lab-soln cat ch03.txt
cf) 추가개념
- 이미지(Image)
- 이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것으로 상태값을 가지지 않고 변하지 않습니다(Immutable). 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장됩니다. 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있습니다.
- Docker Layer
- 도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 보통 용량이 수백메가MB에 이릅니다. 처음 이미지를 다운받을 땐 크게 부담이 안되지만 기존 이미지에 파일 하나 추가했다고 수백메가를 다시 다운받는다면 매우 비효율적일 수 밖에 없습니다.
- 도커는 이런 문제를 해결하기 위해 레이어layer라는 개념을 사용하고 유니온 파일 시스템을 이용하여 여러개의 레이어를 하나의 파일시스템으로 사용할 수 있게 해줍니다. 이미지는 여러개의 읽기 전용 read only 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성됩니다. ubuntu 이미지가 A + B + C의 집합이라면, ubuntu 이미지를 베이스로 만든 nginx 이미지는 A + B + C + nginx가 됩니다. webapp 이미지를 nginx 이미지 기반으로 만들었다면 예상대로 A + B + C + nginx + source 레이어로 구성됩니다. webapp 소스를 수정하면 A, B, C, nginx 레이어를 제외한 새로운 source(v2) 레이어만 다운받으면 되기 때문에 굉장히 효율적으로 이미지를 관리할 수 있습니다.
- 컨테이너를 생성할 때도 레이어 방식을 사용하는데 기존의 이미지 레이어 위에 읽기/쓰기read-write 레이어를 추가합니다. 이미지 레이어를 그대로 사용하면서 컨테이너가 실행중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러개의 컨테이너를 생성해도 최소한의 용량만 사용합니다.
'Engineering WIKI > Docker' 카테고리의 다른 글
[도커 교과서] 7장 도커 컴포즈로 분산 애플리케이션 실행하기 (0) | 2023.03.01 |
---|---|
[도커 교과서] 6장 도커 볼륨을 이용한 퍼시스턴트 스토리지 (0) | 2023.02.25 |
[도커 교과서] 5장. 도커 허브 등 레지스트리에 이미지 공유하기 (0) | 2023.02.25 |
[도커 교과서] 4장. 애플리케이션 소스 코드에서 도커 이미지까지 (0) | 2023.02.25 |
[도커 교과서] 2장. 기본 사용방법 (0) | 2023.02.25 |
[도커 교과서] 1장. 시작하기 전에 (0) | 2023.02.25 |
[Docker] Docker 컨테이너 확인, 생성, 접속, 빠져나오기 (0) | 2021.04.26 |
[Docker] Docker 이미지 검색 및 다운로드 받기 (0) | 2021.04.26 |