Cloud/Docker

5. Docker Image 만들기 / 삭제 (리눅스 용)

jinkwon.kim 2019. 2. 19. 16:33
728x90
반응형

5. Docker Image 만들기 / 삭제 (리눅스 용)




관련 포스트◀

1. Docker 가상화 서버 개념 (리눅스용)

2. Docker 가상화 서버 설치 및 image 다운로드 (리눅스용)

3. Docker Container 관리 (리눅스 용)

4. Docker 네트워크 (리눅스 용)

5. Docker Image 만들기 / 삭제 (Linux 용)

6. Docker cluster - swarm (리눅스 용)



- Docker version 18.09.1, build 4c52b90


▶Docker에서 Image란?


1. 정의

    - Docker에서 Image란 컴퓨터의 CD와 같다고 볼 수 있습니다.

    - 그래서 Docker의 Image는 수정 할 수 없습니다.

      단, image에 추가로 무언가를 추가는 할 수 있습니다.


2. 구조

    - Docker의 Image지는 layer 구조로 되어 있습니다.

    - 즉, 기본이 되는 image가 존재하고, 그 image에 계속해서 추가하는 방식으로 image를 생성 합니다.

    - 아래는 image의 layer 구조를 설명 그림으로 그린 것입니다. 

      #docker inspect {image 이름}


<원본 image>                   <원본 image를 수정후 다시 만든 image>





▶Container 이용한 Image 생성


1. 핵심

  - 실행 중인 container 수정 후, 수정된 container를 새로운 image로 만듭니다.

2. image 생성 형식

  #docker commit [OPTIONS] container [REPOSITORY[:TAG]]

   Ex) docker commit -a "doitnowman" -m "modification" webhttpd webhttpd:v1

  - commit을 한번 할 때 마다 image에 layer가 추가 됩니다. 


3. 수정된 image 생성 과정 

  1) container 구동

    #docker run -d -p 1443:80 --name=webhttpd httpd

      - p : 외부로 공개 할 포트와 container의 Port를 binding 합니다

           [외부 공개용 host port]:[container port]

      - d : detach 옵션 , container를 background로 실행 합니다.

            단, detach 모드로 container 실행시 container내부에는 무언가  항상 돌아 가고 있어야 합니다.

            그렇지 않으면 생성 후 바로 종료 됩니다.




    2) 새로운 image 생성 

      #docker commit -a "doitnowman" -m "modification" webhttpd webhttpd:v1



    3) 새로운 image로 container 구동

      #docker run -d -p 3836:80 --name=webhttpdv1 webhttpd:v1




3. 수정된 image 생성 시 base image는 복사 하여 다시 생성되는가?
  - 그렇지 않습니다,
    docker는 base image기반으로 수정된 image를 생성 시 수정된 부분만 관리 합니다.
    그렇기 때문에 수정된 image가 생성 되어도, 용량은 "image + 수정 된 부분" 만큼만 늘어 납니다.
  - 즉 docker는 image생성시 변화되는 부분만을 관리 합니다.

4. 생성한 image를 파일로 만드는 방법
  - 외부로 image 파일을 보내고 싶을때 사용 합니다. 

  1) docker 내부의 image를 외부 파일 image로 생성 방법
    - 이미지를 묶은 파일로 생성 할 뿐 압축은 하지 않습니다. 별로도 압축 필요
    #docker save -o {image 파일 이름}.tar {image 명}
  
  2) 파일 image를 docker로 load하는 방법
    - 상기 1)에서 만든 파일을 docker 내부로 load 합니다.
    #docker load -i {image 파일 이름}.tar




▶Dockerfile 을 이용한 image 생성


1. Dockerfile 이란?

  - image 파일을 만들기 위한 일련의 과정을 기술해 놓은 파일 입니다.

  - Container를 통해서 할 수 있지만 image에 Commit하고 하는 과정이 번거로워 Dockerfile을 사용 합니다.

  - Dockerfile사용시 이미지 파일 생성을 자동화 할 수 있고 이미지 관리를 할 수 있습니다.



2. Dockerfile 작성 방법 

  1) Web Server Docker Maker file Sample

FROM centos

MAINTAINER doitnowman

LABEL "purpose"="webdev"

RUN yum -y install httpd

ADD index.html /var/www/html

WORKDIR /var/www/html

RUN ["/bin/bash", "-c", "echo hi doitnowman >> index.html"]

EXPOSE 8888

CMD apachectl -DFOREGROUND


3. Dockerfile 명령어 설명

  1) FROM

    - 기본 base가 되는 image를 선정 합니다 


  2) MAINTAINER

    - image 생성자 정보 


  3) LABEL

    - image에 추가할 metadata

    * metadata

      - 부가적인 설명을 의미합니다.

  4) RUN

    - container 내부에서 실행 할 명령어

    - 사용법 2가지 

    (1) 한줄 명렁어로 사용

      - RUN yum -y install httpd

    (2) 배열 형태로 사용

      - 배열 형태로 사용시 기본적으로 shell이 실행 되지 않기 떄문에 첫 인자로 shell을 지정해야 합니다. 

      - RUN ["실행 가능한 파일", "명령줄 인자 1", "명령줄 인자 2", ... ]

      Ex) RUN ["/bin/bash", "-c", "echo hello >> index.html"]


  5) ADD

    - container에 파일 추가 명령어

    - 추가할 파일은 Dockerfile이 존재하는 경로의 파일을 사용 합니다. 


  6) WORKDIR

    - container 내부에서 디렉토리 경로 변경


  7) EXPOSE 

    - 외부에 공개할 포트 번호 

    - docker run 의 -p 옵션 입니다.

  

  8) CMD
    - container가 실행 될때만다 실행 할 명령어 , 딱 한번 사용가능합니다.

    - docker의 run 명령어의 image이름 뒤에 입력하는 command와 같은 열활을 합니다. 

    - 명령어 우선 순위 

      docker의 run 명령어의 image이름 뒤에 입력하는 command 가 Dockerfile의 CMD 보다 높습니다.


  9) ENTRYPOINT

    - CMD와 거의 같으나 Container생서(run)이나 시작(start)될 때 실행

    - docker run 실행 시 실행되는 명령이라고 생각해도 좋을 것 같다.

      ENTRYPOINT["./sample.sh"]


  10) ENV

    - 일반적으로 Linux에서는 로그인시 ~/.bashrc 나 ~/.profile을 실행하여 환경 변수를 자동으로 설정 합니다.

      그러나 Docker에서는 환경 변수를 자동으로 설정 하지 않습니다. 

      그래서 필요시 ENV로 환경 변수를 지정해 줘야 합니다.

    - docker run으로 실행 시 --env 옵션을 사용합니다.


  11) USER

    - 사용자 변경

    - test로 변경하는 예제

      USER tester  


  12) VOLUME

    - 특정 디렉토리를 container 내부 디렉토리가 아닌 host의 물리 디렉토리에 맵핑 시킵니다.

    - docker run 의 -v {host direcotry}:{container directory}옵션과 같습니다

    Ex) 단일 디렉토리 맵핑  : VOLUME /data

        다수 디렉토리 맵핑  : VOLUME ["/data", "/var/log/hello"]

    - 단, VOLUME으로는 호스트의 특정 디렉터리와 연결할 수는 없습니다.

      데이터 볼륨을 호스트의 특정 디렉터리와 연결하려면 docker run 명령에서 -v 옵션을 사용해야 합니다.

      #docker run -v /root/data:/data example


  *) 그외의 명령어

     - 아래 링크를 참조 하세요.

       https://docs.docker.com/engine/reference/builder/


4. Dockerfile을 이용한 image build

  #docker build -t {image 이름:tag 명} ./

   - t 옵션 : image명을 지정 합니다.

   - 마지막 ./ 이 사용된 이유는 Dockerfile을 현재 경로에서 찾겠다는 의미 입니다.

    추후에 URL을 통해서 받는 방법도 알아 보곘습니다.

   Ex) docker build -t myweb:01 ./ 


5. Dockerfile을 이용한 image build 원리.

  - Dockerfile은 base image를 이용하여 그위에 명령어 하나를 실행 한 후 image에 commit을 하여 image를 만들어

    나갑니다.

  - 그래서 각 명령어는 하나의 Step을 의미하면 Step은 하나의 commit이 됩니다.

    해당 작업 내용은 docker history {image명}에서 확인 가능합니다.


<docker history 내역>


    * 참고 (inspect로 확인시) 

      - docker inspect {image명} 의 맨 마지막 layer으로 보면 몇줄만 추가 된 것을 볼 수 있습니다.

        이는 layer에서는 image에 변경된 사항만 추가하기 때문입니다.

      - base image는 centos 입니다.

        #docker inspect centos






▶Docker에서 Image 삭제


1. 삭제

  #docker rmi {image 이름}

    - f : 강제로 image 삭제


  1) 유의 사항 

    - image를 사용 중인 container가 존재 할 때는 삭제 할 수 없다는 에러가 뜹니다. 

      그러나 -f 옵을 주어 강제 삭제 시, image 명이 <none>으로 변경 됩니다.

      이러한 image를 dangling image라고 합니다.



  2) 수정된 image를 삭제 할때 base image도 삭제 될까? 

    - base image를 수정하여 만든 image를 삭제 시 base image는 지워지지 않고 수정된 부분만 삭제 합니다.


2. 사용 중이지 않는 dangling image 삭제 

  #docker image prune





참조 : 시작하세요 도커 Beginning! Docker

728x90
반응형