[ 이미지 관리 ]
-이미지 생성(직접 생성, 코드에 의한 관리 IaC)
-이미지 내보내기
Phoenix Server
[ Docker의 이미지 Layer 구조 ]
[ OverlayFS ]
Union Filesystem을 구현한 파일시스템
lsmod | grep overlay
(lsmod -> 어떤 모듈이 깔려있는지 보여줌)
기본구조
- lower : 아래쪽 층들의 모임, 절대 수정되지 않음
- upper : 겹침 구조의 최상층, 실제 수정이 반영되는 부분
- merge : lower+upper 겹쳐서 보는 통합 View
- work : 겹침 구조의 병합 작업등을 위하여 사용되는 임시공산
[ OverlayFS 테스트 ]
1) 마운트용 디렉토리 생성
# mkdir /overlay
# cd /overlay/
# mkdir lower upper merge work
2) 테스트용 파일 생성
# echo Hello > lower/fileA
# echo World > upper/fileB
3) OverlayFS 마운트
# mount -t overlay(타입) overlay(오버레이하겠다. 원본) -o lowerdir=lower/,upperdir=upper/,workdir=work/ merge/
mounr -t [TYPE] -o [옵션] <원본> <마운트포인트>
4) 마운트 상태 및 파일 상태 확인
# ls -l lower
# ls -l upper
# ls -l merge
5) lower에 존재하는 fileA 파일을 마운트 된 merge를 통해 접근하여 수정 및 확인
# echo merong >> merge/fileA
# ls -l merge/
# cat merge/fileA
# ls -l lower/
# cat lower/fileA
# ls -l upper/
# cat upper/fileA
결론: lower의 파일은 수정되지 않고, upper에 수정된 파일이 생성되며, merge에서는 upper의 파일이 노출됨
6) upper에 존재하는 fileB 파일을 마운트 된 merge를 통해 접근하여 수정 및 확인
# echo merong >> merge/fileB
# ls -l merge/
# cat merge/fileB
# ls -l lower/
# ls -l upper/
# cat upper/fileB
결론: lower는 upper에만 존재하는 파일과 무관하며, upper에만 존재하는 파일은 upper에서 수정됨
7) lower에 존재하는 fileA 파일을 merge를 통해 접근하여 삭제
# rm merge/fileA
# ls -l merge/
# ls -l lower/
# cat lower/fileA
# ls -l upper/
결론: lower에 존재하는 파일을 삭제할 경우, merge에 파일이 노출되지 않도록 upper에서 masking을 위한 Character 장치파일(c)을 생성. merge에는 해당 파일이 노출되지 않음
8) upper에 존재하는 fileB 파일을 merge를 통해 접근하여 삭제
# rm merge/fileB
# ls -l merge/
# ls -l lower/
# ls -l upper/
결론: upper에만 존재하는 파일을 삭제할 경우 lower는 무관하며, upper에서 직접 파일이 삭제됨
태그
docker image tag : 이미지 태그 생성 (기존 이미지의 정보와 동일)
$ docker image tag centos:7 mycentos:1.0
현재 사용중인 컨테이너를 이미지화
[ 이미지 내보내기 / 가져오기 ]
현재 Docker Host(Docker Engine)에 저장되어 있는 이미지를 파일로 내보내기
파일 형태로 저장되어 있는 이미지를 이미지로 불러오기
컨테이너 -> 파일(export), 이미지 -> 파일(save)
<export/import>
컨테이너를 파일로 내보내기
export 한 파일을 이미지로 저장하기
docker image import <TAR파일명> <이미지명>[:태그]
옵션
-m, --message : 메시지 추가
-c, --change : 이미지 속성 정보 추가
export/import의 경우 이미지의 계층 정보 및 이미지의 속성정보 등이 모두 남아있지 않고, 현재 컨테이너의 파일시스템 내의 데이터만 파일로 저장하므로, 해당 이미지를 사용하여 컨테이너를 구동하기 위해서는 필요한 구성 설정을 직접 추가하여야 함 (-c, --change 옵션 사용)
<save/load>
이미지를 파일로 내보내기
파일을 이미지로 가져오기
save/load의 경우 이미지의 계층(layer) 정보 및 이미지의 속성정보(manifest) 등을 모두 포함한 형태로 저장하기 때문에, 이미지를 다시 load 하였을 때 정보가 그대로 유지됨
[ Dockerfile을 사용한 이미지 작성 ]
[ Dockerfile ]
[ Dockerfile에서 사용하는 예약어 ]
1) 베이스 이미지 (기본 이미지): FROM
사용법
- FROM <이미지명> // latest 태그를 자동 지정
- FROM <이미지명>:<태그명>
- FROM <이미지명>@
2) 실행할 명령어 (이미지 작성 시 실행): RUN
사용법
- RUN <실행할 명령>
3) 실행할 명령어 (이미지로부터 컨테이너 구동 시 실행): CMD, ENTRYPOINT
4) 실행할 명령어 (이미지를 사용하여 빌드할 때 실행): ONBUILD
[ Dockerfile 내에서 실행할 명령을 입력할 때 사용하는 방법 ]
Dockerfile
#나의 첫번째 Dockerfile
FROM centos:7
#이미지 빌드 시 실행할 명령 (빌드시 실행할 명령을 Shell 형식으로 지정)
RUN yum -y install httpd
#나의 첫번째 Dockerfile
FROM centos:7
#이미지 빌드 시 실행할 명령 (빌드 시 실행할 명령을 Exec 형식으로 지정)
RUN ["yum", "-y", "install", "httpd"]
#나의 첫번째 Dockerfile
FROM centos:7
#이미지 빌드 시 실행할 명령 (컨테이너 구동 시 실행할 명령을 Shell 형식으로 지정)
ENTRYPOINT touch
CMD /tmp/test
#나의 첫번째 Dockerfile
FROM centos:7
#이미지 빌드 시 실행할 명령 (컨테이너 구동 시 실행할 명령을 Exec 형식으로 지정)
ENTRYPOINT ["touch"]
CMD ["/tmp/test"]