컨테이너/도커

Ship : 도커 이미지 공유

비니화이팅 2022. 10. 18. 01:54

Dockerhub

  • 도커에서 제공하는 기본 이미지 저장소
  • 도커 허브는 maven repository와 같이 외부에 공개되어 있는 도커 이미지 레포지토리로 docker pull 명령을 이용하여 컨테이너를 로컬에 받아오거나, Docker image 빌드 시 베이스 이미지 등을 받아오는 데 주로 사용
  • 베이스 이미지(Ubuntu, centos, debian 등 리눅스 배포판의 기본 기능을 제공), 공식 이미지(ruby, golang, java, python) 존재
    • 베이스 이미지에 미들웨어나 라이브러리, 전개할 애플리케이션 등을 넣은 이미지를 겹쳐서 독자적인 도커 이미지를 만듬
  • 회원가입만 하면 대용량의 이미지를 무료로 저장, 무료로 다운로드
  • 기본적으로 모든 이미지는 공개되어 누구나 접근 가능하므로 비공개로 사용하려면 유료 서비스를 이용해야 함(한 개는 무료)
  • 도커 허브는 반드시 public으로만 이미지를 push할 수 있으며 개인 사용자는 하나의 이미지만 private으로 사용 가능
  • 도커 허브를 이용하면 레지스트리 구축 없이 도커 이미지를 저장, 배포할 수 있음
  • public/private 선택 가능

 

이미지 다운로드/업로드(docker image pull/push)

  • docker image pull [옵션] [이미지명[:태그명]]
  • docker image pull [옵션] [URL]
    • 이미지명에 태그 미지정 시 default 값 : latest
c:\\>docker image pull centos:7
7: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987
Status: Downloaded newer image for centos:7
docker.io/library/centos:7

옵션

  • -a
    • docker image pull -a [이미지명]
    • 모든 태그 취득
c:\\>docker image pull -a centos
  • docker image push [사용자명/이미지명[:태그명]]

Docker 리포지토리에 로그인/로그아웃(docker login/logout)

  • **docker login -u [사용자명] -p [패스워드] [서버명]**
    • 도커 허브가 아닌 다른 환경에 도커 리포지토리가 있는 경우는 서버명 지정
hbeen@DESKTOP-EDC39JU:~$ docker login -u hyebeen -p fjrzlgPqls7!
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded

Logging in with your password grants your terminal complete access to your account.
For better security, log in with a limited-privilege personal access token. Learn more at <https://docs.docker.com/go/access-tokens/>

Autoated Build

  • 도커 허브의 기능
  • Github나 Bitbucket에서 관리되는 도커파일을 바탕으로 도커 이미지를 자동으로 빌드

1. Github에 Dockerfile 업로드

2. Docker Hub의 링크 및 빌드 설정

  • 자동으로 빌드되며 완료되면 리포지토리에 이미지가 추가됨

 

3. 도커 이미지 취득

hbeen@DESKTOP-EDC39JU:~/sample$ docker image pull hyebeen/my-repo:latest
latest: Pulling from hyebeen/my-repo
Digest: sha256:1439aefc4a3fc6d85e4be9f0cecc4028cb09f1c218aba19710f1b4e7f39b0eb3
Status: Image is up to date for hyebeen/my-repo:latest
docker.io/hyebeen/my-repo:latest

Docker Registry를 사용한 프라이빗 레지스트리

  • 인터넷상에 도커 이미지를 공개하고 싶지 않을때 사용
  • 그러나 도커 이미지 등이 회사 내부에서 비공개적으로 사용되거나 사설 네트워크 등에서 사용되기 위해서는 내부 서버에 도커 레지스트리를 구축해야 함
  • 도커 레지스트리를 프라이빗 네트워크 안에서 구축하려면 도커 스토어에 공개되어 있는 공식 이미지인 registry를 사용
    • registry version 0 : python, registry version 2: go 언어로 구축되어 있으며 version 2를 사용하는 것이 좋음
  1. 도커 registry 이미지 다운
hbeen@DESKTOP-EDC39JU:~/sample$ docker image pull registry

2. 컨테이너 시작

hbeen@DESKTOP-EDC39JU:~/sample$ docker container run -d -p 5000:5000 --name registry registry
d3521b2ea7120527cd67caaf92f790c9687d30da6142b55410007911e0e1ad8c
  • 레지스트리는 5000번 포트를 사용하므로 5000으로 포트 지정
  1. 도커 이미지 빌드
hbeen@DESKTOP-EDC39JU:~/sample$ docker build -t nginximage .
hbeen@DESKTOP-EDC39JU:~/sample$ docker image ls
REPOSITORY             TAG       IMAGE ID       CREATED          SIZE
nginximage             latest    45d856f80c43   23 seconds ago   173MB
  1. 도커 이미지 태그 생성
  • docker image tag [로컬 이미지명] [업로드할 레지스트리 주소:포트번호/이미지명]
    • 프라이빗 네트워크 내 도커 레지스트리에 업로드하려면 이미지에 태그를 붙여야 함
hbeen@DESKTOP-EDC39JU:~/sample$ docker image tag nginximage localhost:5000/nginximage-private
hbeen@DESKTOP-EDC39JU:~/sample$ docker image ls
REPOSITORY                          TAG       IMAGE ID       CREATED              SIZE
nginximage                          latest    45d856f80c43   About a minute ago   173MB
localhost:5000/nginximage-private   latest    45d856f80c43   About a minute ago   173MB
  1. 이미지 업로드 후 확인

hbeen@DESKTOP-EDC39JU:~/sample$ docker image push localhost:5000/nginximage-private
Using default tag: latest
The push refers to repository [localhost:5000/nginximage-private]
59fa432c7eab: Pushed
455b0cc5ed10: Pushed
36ffdceb4c77: Pushed
latest: digest: sha256:cdb1fb10695471be66c8e6771e870470177fe53973dcb23b8080785118b901ff size: 953

  1. 이미지 다운로드 및 작동 확인
hbeen@DESKTOP-EDC39JU:~/sample$ docker image rm nginximage
Untagged: nginximage:latest

hbeen@DESKTOP-EDC39JU:~/sample$ docker image rm localhost:5000/nginximage-private
Untagged: localhost:5000/nginximage-private:latest
Untagged: localhost:5000/nginximage-private@sha256:cdb1fb10695471be66c8e6771e870470177fe53973dcb23b8080785118b901ff
Deleted: sha256:45d856f80c43f45e97dd1bfe5f929fd0345da295aad197a166caf17eea718b59

hbeen@DESKTOP-EDC39JU:~/sample$ docker image ls
REPOSITORY             TAG       IMAGE ID       CREATED         SIZE

hbeen@DESKTOP-EDC39JU:~/sample$ docker image pull localhost:5000/nginximage-private
Using default tag: latest
latest: Pulling from nginximage-private
08c01a0ec47e: Already exists
0249a3ac8e49: Already exists
5a819ac3368e: Already exists
Digest: sha256:cdb1fb10695471be66c8e6771e870470177fe53973dcb23b8080785118b901ff
Status: Downloaded newer image for localhost:5000/nginximage-private:latest
localhost:5000/nginximage-private:latest

hbeen@DESKTOP-EDC39JU:~/sample$ docker image ls
REPOSITORY                          TAG       IMAGE ID       CREATED         SIZE
localhost:5000/nginximage-private   latest    45d856f80c43   4 minutes ago   173MB

**** 주의할 점**

  • 프라이빗 레지스트리에서 도커 이미지를 영구 데이터로 관리하려면 호스트머신에 볼륨을 공유하거나 스토리지 마련해야 함
  • 다중화 구성, 백업, 서버 감시 등과 같은 운용도 필요
  • LDAP 등의 인증을 붙이려면 별도의 인증서버를 사용해야 함

➡️ 용량이 큰 이미지를 개발용 클라이언트 PC나 온프레미스 환경에서 관리하려면 비용과 시간이 많이 들기 때문에 퍼블릭 클라우드에서 제공하는 프라이빗 레지스트리 서비스 사용 고려 필요

클라우드 서비스를 사용한 프라이빗 레지스트리

  • AWS : Elatic Conation Registry
  • GCP : Google Container Registry
    • Google Cloud Storage를 데이터 저장 장소로 사용
  •