도커를 사용해서 얻는 장점들은 여러가지가 있다. 이번에는 그 중 이미지와 컨테이너를 공유하는 것에 대해 알아보자.
제목에는 도커 이미지와 컨테이너 공유하기라고 적어두었지만 사실 이미지를 받을 수 있다면 그걸로 컨테이너를 생성하는 것은 누구나 가능하기 때문에 실제로 공유하는 것은 이미지이다.
이미지를 공유하는 방식에는 크게 두가지가 있다.
1. Dockerfile을 공유한다.
Dockerfile을 공유하는 방식은 간단하게 docker build .
를 통해 이미지를 만들 수 있다. 하지만 이 방식은 Dockerfile 뿐만이 아니라 Dockerfile이 가리키는 소스코드와 같은 다른 파일들도 필요하다.
2. 빌드가 완료된 이미지를 공유한다.
빌드가 완료된 이미지를 공유라는 방식은 이미 빌드가 끝난 이미지를 받아오기 때문에 다른 파일들 없이 이 이미지만 실행하여 컨테이너를 만들 수 있다.
우리가 이미지를 푸시(push) 할 수 있는 두가지 장소 도커허브(Docker Hub)와 Private Registry가 있다. 이 중 도커 허브가 공식적인 도커 이미지 Registry이다.
도커 허브를 사용하기 위해서는 계정을 생성해 주어야 한다. 도커 허브에는 private, public 이미지 그리고 node, python 혹은 redis 같은 공식 이미지(official image)들이 있다.
도커 허브 사용하던 혹은 다른 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를 통한 버전관리 또한 가능한 것을 확인할 수 있다.
도커 이미지는 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