도커 허브
https://hub.docker.com/ 아이디가 없다면 가입을 하셔야 합니다.
회원가입을 마치고 로그인을 한 다음 Repositories를 들어가 보면 아직 아무것도 없는 것을 확인할 수 있습니다.
이미지 다운, 업로드 명령어
docker pull 이미지명 : 로컬 스토리지로 이미지 다운로드
docker tag 기존이미지명 추가할 이미지명: 새로운 이미지명을 만드는 명령어
docker push 이미지명: 이미지 레지스트리에 이미지 업로드
이미지명을 변경하는 이유
A프로젝트
에서 이미지를 다운 받아서 사용한 다음 프로젝트명을 그대로 A로 두고
이미지를 push 한다면 기존에 다운받은 A프로젝트
에 push가 될 것입니다.
본인의 프로젝트에 이미지를 push 하고 싶다면 A프로젝트
를 다운받고 docker tag
를 사용해서 이미지명을 변경한 다음 본인의 프로젝트에 push 해야 합니다.
실습 이미지 다운
다운이 완료되었다면 docker tag
를 사용해서 이미지명을 변경합니다.
그럼 docker image ls
로 이미지를 확인하면?
기존의 devwikirepo/simple-web을 사용한 새로운 이미지가 생성된 것을 확인할 수 있습니다.
하지만 IMAGE ID를 보면 똑같은 걸 알 수 있습니다. ID가 같다는 것은 파일이 같다는 뜻입니다.
1개의 파일로 여러 개의 이미지를 만들 수 있고 여러 다른 Repositories에 등록이 가능하는 것입니다.
이는 개발, 테스트, 프로덕션 환경별로 이미지를 분리하여 관리할 수도 있고, 버전별로 다르게 관리할 수 있다는 장점이 있습니다.
도커 허브에 이미지 push
docker tag
를 사용해서 변경된 이미지를 docker push 이미 지명을
사용해서 push 합니다.
push가 잘되는 것처럼 보이다가 마지막에 요청한 리소스에 대한 액세스가 거부된 것을 볼 수 있습니다.
docker에서 pull은 자유이지만(엄밀히 말하면 공개 이미지의 경우) push는 로그인을 해야 합니다. 아무 사용자나 자신의 Repositories에 접근해서 이미지를 push를 하면 안 되기 때문입니다.
그럼 Repositories에 push 하기 위해 로그인합니다.
docker login: 사용자는 레지스트리의 사용자 이름과 비밀번호를 입력하여 인증합니다.
docker logout: Docker 레지스트리에서 로그아웃하는 데 사용됩니다. 로그아웃하면, 로컬에 저장된
인증 정보가 삭제되며, 이후의 요청에서는 다시 인증이 필요하게 됩니다.
docker image rm 이미지명: 이미지 삭제
로그인하였다면 이제 push 명령어를 사용해서 이미지를 업로드합니다.
정상적으로 Repositories에 업로드가 되었습니다. push명령어 실행 시에 사용자는 레지스트리명을 써준 적이 없지만 docker push log
에서는 자동으로 docker.io라는 기본 레지스트리가 들어간 것을 확인할 수 있습니다.
도커 허브에 이미지가 정상적으로 등록되었습니다.
레지스트리 이미지 다운로드 후 컨테이너 실행
- 로컬스토리지 이미지 삭제
- 도커 허브에서 my-simple-web 다운로드 후 실행
로컬스토리지 이미지 삭제
첫 번째 이미지 삭제
docker image rm sooowan/my-simple-web:0.1로 정확하게 이미지태그를 입력해야 합니다.
Tip)
0.1이라는 이미지 태그를 생략한다면 docker에서 내부적으로 latest라는 이미지태그로 실행하여 이미지명이 일치하지 않아 삭제가 안될 수 있습니다.
두 번째 이미지 삭제
devwikirepo/simple-web:1.0도 삭제하겠습니다.
두 번째 이미지인 devwikirepo/simple-web:1.0을 삭제할 때는 Deleted라는 문구를 확인할 수 있습니다.
이는 더 이상 참조할 이미지가 없는 마지막 이미지이기 때문에 완전히 삭제되는 것입니다.
로컬스토리지에서 이미지를 확인해 보면?
방금 전 삭제한 두 이미지가 모두 정상적으로 삭제되었습니다.
도커 허브에서 my-simple-web 다운로드 후 실행
로컬스토리지에 이미지가 없기 때문에 dockerhub에서 이미지를 다운로드합니다.
컨테이너가 정상적으로 실행이 되었습니다. 그럼 localhost로 가서 확인해 보겠습니다.
정상적으로 출력이 됩니다.