Docker Image 만들기 / 삭제 (Linux)

Docker에서 Image란?

1. 정의

  • Docker에서 Image란 컴퓨터의 CD와 같다고 볼 수 있습니다.
  • 그래서 Docker의 Image는 수정 할 수 없습니다.

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

2. 구조

  • Docker의 Image지는 layer 구조로 되어 있습니다.
  • 즉, 기본이 되는 image가 존재하고, 그 image에 계속해서 추가하는 방식으로 image를 생성 합니다.
  • 아래는 image의 layer 구조를 설명 그림으로 그린 것입니다.
1
$ docker inspect {image 이름}

layer 구조


Container 이용한 Image 생성

1. 핵심

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

2. image 생성 형식

1
2
3
$ docker commit [OPTIONS] container [REPOSITORY[:TAG]]

$ docker commit -a "doitnowman" -m "modification" webhttpd webhttpd:v1 // ex
  • commit을 한번 할 때 마다 image에 layer가 추가 됩니다.

3. 수정된 image 생성 과정

1) container 구동

1
$ 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 생성

1
$ docker commit -a "doitnowman" -m "modification" webhttpd webhttpd:v1

3) 새로운 image로 container 구동

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

4. 수정된 image 생성 시 base image는 복사 하여 다시 생성되는가?

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

5. 생성한 image를 파일로 만드는 방법

  • 외부로 image 파일을 보내고 싶을때 사용 합니다.

1) docker 내부의 image를 외부 파일 image로 생성 방법

  • 이미지를 묶은 파일로 생성 할 뿐 압축은 하지 않습니다. 별로도 압축 필요
1
$ docker save -o {image 파일 이름}.tar {image 명}

2) 파일 image를 docker로 load하는 방법

  • 상기 1)에서 만든 파일을 docker 내부로 load 합니다.
1
docker load -i {image 파일 이름}.tar

Dockerfile 을 이용한 image 생성

1. Dockerfile 이란?

  • image 파일을 만들기 위한 일련의 과정을 기술해 놓은 파일 입니다.
  • Container를 통해서 할 수 있지만 image에 Commit하고 하는 과정이 번거로워 Dockerfile을 사용 합니다.
  • Dockerfile사용시 이미지 파일 생성을 자동화 할 수 있고 이미지 관리를 할 수 있습니다.

2. Dockerfile 작성 방법

  1. Web Server Docker Maker file Sample
1
2
3
4
5
6
7
8
9
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 옵션을 사용해야 합니다.
1
$ docker run -v /root/data:/data example

그외의 명령어

4. Dockerfile을 이용한 image build

1
2
3
$ docker build -t {image 이름:tag 명} ./

$ docker build -t myweb:01 ./ // ex
  • t 옵션 : image명을 지정 합니다.
  • 마지막 ./ 이 사용된 이유는 Dockerfile을 현재 경로에서 찾겠다는 의미 입니다.
    추후에 URL을 통해서 받는 방법도 알아 보곘습니다.

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 입니다.
1
$ docker inspect centos

DOCKER inspect 이력


Docker에서 Image 삭제

1. 삭제

1
$ docker rmi {image 이름}
  • f: 강제로 image 삭제

1) 유의 사항

  • image를 사용 중인 container가 존재 할 때는 삭제 할 수 없다는 에러가 뜹니다.
    그러나 -f 옵을 주어 강제 삭제 시, image 명이 으로 변경 됩니다.
    이러한 image를 dangling image라고 합니다.

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

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

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

1
$ docker image prune

참조

공유하기