본문 바로가기
  • 클라우드야 나랑 친해지자!
서버/Docker&Kubernetes

Docker 이미지 생성하기- Docker Hub(1/2)

by 정민규 2021. 4. 15.
반응형

수업을 듣고 배운 내용과 연습한 내용을 정리하였습니다

개인 공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.

 

잘못된 부분이 있거나 질문사항은 댓글로 남겨주시면 성심성의껏 답변해드리겠습니다. 감사합니다!


 

교재 <시작하세요! 도커/쿠버네티스 - 용찬호 지음>를 토대로 실습을 진행하였습니다.

 

 

 

 

* Docker Image

 

모든 컨테이너는 이미지를 기반으로 생성되므로 이미지를 다루는 방법은 도커 관리에서 빼놓을 수 없는 부분입니다. 이미지의 이름을 구성하는 저장소, 이미지 이름, 태그를 잘 관리하는 것뿐만 아니라 이미지가 어떻게 생성되고 삭제되는지, 이미지의 구조는 어떻게 돼 있는지 등을 아는 것 또한 중요합니다.

 

 

 

* Docker Hub

 

데비안 운영체제에서 apt-get install을 실행하면 apt 리포지터리에서 패키지를 내려받고,

레드햇 운영체제에서 yum install을 실행하면 yum 리포지터리에서 패키지를 내려받듯이

도커는 기본적으로 도커 허브(Docker Hub)라는 중앙 이미지 저장소에서 이미지를 내려받습니다.

 

도커 허브는 도커가 공싱적으로 제공하고 있는 이미지 저장소로서, 도커 계정을 가지고 있다면 누구든지 이미지를 올리고 내려받을 수 있기 때문에 다른 사람들에게 이미지를 쉽게 공유할 수 있습니다.

 

 

 

 

docker search 명령어를 통해 아래와 같이 도커 허브의 이미지를 검색할 수 있습니다.

제가 검색한 ubuntu 이미지도 여러 종류가 있음을 알 수 있고, STARS는 해당 이미지가 도커 사용자로부터 얼마나 즐겨찾기 됐는지를 나타냅니다.

 

 

 

 

 

 

 

* 이미지 생성

 

앞에서 docker search를 통해 검색한 이미지를 pull 명령어로 내려받아 사용할 수도 있지만

도커로 개발하는 많은 경우에는 컨테이너에 애플리케이션을 위한 특정 개발 환경을 직접 구축한 뒤 사용자만의 이미지를 직접 생성해야 할 것입니다.

 

 

 

다음 명령어를 입력해 이미지로 만들 컨테이너를 생성합니다.

컨테이너 내부에 first라는 이름의 파일을 하나 생성해 기존의 이미지로부터 변경사항을 만듭니다.

#docker run -i -t --name commit_test ubuntu:14.04
/#echo test_first! >> first 

 

 

 

 

first라는 파일을 만들어 기존의 ubuntu:14.04 이미지로부터 변경 사항을 만들었다면 컨테이너에서 호스트로 빠져나와 docker commit 명령어를 입력해 컨테이너를 이미지로 만듭니다.

 

이미지의 이름을 commit_test로, 태그를 first로 설정했습니다.

-a 옵션은 author를 뜻하며, 이미지의 작성자를 나타내는 메타데이터를 이미지에 포함시킵니다.

commit_test:first 이미지의 작성자 데이터는 "alicek106"으로 설정될 것입니다.

-m 옵션은 커밋 메시지를 뜻하며, 이미지에 포함될 부가 설명을 입력합니다.

#docker commit \
-a "alicek106" -m "my first commit" \
commit_test \
commit_test:first
sha256:

 

 

 

 

docker images 명령어로 이미지가 생성됐는지 확인합니다.

원본 이미지의 크기와 비교했을 때 차이가 없는 것은 first라는 파일이 몇 비트에 불과하기 때문입니다.

 

 

 

 

이번에는 commit_test:first 이미지로 새로운 이미지를 생성해 보겠습니다.

commit_test:first 이미지로 컨테이너를 생성한 뒤 second라는 파일을 추가해 commit_test:second라는 이미지를 새롭게 생성합니다.

 

 

#docker run -i -t --name commit_test2 commit_test:first
/#echo test_second! >> second
#docker commit \
-a "alicek106" -m "my second commit" \
commit_test2 \
commit_test:second
sha256:

 

 

 

 

 

 

* 이미지 구조

 

위와 같이 컨테이너를 이미지로 만드는 작업은 commit 명령어로 쉽게 수행할 수 있습니다.

그러나 이미지를 좀 더 효율적으로 다루기 위해 컨테이너가 어떻게 이미지로 만들어지며, 이미지의 구조는 어떻게 돼 있는지 알 필요가 있습니다.

 

 

아래 명령어를 입력하면 이미지의 전체 정보를 알 수 있습니다.

#docker inspect ubuntu:14.04
#docker inspect commit_test:first
#docker inspect commit_test:second

 

 

docker inspect 명령어는 많은 정보를 출력하지만 가장 아랫부분에 있는 Layers 항목을 주의 깊게 살펴봐야 합니다.

 

 

docker images에서 위 3개의 이미지 크기가 각각 197MB라고 출력돼도 197MB 크기의 이미지가 3개 존재하는 것은 아닙니다. 이미지를 커밋할 때 컨테이너에서 변경된 사항만 새로운 레이어로 저장하고, 그 레이어를 포함해 새로운 이미지를 생성하기 때문에 전체 이미지의 실제 크기는 197MB + first 파일의 크기 + second 파일의 크기가 됩니다.

 

 

 

Ubuntu:14.04 의 Layer

 

commit_test:first의 Layer
commit_test:second 의 Layer

 

 

 

 

 

 

 

* 이미지 삭제

 

docker rmi 명령어를 사용하여 생성한 이미지를 삭제해 봅니다.

#docker rmi commit_test:first

 

 

그러나 이 명령어를 에러를 출력합니다.

이미지를 사용 중인 컨테이너가 존재하므로 해당 이미지를 삭제할 수 없다는 내용입니다. 컨테이너를 삭제할 때 사용했던 docker rm -f [컨테이너 이름] 처럼 -f 옵션을 추가해 이미지를 강제로 삭제할 수도 있지만 이는 이미지 레이어 파일을 실제로 삭제하지 않고 이미지 이름만 삭제하기 때문에 의미가 없습니다.

 

 

 

 

따라서 다음 명령어와 같이 컨테이너를 삭제한 뒤 이미지를 삭제하게 합니다.

#docker stop commit_test2 && docker rm commit_test2
#docker rmi commit_test:first

 

 

 

 

commit_test:first 이미지를 삭제했다고 해서 실제로 해당 이미지의 레이어 파일이 삭제되지는 않습니다.

commit_test:first 이미지를 기반으로 하는 하위 이미지인 commit_test:second가 존재하기 때문입니다.

따라서 실제 이미지 파일을 삭제하지 않고 레이어에 부여된 이름만 삭제합니다.

rmi 명령어의 출력 결과인 Untagged: ~는 이미지에 부여된 이름만 삭제한다는 것을 뜻합니다.

 

 

 

 

 

이번에는 commit_test:second 이미지를 삭제해봅니다.

commit_test:second 이미지를 사용하고 있는 컨테이너가 없으니 바로 삭제할 수 있습니다.

"Deleted:"라는 출력 결과는 이미지 레이어가 실제로 삭제됐음을 뜻합니다.

#docker rmi commit_test:second

 

 

 

 

 

이미지 추출과 배포를 위한 저장소 생성 파트는 다음 포스팅에서 다루겠습니다~

 

 

반응형

'서버 > Docker&Kubernetes' 카테고리의 다른 글

Docker Swarm  (0) 2021.04.20
Dockerfile 작성 및 빌드  (0) 2021.04.16
Docker 이미지 추출 및 저장소 생성(2/2)  (0) 2021.04.15
Docker Container Logging - awslogs  (0) 2021.04.14
Docker Container Logging - fluentd  (0) 2021.04.14

댓글