ch03 도커 이미지 만들기
1. 도커 허브에 공유된 이미지 사용하기
docker image pull diamol/ch03-web-ping
- docker image pull : 이미지 내려받는 명령어
# 이미지 내려받으면 나오는 내용 Using default tag: latest 해시값: Already exists 해시값: Pull complete 해시값: Pull complete 해시값: Pull complete 해시값: Pull complete 해시값: Pull complete Digest: sha 어쩌고저쩌고 Status: Downloaded newer image for diamol/ch03-web-ping:latest
- 이미지 레이어 : 이미지 각각의 파일
도커 이미지는 물리적으로는 여러 개의 작은 파일로 구성되어 있다.
도커가 이들 파일을 조립해 컨테이너의 내부 파일 시스템을 만든다.docker container run -d --name web-ping diamol/ch03-web-ping
- -d 플래그 : --detach의 축약형
- --name 플래그 : 컨테이너에 원하는 이름을 붙인다.
docker container logs web-ping
- 도커를 통해 수집된 애플리케이션의 로그 확인
- 로그내용 : 애플리케이션이 blog.sixeyed.com으로 HTTP 요청을 반복적으로 보내고 있다는 내용
- 현재는 특정 블로그 주소로 고정되어 있으나 애플리케이션에서 대상 URL과 요청 간격, 요청 타입 등을 설정할 수 있다.
- 시스템의 환경 변수 값에서 설정값을 읽어 온다.
- 도커 컨테이너도 별도의 환경 변수를 가질 수 있다. 이때 이 환경 변수는 호스트 운영체제의 것이 아니라 도커가 부여해줌.
docker rm -r web-ping docker container run --env TARGET=google.com diamol/ch03-web-ping
- --env TARGET=google.com : 애플리케이션에서 사용할 환경 변수 값을 지정한 부분
- ctrl + c 를 눌러 종료할 수 있다.
2. Dockerfile 작성하기
- Dockerfile : 애플리케이션을 패키징하기 위한 간단한 스크립트로 일련의 인스트럭션으로 구성됨.
# web-ping 애플리케이션의 Dockerfile 스크립트 FROM diamol/node ENV TARGET="blog.sixeyed.com" ENV METHOD="HEAD" ENV INTERVAL="3000" WORKDIR /web-ping COPY app.js . CMD ["node", "/web-ping/app.js"]
- FROM : 어떤 이미지를 시작점으로 할지 지정
- ENV : 환경 변수 값을 지정하기 위한 인스트럭션. key="value" 형식을 따름.
- WORKDIR : 컨테이너 이미지 파일 시스템에 디렉터리를 만들고, 해당 디렉터리를 작업 디렉터리로 지정
- COPY : 로컬 파일 시스템의 파일 혹은 디렉터리를 컨테이너 이미지로 복사. [원본 경로] [복사 경로] 형식을 따름.
- CMD : 도커가 이미지로부터 컨테이너를 실행했을 때 실행할 명령을 지정
cd ch03/exercise/web-ping
ls
# 존재하는 파일 확인
- Dockerfile
- app.js
- README.md
3. 컨테이너 이미지 빌드하기
이미지를 빌드하려면 이미지의 이름, 패키징에 필요한 파일의 경로를 추가로 지정해 주어야 한다.
docker image build --tag web-ping .
- --tag 플래그 : 이미지 이름
- . : Dockerfile 및 이미지에 포함 시킬 파일이 위치한 경로
[참고] build 중 오류 발생 시
- 먼저 도커 엔진이 정상적으로 동작 중인지 확인!
- 그 다음 현재 작업 디렉토리가 정확한지 확인!
- 마지막으로 build 명령을 정확하테 입력했는지 확인!
- 빌드된 이미지는 로컬 이미지 캐시에 저장됨.
docker image ls 'w*'
- 도커 명령으로 이미지 목록 확인.
docker container run -e TARGET=docker.com -e INTERVAL=5000 web-ping
- 도커 웹사이트에 5초마다 요청 보내게 됨.
4. 도커 이미지와 이미지 레이어 이해하기
docker image history web-ping
- Dockerfile 인스트럭션과 이미지 레이어는 1:1 관계
- 도커 이미지 : 이미지 레이어가 모인 논리적 대상
docker image ls
- 이미지 목록과 용량 확인
- 여기에 나오는 용량은 논리적인 용량이며 해당 이미지가 실제로 차지하는 디스크 용량을 나타내는 것이 아님.
docker system df
- 이미지 저장에 실제 사용된 디스크 용량 확인
5. 이미지 레이어 캐시를 이용한 Dockerfile 스크립트 최적화
5.1. 실습
ch03-web-ping 디렉터리에 있는 app.js 파일을 수정. 끝에 빈 줄 추가하는 정도도 OK. 그 다음 새로운 버전의 도커 이미지 빌드하기
git clone https://github.com/gilbutITbook/080258.git
cd 080258/ch03/exercise/web-ping
- 3개 파일 : Dockerfile, app.js, README.md
vim app.js # 맨 마지막 줄로 가는 vim 명령어 shift + G # 맨 오른쪽으로 가는 vim 명령어 shift + 4 키보드 영어 o 빈 한 줄 입력 ESC 키 :wq
docker image build -t web-ping:v2 .
- 도커는 캐시에 일치하는 레이어가 있는지 확인하기 위해 해시값을 사용
- Dockerfile 스크립트의 인스트럭션은 잘 수정하지 않는 인스트럭션이 앞으로 오고 자주 수정되는 인스트럭션이 뒤에 오도록 배치돼야 한다. 이렇게 해야 캐시에 저장된 이미지 레이어를 되도록 많이 재사용할 수 있다. 이미지를 공유하는 과정에서 시간은 물론이고 디스크 용량, 네트워크 대역폭을 모두 절약할 수 있는 방법이다.
5.2. web-ping-optimized 디렉터리로 이동하여 새로우 스크립트로 이미지를 다시 빌드
cd ../web-ping-optimized
docker image build -t web-ping:v3 .
6. 연습문제
6.1. 문제
Dockerfile 스크립트 없이 도커 이미지 생성하기.
Dockerfile의 목적은 애플리케이션 배포를 자동화하는 것!
diamol/ch03-lab 이미지가 있고, 이 이미지 안에는 /diamol/ch03.txt 파일 존재
이 파일 뒤에 자기 이름을 추가한 다음, 수정된 파일을 포함하는 새로운 이미지를 빌드하기.
Dockerfile 스크립트 사용 불가!
6.2. 힌트
- -it 플래그를 사용하면 컨테이너를 대화식으로 실행할 수 있다.
- 파일 시스템의 컨테이너는 컨테이너가 종료된 후에도 남아 있다.
- docker container --help 명령 활용
6.3. 풀이
docker image pull diamol/ch03-lab
docker container run -it --name lab diamol/ch03-lab
echo Ssongmi >> ch03.txt
cat ch03.txt
exit
docker container commit lab ch03-lab-ssong
docker container run ch03-lab-ssong cat ch03.txt
'Docker' 카테고리의 다른 글
도커(Docker) 이미지 만들기 (0) | 2023.12.07 |
---|---|
도커 사용법 (0) | 2023.11.30 |
wsl2 docker 설치 중 systemctl 관련 에러 System has not been booted with systemd as init system (PID 1). Can't operate.Failed to connect to bus: Host is down (0) | 2023.11.29 |