도커 이미지 및 레지스트리

장후후·2021년 10월 12일
0

Docker Core Guide

목록 보기
2/5
post-thumbnail

도커 이미지

도커 이미지란?

도커 이미지는 도커에서 컨테이너를 실행하기 위한, 코어라고 생각하면 된다.
그 코어를 베이스로 원하는 작업을 진행할 수 있다.

VM에서 사용하는 이미지 개념을 떠올리면, 쉽게 이해할 수 있다.
OS 이미지(실제 환경 설치에도 쓸 수 있음) 파일로 가상 머신 환경을 만들어서 사용할 수 있다.

그런데 위 그림에서 보면 똑같은 20.04 우분투 이미지인데, 실제 우리가 가상환경 설치용으로 쓰는 이미지는 2.9GB, 도커에서 사용하는 이미지는 고작 72.8MB 이다.

왜 이렇게 용량차이가 나는것인가?

바로 앞장에서 설명한 HOST OS의 리소스를 공유해서 쓰냐 안쓰냐의 차이가 있기 때문이다.
1장 도커 개념 및 전망

컨테이너를 생성할 때, 사용하는 이미지 동작 원리는 아래의 예시를 통해서, 설명하면 이해가 쉽다.

예를 들어서, nginx 기반의 web application 컨테이너를 만들고자 한다면,

먼저 우분투 이미지를 베이스로 nginx를 설치한 이미지를 만들고, nginx 이미지로 web app source가 추가된 이미지를 만들어서, 컨테이너를 실행한다.

자 여기서, 도커 기술의 장점이 또 하나 나오는데, 변경된 부분은 외에 Layer A,B,C는 공유할 수 있는 부분이라 ubuntu 베이스의 nginx 이미지를 만든다고 해서, 중복으로 용량이 커지지 않는다는 점이다. (유니온 마운트 기술)

출처 https://cultivo-hy.github.io/docker/image/usage/2019/03/14/Docker%EC%A0%95%EB%A6%AC/

도커 이미지 만들기

나만의 도커 이미지를 만들기 위해서는 베이스 이미지를 가지고, 변경점을 만들어서 저장해줘야 한다. 다음의 예제를 통해서 알아보자

docker commit 명령어

먼저 ubuntu 18.04 베이스의 컨테이너를 만들어서 bash로 접근 해보겠다.

docker run -it ubuntu:18.04 bash

git을 실행하고 싶은데, 설치가 안되어 있으므로 한번 설치 해보자.
apt update
apt install -y git

설치 완료 후 git을 실행해보면, 잘된다!

만약 git이 설치된 컨테이너가 삭제된다면, 내가 컨테이너안에서 설치했던 git 변경내용이 모두 날라가게 된다.

그렇기 때문에, 이미지로 저장해야한다.

cntrol + p + q 또는 exit를 커맨드창에 입력해서 컨테이너 밖으로 나간다.

docker ps 로 현재 실행중인 컨테이너를 확인해보자.

컨테이너를 있는 그대로 이미지로 만들기 위해서는 docker commit이라는 명령을 사용하면 된다.

docker commit 7dc korjsh/ubuntu:git

이미지가 잘 생성된 것을 확인할 수 있다.

Dockerfile 기본

위와 같이 컨테이너를 만들어서 commit 하는 방법은 매우 번거로운 과정이 동반되기 때문에,
Dockerfile을 통해서 작성하면 간편하게 이미지를 만들 수 있다.

FROM ubuntu:18.04
RUN apt update
RUN apt install -y git

도커파일이 있는 경로에서, docker build -t ubuntu:git2 .
명령어로 이미지를 만들어 보자

이런식으로 이미지가 만드는 과정을 보여준다.

이미지가 정상적으로 만들어진 것을 확인할 수 있다.

docker run --rm ubuntu:git2 git --version 명령어로 git이 설치가 잘되었는지 확인해보자.

Dockerfile 작성법

좀더 자세하게 Dockerfile에 대해서 알아보자.

  • FROM 에는 베이스 이미지 이름을 기입하면 되고 <이미지 이름>:<태그명>으로 작성 할 수 있다.
    ARG랑 조합하면 아래와 같이 Dockerfile을 작성해 볼 수 있다.
ARG VERSION=latest
FROM busybox:$VERSION
ARG VERSION
RUN echo $VERSION > image_version
  • LABEL 은 이미지의 상세정보를 추가 할 수 있게 해주는 명령어이다.
FROM scratch
LABEL "블로그"="https://velog.io/@korjsh"
LABEL 만든사람="korjsh"
LABEL version=1.0
LABEL description="좋은 이미지를 만들어 봤습니다."

이미지를 빌드 후 라벨을 확인해보자 docker build -t label . , docker image inspect --format='{{json .Config.Labels}}' label
이렇게 이미지에 대한 메타정보를 label을 통해서 추가할 수 있다.

  • EXPOSE 는 컨테이너의 특정 포트를 매핑할 준비를 하겠다는 기능이다.
FROM scratch
EXPOSE 8888

8888포트를 EXPOSE하는 이미지를 만들어서 컨테이너를 실행해보자.

docker ps 로 확인한 결과 8888 포트가 생긴것을 볼 수 있다. 하지만, 저렇게 설정해놓는것은 아무 동작도 하지 않을 것이다. 왜냐하면, 호스트 포트가 매핑이 안되어 있기 때문!
만약 EXPOSE로 설정해 놓았다면, -P 태그를 추가하면 호스트에 포워딩 가능한 포트를 랜덤으로 배정해준다.

  • ENV 환경변수
    ENV는 ARG랑 유사하지만, 컨테이너 안에서 환경변수로 사용가능하고, ARG는 오직 Dockerfile 내에서 사용가능하다.
FROM alpine
ENV name korjsh
ENV age 31
ENV company=google \
address=seoul 

환경변수가 잘 적용됬는지 컨테이너를 올려서 확인해보거나, 이미지 inspect 명령어로 확인가능하다.

아래 명령어로 이미지에 들어있는 env 를 확인가능하다.
docker image inspect --format='{{json .Config.Env}}' env

  • ADD, COPY
    ADD와 COPY 모두 호스트 파일을 컨테이너 안에다가 복사하는 명령어로 쓸 수 있다.
    차이점은 ADD는 외부 URL로 다운로드도 가능하다는 점이다.
FROM alpine
ADD Testfile.txt /root/add/test.txt
COPY Testfile.txt /root/copy/test.txt
ADD https://dimg.donga.com/ugc/CDB/WEEKLY/Article/5b/b3/22/85/5bb32285000ed2738de6.jpg /root/add/download/cat.jpg

  • RUN

이미지 레이어를 추가할 때 쓰는 명령어인데, 대부분 패키지 설치할때 사용한다. 베이스 이미지 OS마다 RUN뒤에 패키지 설치 명령어가 다를 수 있다.
예제에서는 centos7 이미지를 사용해서 httpd, php, nginx를 설치하는 방법이다.
기본적으로 /bin/sh -c를 통해서 실행되기 때문에, 직접 명령어를 써도 상관없지만, 이미지에 포함되어 있지 않을경우 exec 형식을 사용하면 된다.

FROM centos:7
RUN yum -y install httpd php
RUN ["/bin/bash", "-c", "yum -y install nginx"]
  • CMD, ENTRYPOINT

CMD와 ENTRYPOINT는 컨테이너가 만들어지고나서 실행되는 명령어이다.
CMD의 경우 docker run 뒤의 쉘 명령어가 있다면, 무시된다.

FROM centos:7
CMD ["/bin/ls", "-lh", "/root"]

docker run -it cmd
docker run -it cmd ls -la

ENTRYPOINT의 경우 명령어는 고정 인자값은 run 뒤에서 받아서 사용가능 하다.
만약에 명령 수정을 하고 싶으면, 컨테이너 실행할때, --entrypoint 태그를 추가해주면 된다.

FROM centos:7
ENTRYPOINT ["/bin/ls", "-lh", "/root"]

docker run -it entrypoint
docker run -it entrypoint -la
docker run -it --entrypoint="cat" entrypoint /etc/hosts

정리하자면, 명령어를 수정가능한 형태로 쓰고 싶다면 CMD, 명령어는 고정으로 쓰고 인자만 수정하고 싶다면 ENTRYPOINT를 사용하면 된다.

  • WORKDIR

컨테이너 실행시 메인이되는 경로를 설정할 수 있다. 아래 예제는 CMD와 연계하여 쓰는 경우이다.

FROM alpine
COPY Testfile.txt /root/dir/test.txt
WORKDIR /root/dir
CMD cat test.txt 

.dockerignore file

컨테이너에 포함되지 않을 파일이나 폴더를 정할 수 있다.

여기서는 .git 파일을 ignore 시켜보겠다.

  1. .dockerignore
.git
  1. Dockerfile
FROM alpine
COPY volume /root/volume
RUN apk update && apk add tree
WORKDIR /root/volume
CMD tree

참고 출처 https://www.44bits.io/ko/post/building-docker-image-basic-commit-diff-and-dockerfile

도커 레지스트리

이미지를 만들고 나면, 따로 저장 해놓는게 좋은데, 이럴때, 도커허브에 업로드하거나 프라이빗 레지스트리에 올리는 방법 중 하나를 선택할 수 있음!

일단 도커 허브에 올리는 방법은 매우 간단하다.

docker pull registry
docker images

profile
Backend Developer, DevOPS Engineer, IIoT, IoT

0개의 댓글