DevOps/Docker

[Docker] Docker 이미지

물꼮이 2023. 11. 30. 17:43

docker공식 저장소 docker hub

 

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 {찾고자 하는 이미지명}

 

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 image inspect 출력1
docker image inspect 출력2

 

 


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값) 출력됨

 

컨테이너로 이미지 생성하기

  1. 컨테이너 생성
    1. Ubuntu 20.04 기반으로 test_app 컨테이너 생성 & 내부 진입
  2. 변경점 생성
    1. test_app 컨테이너 내부에 openjdk8 설치
  3. 이미지 생성
    1. 변경사항을 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

 

docker images 출력

    • 아래와 같이 image inspect의 결과로 => RootFS를 확인했을 때,
      • ubuntu:20.04 이미지의 Layer에서 
      • test_app:1.0 이미지의 Layer에 한 줄이 더 추가됨을 확인 할 수 있다. (변경점 추가)

ubuntu:20.04 이미지 상세정보
test_app:1.0의 이미지 상세정보

 

 


이미지 삭제

docker image rm {이미지명:태그명}
docker image rm {tag명}
docker image rm {id명}

 

  1. [Untagged] 삭제할 이미지의 tag를 untagged함 
  2. [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