도커 이미지

도커 이미지는 애플리케이션 뿐만아니라 애플리케이션을 실행하기 위한 모든 것들을 담고 있다. 운영체제, 데이터베이스, 웹서버 등 시스템 상에서 이용되는 대부분의 요소를 이미지로 생성할 수 있다.

Image on Docker Hub

도커 컨테이너의 라이프 사이클을 돌아보면 모든 컨테이너는 이미지로부터 시작한다.

$ sudo docker conatiner run -it --name ubuntu ubuntu:latest

run 명령어를 통해서 컨테이너를 생성 및 시작하게 되면 컨테이너에 프로세스가 실행되고 스냅샷이 올라가 있다. 이때, ubuntu:latest라는 이미지가 로컬환경에 없다면 도커 허브라는 레지스트리에서 해당 이미지를 가지고 와서 컨테이너를 실행시킨다. 도커 허브에서는 개인이 빌드한 이미지는 물론 도커 공인 이미지 까지 확인 가능하다.

Summary

컨테이너를 실행할 때, 단일 이미지만 이용하는 경우는 드물다. 실제 운영환경에서 실행되는 이미지는 베이가 되는 이미지, 설정 파일, 그리고 명령들을 모아 빌드한 이미지를 가지고 컨테이너를 실행하게 되는데, 베이스 이미지, 설정 파일, 명령 들을 모아둔 파일이 바로 도커파일(Dockerfile)이다.

도커 이미지 관리

1) pull - 도커 이미지 받기

이미지를 받아올 때는 pull 명령어를 사용한다.

$ sudo docker image pull ubuntu
$ sudo docker image pull ubuntu:latest(image[:tag])

이미지를 버전 별로 태깅을 한다고 하는데, OS를 예로 들면 버전 별로 다르기 때문에 버전으로 태깅을 하거나 latest 와 같은 단어로 태깅을 해서 구분한다.

Using default tag: latest

→ 이미지를 pull 할 때 tag 를 명시하지 않으면 프롬프트에 자동으로 latest를 가져 온다.

Digest

→ Docker hub에서 이미지를 식별하기 위해 부여한 고유값으로 레지스트리에 업로드 될 당시에 부여된다.

docker.io/library/ubuntu:latest

→ 이미지가 저장된 URL

2) ls - 도커 이미지 목록 조회 (Local Env)

$ sudo docker image ls

3) inspect - 도커 이미지 정보 조회

$ sudo docker image inspect ubuntu:latest
$ sudo docker image inspect --format="{{ .RepoTags }}" ubuntu:latest

해당 이미지의 정보가 JSON 형태로 출력된다. 원하는 부분만 보고 싶다면 Go lang 문법으로 위와 같이 조회할 수 있다.

4) tag - 도커 이미지에 태그 설정

$ sudo docker image tag ubuntu:18.04(target image) shawn/ubuntu:1.0(username / imagename[:tag])

태그를 설정하게 되면 로컬 환경에 존재하는 이미지의 이름과 태그를 변경하는 것이 아니라 해당 이미지를 복제하면서 이름과 태그를 새로 붙이게 된다.

5) rm - 도커 이미지 삭제

$ sudo docker image rm shawn/ubuntu:1.0
$ sudo docker image rm -f shawn/ubuntu:1.0

rm 커맨드를 통해서 이미지를 삭제할 수 있는데 위와 같이 태그를 설정한 이미지를 삭제 하게 되면 해당 이미지만 삭제(태그 해제) 되어 버린다. 원본 이미지는 별도로 삭제 해주어야 하며 한번에 삭제를 원한다면 -f 옵션을 통해서 한번에 삭제할 수 있다. 이는 태그를 설정한 이미지 외에도 다른 이미지에서 원본 이미지를 참조 할 수 있기 때문이다.

6) container commit - 실행 중인 컨테이너로 부터 이미지 생성

이미지를 기반으로 컨테이너를 만든 것 처럼, 운영 중인 컨테이너를 기반으로 이미지를 만들 수도 있다. 해당 명령어를 실행하면 컨테이너를 실행했을 때 사용했던 이미지를 생성하는 것이 아니라 새로운 이미지를 생성한다. 명령어가 실행되는 시점의 컨테이너 상태의 스냅샷을 이미지로 만들기 때문이다.

$ sudo docker container commit -a(--author)  'shawn' apache shawn/apache-web:1.0 (-a [username] [container name] [image name]
$ sudo docker container commit -m(--message) 'message' apache shawn/apache-web:1.0 (-m [message] [container name] [image name]

7) container export - 실행 중인 컨테이너로 부터 이미지 파일 생성

실행 중인 컨테이너로 부터 이미지를 파일형식으로 추출한다. 추출된 파일을 가지고 import 명령어를 통해서 이미지를 생성할 수 있다.

$ sudo docker container export apache(컨테이너명) > /usr/apache.tar([/경로]파일명)

8) import - 파일을 이미지로 생성

export 했던 파일을 가지고 이미지를 생성한다.

$ sudo docker image import apache.tar shawn/apache:1.0 ([name of file] [name of image[:tag]]

Dockerfile

도커파일은 새로운 이미지를 빌드하기 위해서 필요한 이미지와 설정들을 작성한 파일이다. 어떤 이미지를 사용, 환경 설정 등에 대해 정의하고 나면 문법에 맞춰 작성하기만 하면 된다.

FROM ubuntu:18.04

RUN apt-get -y update && apt-get -y upgrade
RUN apt-get -y install nginx

EXPOSE 80

CMD nginx -g daemon off # shell 
CMD ["nginx", "-g", "daemon off;"] # exec

우분투 18.04 버전에서 ngnix 설치 후 80포트로 실행하는 내용을 도커파일로 작성했다. 해당 파일로 빌드하게 되면 해당 내용을 수행하는 이미지가 생성된다. 도커파일로 사전에 인프라를 구성해두면 애플리케이션 개발 시점에는 컨테이너를 실행만 하면 된다.

FROM 명령어는 베이스 이미지를 설정한다. 이 후 실행 되는 모든 명령어들은 베이스 이미지를 기반으로 하게 된다.

도커파일은 베이스 이미지를 시작으로 레이어로 구성되어 있는데, 각 명령이 레이어를 구성한다. 이 때 생성되는 중간 이미지는 캐싱되기에 다른 이미지를 생성할 때도 사용된다.

FROM ubuntu:18.04

FROM 절은 베이스 이미지를 설정한다. 빌드할 이미지의 베이스를 우분투로 설정한다는 의미이다.

RUN apt-get -y update && apt-get -y upgrade
RUN apt-get -y install nginx

RUN 절은 이미지를 생성에 필요한 미들웨어나 어플리케이션을 세팅하기 위한 명령을 실행한다. 여기서는 apt-get 명령어를 통해 'nginx'를 설치한다.

EXPOSE 80

'nginx' 웹서버를 통해 외부와 통신하기 위해서는 기본적으로 포트가 열려있어야 합니다. HTTP 방식의 통신을 위해 '80'번 포트를 열어주었다.

CMD ["nginx", "-g", "daemon off;"]

nginx 설치 및 포트 설정이 완료된 후에는 웹 서버를 구동 시킨다. CMD 명령은 생성된 이미지를 기반으로 구동 된 컨테이너에서 명령을 실행하는 것이며, 하나의 Dockerfile에서 한 번의 명령만 유효하다. 복수의 CMD 명령이 있을 경우 마지막 CMD 명령만 실행된다.

Dockerfile 빌드

Dockerfile을 기반으로 이미지를 생성한다.

sudo docker build -t sample:1.0 /home/(USER)/docker

sudo docker build -t 는 도커 이미지를 생성하기 위한 기본 명령어이다. [이미지명]:[버전] 의 형태로 작성한다. 마지막 부분에는 경로를 입력하며, Dockerfile이 있는 경로로 이동해서 현재 경로를 나타내는 . 를 사용하거나 절대 경로, 상대 경로를 입력하는 것 모두 가능하다.

Dockerfile 명령어

  1. FROM - 베이스 이미지 할당
  2. RUN - 이미지 생성을 위한 명령 실행
  3. CMD - 컨테이너 내부에서 명령을 실행
  4. LABEL - 라벨 설정
  5. EXPOSE - 포트 할당
  6. ENV - 환경변수 설정
  7. ADD - 파일/디렉토리 추가
  8. COPY - 파일 복사
  9. ENTRYPOINT - 컨테이너 내부에서 명령 실행
  10. VOLUME - 볼륨 마운트
  11. USER - 특정 사용자 지정
  12. WORKDIR - 작업 디렉토리 설정
  13. ARG - 도커파일 내부 변수 설정
  14. ONBUILD - 빌드 완료 후 명령 실행
  15. STOPSIGNAL - 시스템 콜 시그널 설정
  16. HEALTHCHECK - 컨테이너 상태 체크
  17. SHELL - 컨테이너에서 사용할 기본 쉘 설정

Best practices for writing Dockerfiles

좋은 웹페이지 즐겨찾기