[Docker] E01.Image
2021-04-05 # Docker

Docker

이 글은 위키북스의 시작하세요! 도커/쿠버네티스를 참고하여 쓴 글입니다.


Create Docker Image


기본적으로 컨테이너를 생성할 때 다음과 같이 입력을 합니다.


1
docker run -it --name my_docker ubuntu:14.04

이때 [OPTIONS] 뒤에 붙이는 [IMAGE]명이 ubuntu, [TAG]명이 14.04인 것인데 이러한 image를 만드는 방법을 알아보도록 하겠습니다.

가장 먼저, 다음 명령어를 입력해 이미지로 만들 컨테이너를 생성합니다. 컨테이너 내부에 first라는 이름의 파일을 하나 생성하여 기존의 이미지로부터 변경사항을 한가지 만듭니다.


1
2
docker run -it --name commit_test ubuntu:14.04
root@1d152 :/# echo test_first! >> first

first라는 파일을 만들어 기존의 image인 ubuntu:14.04로부터 변경사항을 만든 후 컨테이너에서 호스트로 빠져나와 docker commit 명령어를 사용하여 이미지로 만들 것입니다.


1
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

다음 명령은 아까 만들었던 commit_test라는 컨테이너를 commit_test:first라는 이름의 이미지로 생성하는 것입니다.


1
2
3
4
docker commit \  				// option
-a "YOUR_ID" -m "Message" \ // -a는 author를 의미
commit_test \ // 저장할 image
commit_test:first // 저장할 image 이름

위의 결과로 아래와 같은 이미지가 생성되는 것을 볼 수 있습니다.


1
2
3
csj7480@DESKTOP-03N08DE:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
commit_test first c7d7b705e5a5 13 seconds ago 197MB

Extract Image


도커 이미지를 별도로 저장하거나 옮기는 등 필요에 따라 이미지를 단일 바이너리 파일로 저장해야 할 때가 있습니다. docker save 명령어를 사용하면 컨테이너의 커맨드, 이미지 이름과 태그 등 이미지의 모든 메타데이터를 포함해 하나의 파일로 추출할 수 있습니다. -o 옵션에는 추출될 파일명을 입력합니다.


메타데이터(Metadata)는 데이터에 대한 데이터이다.
Karen Coyle에 의하면 “어떤 목적을 가지고 만들어진 데이터(Constructed data with a purpose)” 라고 정의한다.
출처 : https://wa-yeong.tistory.com/14


1
docker save -o ubuntu_14_04.tar ubuntu:14.04

이 때 추출된 이미지는 이미지의 모든 메타데이터를 포함하기 때문에 load 명령어로 이미지를 로드하면 이전의 이미지와 완전히 동일한 이미지가 도커엔진에 생성됩니다.

1
docker load-i ubuntu_14_04.tar

유사하게 사용할 수 있는 명령어로 export,import가 있는데, detach모드나 변경된 사항, 컨테이너 command와 같은 컨테이너의 설정 등을 이미지에 저장하지 않아 효율적이지 못합니다,

이는 레이어 구조의 파일이 아닌 단일 파일이기 때문에 여러버전의 이미지를 추출하면 이미지 용량을 각기 차지하게 됩니다.

예륻 들면, ubuntu:14.04이미지와 commit_test:first라는 두 개의 이미지를 export할 경우 각각 197MB의 파일이 생성되어 총 394MB의 용량을 차지하게 됩니다.


Docker private Registry


컨테이너 이미지는 컨테이너의 사본이라고 할 수 있는데, 이 이미지를 복사해서 다른 시스템으로 이동을 시킬 수 있습니다. 생성된 컨테이너 이미지는 일종의 템플릿이 되며, 새로운 애플리케이션을 만들거나 확대 및 확장할 때 이 템플릿을 사용합니다.

그러한 이미지를 작업하려면 생성된 이미지를 저장, 업로드, 다운로드의 프로세스를 거쳐야 하는데 이러한 프로세스를 통해 공유할 수 있는 장소를 레지스트리라고 합니다.

레지스트리의 종류는 publick과 private이 존재하는데 우선 private registry에 대해 먼저 알아보도록 하겠습니다.

도커 사설 레지스트리(Docker Private Registry)를 사용하면 개인 서버에 이미지를 저장할 수 있는 저장소를 만들 수 있습니다. 이 레지스트리는 컨테이너로서 구현되므로 이에 해당하는 도커 이미지가 존재합니다. 이 이미지는 도커에서 공식적으로 제공하기 때문에 아래의 run 명령어로 간단히 사용할 수 있습니다.


1
2
3
4
docker run -d --name myregistry \
-p 5000:5000 \
--restart=always \
registry:2.6

이 때, 레지스트리는 기본적으로 5000번 포트를 사용하므로 -p 옵션으로 호스트의 5000번 포트를 컨테이너의 5000번 포트와 연결하는 옵션을 지정해줍니다.

이 포트로 RESTful API를 사용할 수 있습니다.


curl localhost:5000/v2/명령어를 통해 레지스트리 컨테이너가 정상적으로 작동하는지 확인해봅시다.

curl명령어는 HTTP요청을 보내는 도구 중 하나입니다.


1
2
csj7480@DESKTOP-03N08DE:~$ curl localhost:5000/v2/
{}csj7480@DESKTOP-03N08DE:~$

위와 같이 {}가 출력됨을 확인할 수 있습니다.

이제 Push를 해보겠습니다. 도커 허브의 저장소를 사용할 때 썼던 이미지를 레지스트리 컨테이너에 올려봅시다. 다음의 명령을 입력하여 이미지의 이름을 추가합니다.

1
docker tag my-image-name:0.0 ${DOCKER_HOST_IP}:5000/my-image-name:0.0

이때, ${DOCKER_HOST_IP}에는 레지스트리 컨테이너를 생성한 도커 호스트 IP를 입력합니다.

1
docker push localhost:5000/my-image-name:0.0

1
2
3
4
5
6
7
csj7480@DESKTOP-03N08DE:~$ docker push localhost:5000/my-image-name:0.0
The push refers to repository [localhost:5000/my-image-name]
adcd7cbb0060: Pushed
83109fa660b2: Pushed
30d3c4334a23: Pushed
f2fa9f4cf8fd: Pushed
0.0: digest: sha256:9d5b17cc8225ebfc551944991eaf21e16cc6e6b84628df904277d751909c6e19 size: 1152



위와 같이 push가 안되어있는 것을 볼 수 있는데, registry를 원격에 구축하기 위해서는 몇가지 설정이 필요합니다.

기본적으로 도커 데몬은 HTTPS를 사용하지 않은 레지스트리 컨테이너에 접근하지 못하도록 설정되어있습니다. 따라서, HTTPS를 사용하려면 인증서를 적용해 별도로 설정해야 하는데, 이 내용은 나중에 다뤄보도록 하겠습니다.

지금은 테스트를 위해 HTTPS를 사용하지 않아도 이미지를 push, pull할 수 있도록 해봅시다.

도커데몬은 JSON 형태로 된 파일을 읽어 실행 옵션으로 사용합니다. 도커 데몬은 기본적으로 etc/docker/daemon.json파일을 읽지만 이 파일이 없어도 도커 데몬이 실행되므로 꼭 이 방법을 사용해야하는 것은 아닙니다. 하지만 현재 사용 중인 운영체제에서 도커 서비스 설정 파일의 위치를 모르거나 도커 실행 옵션이 많아서 관리가 어렵다면 daemon.json파일을 작성하는 것이 편리합니다.

앞서말한 설정을 위해 이 파일에 들어가서 다음을 추가합니다.

OS가 Linux가 아닌 Windows일 경우 User/.docker/daemon.json의 경로로 확인할 수 있습니다.

1
"insecure-registries": ["localhost:5000"]

도커 데몬에 --insecure-registry옵션만 추가하면 별도의 인증 절차 없이 레지스트리 컨테이너에서 이미지를 push,pull할 수 있습니다.