docker 를 알아보다 보면 슬슬 실무에 적용해 보고 싶어지는데요. 실제로 배포등을 처리하려면 docker hub 가 필요합니다. 하지만 docker hub 는 계정당 1개만 private 저장소를 지원하는데요.
이를 해결하기 위해서는 자체적으로 구축한 도커 저장소가 있는게 아무래도 편하겠죠?
1. registry 서비스 띄우기
먼저 registry 도커이미지를 Docker hub에서 받습니다.
$ docker pull registry:latest
Using default tag: latest
latest: Pulling from library/registry
cd784148e348: Pull complete
0ecb9b11388e: Pull complete
918b3ddb9613: Pull complete
5aa847785533: Pull complete
adee6f546269: Pull complete
Digest: sha256:1cd9409a311350c3072fe510b52046f104416376c126a479cef9a4dfe692cf57
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
docker run 명령으로 registry 서비스 시작합니다.
컨테이너 이름을 private-registry, 포트맵핑은 5000 -> 5000 으로 설정하였습니다.
$ docker run --name private-registry -d -p 5000:5000 registry
1359ea5239fdbf59f72070a546847a2c0fcdda1bee3d39948890c990ea306c99
서비스가 제대로 떴는지 확인해 봅니다.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1359ea5239fd registry "/entrypoint.sh /etc…" 9 minutes ago Up 9 minutes 0.0.0.0:5000->5000/tcp private-registry
이렇게 보인다면 제대로 서비스가 실행중이라고 할 수 있습니다.
2. 테스트를 위한 도커 이미지 만들기
이제 테스트를 위한 간단한 도커 이미지를 만들어 보겠습니다.
여기서는 베이스 이미지로 도커에서 많이 사용하는 경량 리눅스 배포본 Alpine 을 기반으로 만들어 보겠습니다.
$ mkdir myapp
$ cd myapp
$ vi Dockerimage
아래와 같이 도커이미지 파일을 작성합니다. 간단히 ‘hello world!’ 를 콘솔에 출력하는 간단한 이미지입니다.
FROM alpine
CMD echo 'hello world!'
Dockerimage 파일을 작성했으면 도커 이미지를 생성합니다.
$ docker build -t doogle/myapp .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM alpine
---> 3f53bb00af94
Step 2/2 : CMD echo 'hello world!'
---> Using cache
---> 0e8664b14592
Successfully built 0e8664b14592
Successfully tagged doogle/myapp:latest
도커 이미지가 제대로 생성되었는지 확인힙니다. 와 용량이 정말 작네요. Ubuntu 18.04의 경우 80MiB 이상 잡아먹습니다.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
doogle/myapp latest 0e8664b14592 3 minutes ago 4.41MB
도커 이미지를 만들었다면 이제 테스트로 실행해 보겠습니다.
$ docker run doogle/myapp
hello world!
제대로 여기까지 왔다면 위와같이 ‘hello world!’를 출력하게 됩니다.
3. 로컬 저장소에 내가 만든 도커 이미지 등록하기
이미지를 도커 레지스트리에 올리기 위해서는 도커 레지스트리 주소기반의 동일한 내용의 이미지를 먼저 만들어야 합니다.
$ docker tag doogle/myapp localhost:5000/myapp
도커 이미지 목록을 보면 리포지토리값만 다른 이미지를 생성합니다.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost:5000/myapp latest 0e8664b14592 20 minutes ago 4.41MB
doogle/myapp latest 0e8664b14592 20 minutes ago 4.41MB
이제 새로 만든 이미지를 도커 레지스트리에 등록합니다.
$ docker push localhost:5000/myapp
The push refers to repository [localhost:5000/myapp]
7bff100f35cb: Pushed
latest: digest: sha256:136dfdf37f0554f750aa8dc8f63947b45ae5aa7731ec94ef9df77e5969549200 size: 528
제대로 등록이되었는지 알고 싶다면 다음 링크를 열어보면 확인 할 수 있다.
http://localhost:5000/v2/_catalog
웹브라우저에서 아래와 같이 나오면 정상이다.
{"repositories":["myapp"]}
http://localhost:5000/v2/myapp/tags/list
웹브라우져에서 아래와 같이 나오면 정상이다.
{"name":"myapp","tags":["latest"]}
4. 로컬 저장소에 있는 도커 이미지 가져오기
이제 로컬 저장소를 Docker Hub 처럼 사용해 보겠습니다.
우선 기존에 테스트로 만든 컨테이너와 이미지들을 삭제해야 합니다.
myapp 의 경우 바로 실행후 종료되기 때문에 다음과 같이 -a 를 추가로 인자를 주어야 확인 할 수 있습니다.
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e2a40d4d8bef doogle/myapp "/bin/sh -c 'echo 'h…" 40 minutes ago Exited (0) 40 minutes ago xenodochial_kepler
도커 컨테이너를 삭제합니다.
$ docker rm e2a40d4d8bef
e2a40d4d8bef
도커 이미지를 확인합니다.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
doogle/myapp latest 0e8664b14592 About an hour ago 4.41MB
localhost:5000/myapp latest 0e8664b14592 About an hour ago 4.41MB
다른 이미지들도 있겠지만 지워야 할 건 아까 만든 위의 2개입니다.
$ docker rmi doogle/myapp localhost:5000/myapp
Untagged: doogle/myapp:latest
Untagged: localhost:5000/myapp:latest
Untagged: localhost:5000/myapp@sha256:136dfdf37f0554f750aa8dc8f63947b45ae5aa7731ec94ef9df77e5969549200
이제 로컬 저장소에 있는 이미지를 실행해보겠습니다.
$ docker run localhost:5000/myapp
Unable to find image 'localhost:5000/myapp:latest' locally
latest: Pulling from myapp
cd784148e348: Already exists
Digest: sha256:136dfdf37f0554f750aa8dc8f63947b45ae5aa7731ec94ef9df77e5969549200
Status: Downloaded newer image for localhost:5000/myapp:latest
hello world!
이미지가 없기 때문에 로컬 저장소에서 받아와서(pull) 실행하고 있습니다.
로컬 저장소는 사실 실무에서 사용할 일은 거의 없습니다. 이제 원격 저장소를 구축하는 방법을 알아보겠습니다.
5. 원격 도커 이미지 저장소 구축하기
원격 저장소를 구축하는 것도 기본적으로 로컬 저장소와 비슷합니다. 일단 1번을 그대로 원격 서버에서 진행합니다.
다만 registry 는 로컬과는 달리 원격의 경우 반드시 https 로만 접속을 허용합니다. 무료 let’s encrypt SSL인증서나 기타 유료 인증서를 발급받아 처리햐야 합니다. 인증서와 인증관련해서는 다음 기회에 ^^
답글 남기기
댓글을 달기 위해서는 로그인해야합니다.