실습환경 초기화 명령
docker container rm -f $(docker container ls -aq)
이미지 차지 디스크 용량 회수 명령
docker image rm -f $(docker image ls -f reference='diamol/*' -q)
docker image pull (URL)
#특정 링크의 이미지 받기
docker container run -d --name web-ping diamol/ch03-web-ping
# -d: detach의 축약형 -> 백그라운드 작용 옵션
# --name: 컨테이너에 이름 태그 붙이는 옵션
docker container run --env TARGET=google.com diamol/ch03-web-ping
# --env: 내용의 환경 변수값 옵션
- 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: 도커가 이미지로부터 컨테이너를 실행했을 때 실행할 명령을 지정하는 인스트럭션
DESKTOP-KU8L7UV:~$ cd 080258/ch03/exercises/web-ping
DESKTOP-KU8L7UV:~/080258/ch03/exercises/web-ping$ ls -al
total 20
drwxr-xr-x 2 root root 4096 Dec 11 13:34 .
drwxr-xr-x 4 root root 4096 Dec 11 13:34 ..
-rw-r--r-- 1 root root 152 Dec 11 13:34 Dockerfile
-rw-r--r-- 1 root root 292 Dec 11 13:34 Jenkinsfile
-rw-r--r-- 1 root root 0 Dec 11 13:34 README.md
-rw-r--r-- 1 root root 846 Dec 11 13:34 app.js
#Dockerfile(확장자X): 스크립트가 담긴 파일
#app.js: web-ping 어플리케이션을 구현한 Node.js 코드가 담긴 파일
#README.md: 이 이미지에 대한 정보가 적힌 문서 파일
docker image build --tag web-ping .
#docker image build --tag (이미지 이름) (파일위치)
#--tag: 세로 빌드되는 이미지의 이름
# . : 이미지에 들어갈 파일이 위치한 디렉토리 기제
DESKTOP-KU8L7UV:~/080258/ch03/exercises/web-ping$ docker image history web-ping
IMAGE CREATED CREATED BY SIZE COMMENT
ec313797477a 40 minutes ago /bin/sh -c #(nop) CMD ["node" "/web-ping/ap… 0B
67fc32ed049f 40 minutes ago /bin/sh -c #(nop) COPY file:a2087c9a71052e4e… 846B
5b41ffbaadba 40 minutes ago /bin/sh -c #(nop) WORKDIR /web-ping 0B
8b0fbcf5aacc 40 minutes ago /bin/sh -c #(nop) ENV INTERVAL=3000 0B
687bafa430be 40 minutes ago /bin/sh -c #(nop) ENV METHOD=HEAD 0B
fde14227427a 40 minutes ago /bin/sh -c #(nop) ENV TARGET=blog.sixeyed.c… 0B
#이미지 레이어 정보 확인
#CREATED BY: 해당 레이어를 구성한 Dockerfile 스크립트의 인스트럭션 (인스트럭션과 이미지레이어는 1:1관계)
도커 이미지
- 이미지 레이어가 모인 논리적 대상
- 레이어는 도커 엔진의 캐시에 물리적으로 저장된 파일
- 즉 이미지 레이어는 여러 이미지와 컨테이너에서 공유된다
(캐시에 물리적으로 저장된 데이터니까 서로 같은 한 캐시 주소를 보는 것)
docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 3 1 75.3MB 75.3MB (100%)
Containers 1 0 0B 0B
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
#물리적 종류별 용량 확인
- 사용되는 이미지 레이어에는 look이 걸린다.(읽기 전용)
- 레이어가 공유되는 이미지들의 일관성, 가용성을 위해서
DESKTOP-KU8L7UV:~/080258/ch03/exercises/web-ping$ docker image build -t web-ping:v2 .
failed to fetch metadata: fork/exec /usr/local/lib/docker/cli-plugins/docker-buildx: no such file or directory
DEPRECATED: The legacy builder is deprecated and will be removed in a future release.
Install the buildx component to build images with BuildKit:
https://docs.docker.com/go/buildx/
Sending build context to Docker daemon 5.12kB
Step 1/7 : FROM diamol/node
---> 9dfa73010b19
Step 2/7 : ENV TARGET="blog.sixeyed.com"
---> Using cache
---> fde14227427a
Step 3/7 : ENV METHOD="HEAD"
---> Using cache
---> 687bafa430be
Step 4/7 : ENV INTERVAL="3000"
---> Using cache
---> 8b0fbcf5aacc
Step 5/7 : WORKDIR /web-ping
---> Using cache
---> 5b41ffbaadba
Step 6/7 : COPY app.js .
---> 4634f1e38874
Step 7/7 : CMD ["node", "/web-ping/app.js"]
---> Running in 95b95a30792d
Removing intermediate container 95b95a30792d
---> 9bdff1152703
Successfully built 9bdff1152703
Successfully tagged web-ping:v2
#임의의 레이어 순서가 있고 그 순서 중간에 잇는 레이어가 변경되면 그위에 오는 레이어는 재사용 불가능 -> 그래서 그밑의 레이어은 재실행 함
#Step 5까지는 기존에 있던 Using cache를 사용했지만 그밑에 app.js가 수정되어 있어 새로 레이어를 구축함 Stap 7또한 Using cache에서 가져올 수 있었지만 위의 Stap가 새로 레이러를 구축해서 본인 또한 재구축을 함
- 각 레이어는 해시값을 주소로 가지며 Dackerfile 스크립트의 인스트럭션과 인스트럭션에 의해 복사되는 파일의 내용으로부터 계산
- 기존 이미지 레이어에 해시값이 일치하는 것이 없다면 캐시 미스 발생하고 해당 인스트럭션 실행 -> 한번 실행되면 그다음 인스트럭션은 무조건 모두 실행
- 그러므로 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 diamol/node
CMD ["node", "/web-ping/app.js"]
ENV TARGET="blog.sixeyed.com" \
METHOD="HEAD" \
INTERVAL="3000"
WORKDIR /web-ping
COPY app.js .
#CMD(컨테이너시 이미지 실행 명령 내용)는 FORM(시작위치)뒤에만 배치하면 된다.
#ENV의 환경변수 선언은 '\'을 통해 한개로 여러 환경변수 선언가능
DESKTOP-KU8L7UV:~/080258/ch03/exercises/web-ping-optimized$ docker image build -t web-ping:v3 .
failed to fetch metadata: fork/exec /usr/local/lib/docker/cli-plugins/docker-buildx: no such file or directory
DEPRECATED: The legacy builder is deprecated and will be removed in a future release.
Install the buildx component to build images with BuildKit:
https://docs.docker.com/go/buildx/
Sending build context to Docker daemon 5.12kB
Step 1/5 : FROM diamol/node
---> 9dfa73010b19
Step 2/5 : CMD ["node", "/web-ping/app.js"]
---> Running in a824b7592db9
Removing intermediate container a824b7592db9
---> de689383948e
Step 3/5 : ENV TARGET="blog.sixeyed.com" METHOD="HEAD" INTERVAL="3000"
---> Running in bcf901c7d2c2
Removing intermediate container bcf901c7d2c2
---> 1f1527b96712
Step 4/5 : WORKDIR /web-ping
---> Running in ebcd30074464
Removing intermediate container ebcd30074464
---> c7aed111f8f1
Step 5/5 : COPY app.js .
---> 35a98609b76f
Successfully built 35a98609b76f
Successfully tagged web-ping:v3
#단계가 준것 말고는 차이가 없지만 app.js 파일이 맨밑으로 가게 되어서 추후에 수정해도 다른 레이어에는 영향이 덜가는 최적화가 달성되었다.
연습문제
docker container run -it --tty diamol/ch03-lab
#docker container run명령어의 옵션 -it로 대화형태로 접속
root@DESKTOP-KU8L7UV:/home/user# docker container run -it --tty diamol/ch03-lab
/diamol # vi ch03.txt
Lab solution, by:
->
Lab solution, by: park
#변경
root@DESKTOP-KU8L7UV:/home/user # docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@DESKTOP-KU8L7UV:/home/user# docker container ls -all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f860eddaf9dc diamol/ch03-lab "/bin/sh" 26 seconds ago Exited (0) 9 seconds ago frosty_kare
#돌아가는 컨테이너 확인
root@DESKTOP-KU8L7UV:/home/user # docker container commit frosty_kare diamol/ch03-lab
sha256:f04491579d5e825a48a8997823a169d1de8867b9a216bd1f18d80333441977f9
#commit을 통해 컨테이너의 변경사항을 이미지에 적용
root@DESKTOP-KU8L7UV:/home/user# docker container run -it --tty diamol/ch03-lab
#변경된 이미지로 새 컨테이너 만들고
/diamol # cat ch03.txt
Lab solution, by: park /diamol #
#변경된거 확인
#정리
#docker container run 옵션
#-it: 컨테이너를 대화식으로 연결
#--tty:연결시 접속
#docker container commit [컨테이너] [이미지]
#컨테이너의 변경된 사항을 이미지에 적용하는 명령어