이미지 빌드의 개요
위 이미지는 컨테이너의 이미지를 만드는 과정을 표현한다.
도커 이미지를 만들기 위해서는 명령어 docker build [옵션] 경로|URL|-을 사용하면 된다.
베이스 이미지 선택
이미지를 만들 때 바탕이 되는 이미지를 베이스 이미지라고 한다.
베이스 이미지에는 리눅스의 공유 라이브러리, 동적 링크나 로드에 필요한 기초적인 파일들이 포함되어, 이를 기반으로 사용자의 이미지를 만들게 된다.
도커 허브에는 다양한 미들웨어나 프로그래밍 언어가 포함된 이미지가 등록되어 있다.
분류 | 공식 이미지 |
리눅스 배포판 | alpine, busybox, ubuntu, centos, debian, fedora, amazonlinux, opensuse, oraclelinux |
프로그래밍 언어 | node, golang, php, python, openjdk, ruby, java, jruby, perl, elang, pypy, mono, gcc, rails, ibmjava, rust, swift |
NoSQL 데이터베이스 | redis, mongo, memcached, cassandra, couchbase |
SQL 데이터베이스 | postgres, mysql, mariadb, percona |
Web 서버 | nginx, httpd |
Servlet/JSP 서버 | tomcat jetty, websphere-liberty |
콘텐츠 관리 시스템 | wordpress, ghost, drupal |
컨테이너 | registry, docker, swarm, hello-world |
로그와 매트릭 분석 | ElasticSearch, InfluxDB, logstash, telegraf, kibana |
CI/CD | maven, jenkins, sonarqube |
빈 이미지 | scratch |
소프트웨어 패키지 설치
애플리케이션 실행에 필요한 소프트웨어 패키지를 설치한다.
주로 운영체제나 프로그래밍 언어의 패키지 매니저를 사용해서 설치하게 된다.
예를 들어, 데비안 계열의 리눅스에서는 apt를 사용하고 레드햇 계열 리눅스에서는 yum을 사용한다.
프로그래밍 언어의 경우는 파이썬이나 pip나 Node.js의 npm 등이 있다.
Dockerfile에 설치 스크립트를 기재하면 베이스 이미지 위에 소프트웨어 패키지가 설치된다.
애플리케이션 소스 코드
깃헙 혹은 로컬에 있는 소스 코드를 이미지에 복사한다.
Dockerfile
이미지를 빌드하는 스크립트가 기재된 파일로서, 다음과 같은 내용을 담고 있다.
- 베이스 이미지의 리포지터리
- 설치할 패키지
- 애플리케이션 코드와 설정 파일
- 컨테이너 기동 시 실행될 명령어
빌드 실행 순서
이미지를 빌드하기까지의 흐름은 다음 5단계로 구성된다.
- 디렉터리를 준비하여 이미지에 포함시킬 파일들을 모은다.
- Dockerfile을 작성한다.
- 컨테이너에서 실행할 애플리케이션 코드를 작성하고 유닛 테스트를 실행한다.
- 이미지를 빌드한다.
- 컨테이너를 실행하고 동작을 확인한다.
이번에는 message라는 이름의 파일에 있는 문자열 아스키 아트(ASCII ART)로 변환하여 출력하는 컨테이너를 만들어 보겠다.
먼저 컨테이너에 포함시킬 파일들을 담을 test라는 폴더를 생성하고 이동한다.
베이스 이미지, 이미지에 포함시킬 파일, 컨테이너에서 실행될 명령어가 기술된 Dockerfile을 작성한다.
- FROM alpine:latest
FROM으로 베이스 이미지를 지정. 이미지가 로컬에 없으면 도커 허브에서 다운로드한다.
aalpine은 리눅스의 기본적인 커맨드만 설치되어 있는 경량 이미지이다. - RUN apk update && apk add figlet
RUN으로 컨테이너에서 실행할 명령어를 지정한다.
여기서는 alpine의 패키지 매니저인 apk를 업데이트하고 figlet이란 커맨드를 설치한다.
figlet은 아스키 아트를 출력하는 커맨드이다.
&&는 왼쪽의 커맨드가 정상적으로 종료된 후 오픈쪽의 커맨드가 실행된다. - ADD ./message /message
ADD로 컨테이너에 배치할 파일이나 디렉터리를 지정한다.
현재 디렉터리에 있는 message라는 파일을 컨테이너의 루트 디렉터리에 배치하고 있다. - CMD cat /message | figlet
CMD로 컨테이너가 기동한 직후에 실행하는 커맨드를 지정한다.
cat message의 결과를 figlet 커맨드의 표준 입력으로 전달하고 있다.
이제 message 파일에 적당한 메세지를 기록하고 이미지를 빌드해 보자
docker build --tag 리포지터리명[:태그] 경로를 실행하면 Dockerfile에 따라 이미지를 빌드한다.
옵션 --tag는 빌드된 이미지의 리포지터리 이름과 태그를 지정한다.
마지막에 추가된 점(.)은 Dockerfile의 경로를 지정하기 위한 것으로 현재 디렉터리에 Dockerfile이 있음을 의미한다.
점(.) 앞에 반드시 빈 칸을 넣어야 하는것도 주의한다.
빌드가 완료된 후 docker images를 실행하면 방금 빌드한 이미지가 표시된다.
컨테이너를 실행해보자.
docker logs 컨테이너ID로 실행 중에 표준 출력으로 출력한 메시지를 볼 수 있다.
'Docker & Kubernetes' 카테고리의 다른 글
컨테이너와 네트워크 (0) | 2021.11.26 |
---|---|
Dockerfile 작성법 (0) | 2021.11.26 |
컨테이너 다루기(2/2) (0) | 2021.11.26 |
컨테이너 다루기(1/2) (0) | 2021.11.25 |
컨테이너의 생명 주기와 도커 커맨드 (0) | 2021.11.25 |