5. Docker Image 만들기 / 삭제 (리눅스 용)
▶관련 포스트◀
2. Docker 가상화 서버 설치 및 image 다운로드 (리눅스용)
3. Docker Container 관리 (리눅스 용)
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
▶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
'Cloud > Docker' 카테고리의 다른 글
7. Docker - cheat sheet (0) | 2019.05.03 |
---|---|
6. Docker cluster - swarm (리눅스 용) (0) | 2019.02.28 |
4. Docker 네트워크 (리눅스 용) (0) | 2019.01.31 |
3. Docker Container 관리 (리눅스 용) (2) | 2019.01.30 |
2. Docker 가상화 서버 설치 및 image 다운로드 (리눅스용) (0) | 2019.01.30 |