DevOps/Docker
[Docker] Docker 이미지
물꼮이
2023. 11. 30. 17:43
https://hub.docker.com/
- 도커 이미지 중, 자주 사용하는 이미지들은 별도의 공식 저장소에 저장해서 사용한다.
- 자주 사용하는 sw 도구를 해당 기업에서 official 이미지로 만들어 docker hub에 제공
* 누구나 이미지를 올릴 수 있기 때문에 인증된 이미지만 사용
* tags에서 버전 확인 가능
이미지 다운로드
docker image [sub-command]
command 목록
아래 명령어를 입력하면, [sub-command]위치에 올 수 있는 커맨드 목록이 쭉 출력된다
docker image
commands | 내용 |
build | Build an image from a Dockerfile |
history | Show the history of an image |
import | Import the contents from a tarball to create a filesystem image |
inspect | Display detailed information on one or more images |
load | Load an image from a tar archive or STDIN |
ls | List images |
prune | Remove unused images |
pull | Download an image from a registry |
push | Upload an image to a registry |
rm | Remove one or more images |
save | Save one or more images to a tar archive (streamed to STDOUT by default) |
tag | Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE |
Pull 이미지 다운로드 예시
docker image pull {이미지명}
특정이미지 있나 Docker 허브에 검색해보기
docker search {찾고자 하는 이미지명}
출력 메뉴 | 의미 |
STARS | 즐겨찾기 stars 수 |
OFFICIAL | 공식 이미지 여부 |
AUTOMATED | docker파일 기반으로 자동빌드되는 시스템에 의해 생성된 것인지 여부 |
외부저장소에서 이미지 다운로드 하기
- GCR(Google Container Registry) 에서 제공하는 개인 Docker Registry 서비스
docker image pull {이미지명}
docker image pull {저장소명}/{이미지명}:{버전명}
ex)
docker image pull gcr.io/google-samples/hello-app:1.0
다운로드 된 이미지 목록 확인
docker images
docker image ls //위와 동일
docker image inspect {이미지명} // 특정 이미지 상세정보 조회
docker image inspect 이미지 상세정보 확인 결과
- RootFS : 루트 파일 시스템 정보
- Layers : 해쉬값, 도커의 이미지들은 여러 layer 로 구성이 됨
Docker 동작 방식
Docker file -> Docker Image -> Docker Container
Docker 파일 예시
FROM ubuntu
RUN mkdir /myproject
RUN echo "start myproject" > /myproject/welcome
VOLUME /myproject
- commit으로, 변경사항 반영한 새로운 이미지 생성
docker commit -a {이미지 작성자} -m {커밋메시지} {커밋할 컨테이너명} {생성할이미지명:버전명}
// docker commit -a "lion_kim" -m "install jdk8" test_app test_app:1.0
- 이미지 생성 시, 위와 같이 이미지에 할당된 id값 (hash값) 출력됨
컨테이너로 이미지 생성하기
- 컨테이너 생성
- Ubuntu 20.04 기반으로 test_app 컨테이너 생성 & 내부 진입
- 변경점 생성
- test_app 컨테이너 내부에 openjdk8 설치
- 이미지 생성
- 변경사항을 commit으로 만들어 test_app:1.0 저장
// 1.
docker container run -it --name test_app ubuntu:20.04
// ... test_app 컨테이너 내부에 진입됨 (-it 옵션)
// 2.
# apt-get update // 설치 중 옵션은 1번 선택
# apt-get install openjdk-8-jdk
# exit
// 3.
docker commit -a "lion_kim" -m "install jdk8" test_app test_app:1.0
// 확인
docker images
docker image inspect ubuntu:20.04 // 특정 이미지 상세정보 조회
docker image inspect test_app:1.0
-
- 아래와 같이 image inspect의 결과로 => RootFS를 확인했을 때,
- ubuntu:20.04 이미지의 Layer에서
- test_app:1.0 이미지의 Layer에 한 줄이 더 추가됨을 확인 할 수 있다. (변경점 추가)
- 아래와 같이 image inspect의 결과로 => RootFS를 확인했을 때,
이미지 삭제
docker image rm {이미지명:태그명}
docker image rm {tag명}
docker image rm {id명}
- [Untagged] 삭제할 이미지의 tag를 untagged함
- [Deleted] 도커파일의 각 최신 layer를 참조하는 id를 삭제한 결과 출력
* 해당 이미지를 참조하는 도커 이미지(사용중인 컨테이너)가 있어 삭제할 수 없는 경우
Error response from daemon: conflict: unable to remove repository reference "ubuntu:20.04" (must force) - container e7d6d5a2495a is using its referenced image bf40b7bc7a11
> 해결
- docker container ps -a 로 컨테이너 확인
- -f 옵션 사용해 강제 삭제 가능
- but 실제 이미지 이름만 삭제함
- 이미지 Layer 파일 삭제하려면
- 사용중인 컨테이너 삭제 뒤 이미지 삭제하기
이미지 업로드
Docker 이미지 업로드 할 때는,
Docker Hub에 가입한 Username 과 저장소명이 동일해야 한다.
- 이미지 생성시 태그 명을 {저장소명}/{이미지명:버전명} 으로 유지Docker Hub의 Username
기존이미지에, 태그명만 붙이는 명령어
- 이 경우 이미지를 새로 생성하는게 아닌,
- 기존의 이미지에 태그만 추가됨
=> IMAGE ID는 같음
docker image tag [old이미지명] [new이미지명]:[new태그명]
//docker image tag nginx cys8829/nginx_webserver:1.0
이미지 업로드 과정
docker login
docker image push [저장소명]/[이미지명:버전명]
//docker image push cys8829/nginxwebserver:1.0
Docker Hub 저장소 공개범위 설정
- Public 저장소 : docker serach, docer image pull 등 누구나 사용 가능
- Private 저장소 : 접근권한이 있는 사용자만 사용 가능
- Docker Hub > 저장소 > Settings > Visibility Settings > Make private