Docker에서 Image란?
1. 정의
- Docker에서 Image란 컴퓨터의 CD와 같다고 볼 수 있습니다.
- 그래서 Docker의 Image는 수정 할 수 없습니다.
단, image에 추가로 무언가를 추가는 할 수 있습니다.
2. 구조
- Docker의 Image지는 layer 구조로 되어 있습니다.
- 즉, 기본이 되는 image가 존재하고, 그 image에 계속해서 추가하는 방식으로 image를 생성 합니다.
- 아래는 image의 layer 구조를 설명 그림으로 그린 것입니다.
1 | $ docker inspect {image 이름} |
Container 이용한 Image 생성
1. 핵심
- 실행 중인 container 수정 후, 수정된 container를 새로운 image로 만듭니다.
2. image 생성 형식
1 | $ docker commit [OPTIONS] container [REPOSITORY[:TAG]] |
- 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 작성 방법
- Web Server Docker Maker file Sample
1 | FROM centos |
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 | $ docker build -t {image 이름:tag 명} ./ |
- t 옵션 : image명을 지정 합니다.
- 마지막 ./ 이 사용된 이유는 Dockerfile을 현재 경로에서 찾겠다는 의미 입니다.
추후에 URL을 통해서 받는 방법도 알아 보곘습니다.
5. Dockerfile을 이용한 image build 원리.
- Dockerfile은 base image를 이용하여 그위에 명령어 하나를 실행 한 후 image에 commit을 하여 image를 만들어 나갑니다.
- 그래서 각 명령어는 하나의 Step을 의미하면 Step은 하나의 commit이 됩니다.
해당 작업 내용은 docker history {image명}에서 확인 가능합니다.
참고 (inspect로 확인시)
- docker inspect {image명} 의 맨 마지막 layer으로 보면 몇줄만 추가 된 것을 볼 수 있습니다. 이는 layer에서는 image에 변경된 사항만 추가하기 때문입니다.
- base image는 centos 입니다.
1 | $ docker inspect centos |
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 |