목차
Docker Images
- Read-Only Template
- 이미지는 Container를 만들기 위해 필요. 이미지 그 자체는 의미 없음
- 이미지는 다른 이미지를 기반->이미지는 여러개의 이미지를 포함할 수 있다
- 사용자 자신의 이미지를 만들거나 다른 사용자가 생성하여 레지스트리에 게시한 이미지를 사용가능
- 고유한 이미지를 빌드하려면 이미지를 만들고 실행하는 데 필요한 단계를 정의하기 위한 간단한 구문을 사용하여 Dockerfile 만든다
- Dockerfile의 각 명령은 이미지에 레이어를 생성. Dockerfile을 변경하고 이미지를 재구성하면 변경된 계층만 재구성됨
- 이미지는 매우 가볍고, 작고, 빠르게 만들어야 됨
Docker 컨테이너: 여러 image(이미지, 하나의 패키지로 묶인 바이너리)들 레이어로 구성
• base image는 컨테이너의 운영체제를 포함하고 있고, 이 OS는 호스트의 OS와 다를 수 있음
• 컨테이너 OS는 이미지의 형태
• 이는 호스트 OS와 다르게 완전한 운영체제가 아님 – 커널 미포함
• 완전한 운영체제는 파일시스템, 바이너리, 커널을 포함
• 이 base image 위에 각각이 컨테이너의 부분이 되는 다수의 이미지들 올라감
Docker Image 관련 명령어
build -> 도커파일 이미지화
tag -> 이미지의 이름을 변경/복사
Docker Image Tag
public -> 이미지 이름과 build version만 있음
private -> host url도 같이 작성해 줘야 함. port번호는 5000
Union Mount
• 복수의 파일시스템을 하나의 파일시스템으로 마운트하는 기능
• 두 파일 시스템에서 동일한 파일이 있다면 나중에 마운트된 파일 시스템 파일 오버레이
• 하위 파일시스템에 대한 쓰기 작업은 CoW(Copy On Write) 전략에 따라 복사본을 생성하여 수행하므로 원본 파일 시스템은 변하지 않음
• 일종의 상속inheritance와 비슷한 개념으로 실제 이 기능의 초기 구현은 상속 파일 시스템이라고 불림
Union File System
1. UnionFS
• Linux, FreeBSD, NetBSD를 위해 초기에 구현된 유니언 파일 시스템
2. AUFS(Advanced Union File System)
• UnionFS를 완전히 재작성하여 신뢰성과 성능을 개선하면서도 Writable Branch Balancing과 같은 새로운 개념을 도입
• 코드 가독성이 리눅스 오픈소스 커뮤니티에서 문제되어 주류 리눅스 커널에 통합되지 못함 – Ubuntu Linux 에서 사용
3. Overlay
• 주류 리눅스 커널에 통합된 버전
• 레드햇 계열 리눅스에서 기본으로 사용
Docker Driver
• graphdriver : container image 관리
• networkdriver : 가상 bridge 등 container network 관리
• execdriver : container 생성 관리
실습
1. Docker image 다운로드(pull)
# docker pull 이미지이름
이미지는 layer 단위로 이루어져 있음
따라서 다운 받을때도 여러개가 뜨는거임
컨테이너를 실행시키고 index.html을 추가한다
diff를 이용하여 기존 httpd 이미지와 현재 컨테이너의 차이를 확인할 수 있다
2. Docker commit
실행중인 컨테이너로 부터 이미지 생성
# docker commit [컨테이너명] [원하는 이미지명:태그]
-a 옵션 : 저자
-m 옵션 : 커밋 메시지
centos/httpd-24-centos8과 만들어진 이미지의 size가 같다.
왜냐하면 컨테이너에 index.html파일 하나만 추가했기 때문에 size가 같다.
이처럼, 기본 세팅을 한다음 컨테이너를 이미지로 만들어 공유해서 사용할 수 있다. 그러나, 불필요한 정보가 포함될 수 있기 때문에 추쳔은 안한다.
3. Docker tag(Image Version)
위에서 생성한 도커 이미지에게 이름 및 버전 번호를 부여하는 작업이다. 참고로 아래 작업을 위해 미리 quay.io 의 계정을 생성해야 한다.
docker image tag <기존의 이미지명>:<기존의 태그명> <새로운 이미지명>:<새로운 태그명>
이름의 이름을 붙여주는 작업
이미지의 이름을 tag를 이용하여 바꿔줄 수 있음
만약 이름이 있는데 tag를 이용한다면 이름이 바뀐 이미지가 복사가 된다
이때 우리는 quay.io에 이미지를 업로드할 것이기 때문에 이미지이름 앞에 quay.io의 자신의 레포지토리 url을 적어줘야 한다
4. quay.io에 push & pull
quay.io 에 로그인
만든 이미지를 레지스트리에 저장
# docker push 이미지이름
잘 올라간것을 확인 가능
cf) 업로드된 이미지는 덮어쓰기 못한다.
수정할 때마다 올리고 지워줘야 함. version을 업데이트 함으로써 업데이트가 되었다는 것을 나타내줌
같은 이름의 이미지를 pull 하고자 할때는 다른 이미지를 지워야 한다
왜냐하면 충돌이 발생하기 때문이다
# docker rmi 이미지이름
이미지를 quay.io에서부터 pull하고 컨테이너를 만들면 정상적으로 동작한다는 것을 확인할 수 있다
# docker pull 이미지이름
5. Docker save & load
이미지를 파일로 저장할 경우
# docker save [옵션] <파일명> [이미지명]
- -o : 파일명 지정
이미지를 로드할 경우
docker load <옵션>
- --input , -i: 불러올 파일명을 명시