도커 이미지와 컨테이너 공유하기

dong5854·2022년 2월 10일
0

docker

목록 보기
5/8
post-thumbnail

도커를 사용해서 얻는 장점들은 여러가지가 있다. 이번에는 그 중 이미지와 컨테이너를 공유하는 것에 대해 알아보자.
제목에는 도커 이미지와 컨테이너 공유하기라고 적어두었지만 사실 이미지를 받을 수 있다면 그걸로 컨테이너를 생성하는 것은 누구나 가능하기 때문에 실제로 공유하는 것은 이미지이다.

이미지를 공유하는 방법

이미지를 공유하는 방식에는 크게 두가지가 있다.

1. Dockerfile을 공유한다.

Dockerfile을 공유하는 방식은 간단하게 docker build .를 통해 이미지를 만들 수 있다. 하지만 이 방식은 Dockerfile 뿐만이 아니라 Dockerfile이 가리키는 소스코드와 같은 다른 파일들도 필요하다.

2. 빌드가 완료된 이미지를 공유한다.

빌드가 완료된 이미지를 공유라는 방식은 이미 빌드가 끝난 이미지를 받아오기 때문에 다른 파일들 없이 이 이미지만 실행하여 컨테이너를 만들 수 있다.

우리가 이미지를 푸시(push) 할 수 있는 두가지 장소 도커허브(Docker Hub)Private Registry가 있다. 이 중 도커 허브가 공식적인 도커 이미지 Registry이다.

도커 허브(Docker Hub)

도커 허브를 사용하기 위해서는 계정을 생성해 주어야 한다. 도커 허브에는 private, public 이미지 그리고 node, python 혹은 redis 같은 공식 이미지(official image)들이 있다.

도커 이미지 push 하기

도커 허브 사용하던 혹은 다른 Private Registry를 사용하던 docker push <이미지 이름> 을 사용하여 도커 이미지를 공유할 수 있고, docker pull <이미지 이름>을 통해 공유된 이미지를 받아올 수 있다. 만약 Private Registry를 사용한다면 <이미지 이름><호스트:이름>의 형식이 되어야 한다 호스트가 표기되지 않는다면 자동으로 docker hub를 사용하게 된다.

도커 허브를 이용해 이미지를 공유

도커 허브를 이용해 이미지를 공유하려면 앞서 말한것처럼 계정을 생성해 주어야 한다. 그 후 Docker Hub에서 repository에 들어가 repository를 생성해 주어야 한다.

create 버튼을 누르면 다음과 같이 repository가 생성된다.

도커 이미지를 리포지토리에 push 할 때 명심할 부분은 계정명/repositorry_name이 push를 하고 싶은 이미지의 이름과 같아야 한다는 점이다. 이는 사용자의 수많은 이미지들 중 어떤 이미지를 push 할지 식별하기 위함이다.

따라서 push 하기를 원하는 이미지의 이름을 이에 맞춰 바꾸어 줄 필요가 있다.

dong@ubuntu:~/docker-complete/NODE-SERVER$ sudo docker images 
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
node-dong    latest    8a65282657df   22 minutes ago   998MB
node         latest    e6bed6a65a54   2 weeks ago      993MB
dong@ubuntu:~/docker-complete/NODE-SERVER$ sudo docker tag node-dong:latest dong5854/node-hello-world
dong@ubuntu:~/docker-complete/NODE-SERVER$ sudo docker images 
REPOSITORY                  TAG       IMAGE ID       CREATED          SIZE
dong5854/node-hello-world   latest    8a65282657df   22 minutes ago   998MB
node-dong                   latest    8a65282657df   22 minutes ago   998MB
node                        latest    e6bed6a65a54   2 weeks ago      993MB

이렇게 이름을 바꾼 후 docker push를 통해 이미지를 push 해주면

dong@ubuntu:~/docker-complete/NODE-SERVER$ sudo docker push dong5854/node-hello-world
Using default tag: latest
The push refers to repository [docker.io/dong5854/node-hello-world]
5cf3a80c5397: Preparing 
db415b753c0b: Preparing 
cb253fe9d589: Preparing 
8822917c2286: Preparing 
55e375d8b397: Preparing 
b72a59a07ced: Waiting 
784fcc2e440c: Waiting 
884b130cf8e9: Waiting 
204e42b3d47b: Waiting 
613ab28cf833: Waiting 
bed676ceab7a: Waiting 
6398d5cccd2c: Waiting 
0b0f2f2f5279: Waiting 
denied: requested access to the resource is denied

이렇게 연결이 거부되는데 이는 docker-hub에 로그인을 하지 않고 이미지를 push 하려고 했기 때문이다.
따라서 docker login 명령어를 사용해 도커 허브에 로그인을 한 후 push를 하면 성공적으로 push를 완료할 수 있다.

dong@ubuntu:~/docker-complete/NODE-SERVER$ sudo docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: dong5854
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
dong@ubuntu:~/docker-complete/NODE-SERVER$ sudo docker push dong5854/node-hello-world
Using default tag: latest
The push refers to repository [docker.io/dong5854/node-hello-world]
5cf3a80c5397: Pushed 
db415b753c0b: Pushed 
cb253fe9d589: Pushed 
8822917c2286: Pushed 
55e375d8b397: Mounted from library/node 
b72a59a07ced: Mounted from library/node 
784fcc2e440c: Mounted from library/node 
884b130cf8e9: Mounted from library/node 
204e42b3d47b: Mounted from library/node 
613ab28cf833: Mounted from library/node 
bed676ceab7a: Mounted from library/node 
6398d5cccd2c: Mounted from library/node 
0b0f2f2f5279: Mounted from library/node 
latest: digest: sha256:a2f4e42f8d9475f7560af04d08031d8a82e37a05b020eb705435e8b80a51b3c6 size: 3048

한번 로그인을 하면 docker logout명령어를 사용해 로그아웃 할 때까지 계속 로그인이 되어있는다.

로그인을 할 때 WARNING! Your password will be stored unencrypted in /root/.docker/config.json 이라는 문구가 뜨는데 이는 패스워드의 대한 정보가 해당 경로에 저장된다는 뜻이다. 이에 대한 내용은 나중에 살펴보자.

push를 할 때 내역을 살펴보면 node 이미지는 push 되지 않고 Mount 되어 올라가는 도커 이미지의 용량을 절약하는 것을 확인 할 수 있다.

push를 완료한 후 도커 허브에 해당 리포지토리에 들어가면

다음과 같이 이미지가 올라간 것을 확인할 수 있고, tag를 통한 버전관리 또한 가능한 것을 확인할 수 있다.

도커 이미지 pull 하기

도커 이미지는 docker pull <이미지 이름>을 사용해 받아올 수 있다. 아래는 아까 push한 image를 받아오는 과정인데 이미지는 도커의 public repository에 업로드 되었기 때문에 로그아웃을 한 후에도 받아올 수 있는것을 확인할 수 있다.

dong@ubuntu:~/docker-complete$ sudo docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
dong@ubuntu:~/docker-complete$ sudo docker logout
Removing login credentials for https://index.docker.io/v1/
dong@ubuntu:~/docker-complete$ sudo docker pull dong5854/node-hello-world
Using default tag: latest
latest: Pulling from dong5854/node-hello-world
0c6b8ff8c37e: Pull complete 
412caad352a3: Pull complete 
e6d3e61f7a50: Pull complete 
461bb1d8c517: Pull complete 
808edda3c2e8: Pull complete 
2d01df36eabd: Pull complete 
b174a8d53337: Pull complete 
07c1216b144e: Pull complete 
8216eb213fee: Pull complete 
a0557cf59b22: Pull complete 
64f9484b07d3: Pull complete 
cac5ed87a907: Pull complete 
77a6730c41d7: Pull complete 
Digest: sha256:a2f4e42f8d9475f7560af04d08031d8a82e37a05b020eb705435e8b80a51b3c6
Status: Downloaded newer image for dong5854/node-hello-world:latest
docker.io/dong5854/node-hello-world:latest
dong@ubuntu:~/docker-complete$ sudo docker images
REPOSITORY                  TAG       IMAGE ID       CREATED          SIZE
dong5854/node-hello-world   latest    8a65282657df   43 minutes ago   998MB
profile
https://github.com/dong5854?tab=repositories

0개의 댓글