애플리케이션을 배포하기 위한 개인 도커 이미지를 만들어 보려고 한다. 만들려는 이유는 다음과 같다.
애플리케이션 환경에 맞게 도커 이미지를 커스터마이징.
일반적으로 사용하는 우분투 도커 이미지는 다양한 기능들을 가지고 있어서 편하긴 하지만 너무 크다. 우분투 14.04 이미지는 크기만 188M가 넘어간다. 필요한 일만 하는 효율적인 애플리케이션 전용 이미지를 만들어서 배포한다.
Dockerfile
도커는 이미지에 대한 명세가 적힌 Dockerfile를 읽어서, 자동으로 이미지를 만들어주는 기능을 제공한다. Dickerfile의 모든 명세는 줄 단위로 해석 할 수 있는 간단한 스크립트로 작성할 수 있다. 이 Dockerfile을 이용해서 커스텀 도커 이미지를 만들 수 있다.
Dockerfile 사용
build
docker build 명령을 실행하면 Dockerfile을 읽어서 이미지를 만든다. 이 명령을 실행 할 때는 Dockerfile의 경로만 정해주면 된다. 현재 디렉토리에 Dockerfile있다면, 아래와 같이 명령을 내리면 된다.
build 명령을 내리면 도커는 줄 단위로 명령을 해석한다. 예를 들어 COPY를 만나면 파일을 복사하는 일을 수행한다. 그리고 -t 옵션을 이용해서 이미지 이름을 설정 할 수 있다. 예를 들어 scratch로 부터 새로운 이미지를 만들었다면 아래와 같이 이름을 붙이면 된다.
# docker build -t hello/scratch .
형식
# Comment : 주석
INSTRUCTION arguments
주요 Instruction
FROM
FROM <image>
도커의 이미지들은 Base Image로 부터 만들어진다. 어떤 이미지로 부터 만들어질지를 설정한다.
MAINTAINER
MAINTAINER <name>
도커 이미지를 만든 사람
RUN
두 가지 형식이 있다.
RUN <command> : /bin/sh -c
RUN ["executable", "param1", "param2"] : exec 형식
이미지를 빌드 할 때, RUN에 설정된 명령이 실행되고 그 결과가 이미지에 commit 된다. 이미지에 특정 패키지를 설치하려고 할 때, 사용 할 수 있다.
Hello world 도커 이미지 만들기
Hello world웹 애플리케이션을 위한 도커 이미지를 만들어 보자. Go 언어로 hello world 프로그램을 만들었다. Go 프로그램은 하나의 파일로 작동하는 소프트웨어를 만들 수 있으므로 특히 컨테이너와 궁합이 잘 맞는다고 할 수 있다. 프로그램의 이름은 hello.go다.
package main
import (
"fmt"
"net/http"
)
func helloWorld(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello world from Go in minimal docker container")
}
func main() {
http.HandleFunc("/", helloWorld)
err := http.ListenAndServe("0.0.0.0:8000", nil)
if err != nil {
panic("ListenAndServer :" + err.Error())
}
}
go 코드를 컴파일 한다.
# CGO_ENABLED=0 GOOS=linux go build
이제 scratch를 이용해서 도커 이미지로 만들기로 했다. scratch는 도커에서 제공하는 minimal 이미지다. Dockerfile이다.
Contents
소개
Dockerfile
Dockerfile 사용
build
형식
주요 Instruction
FROM
MAINTAINER
RUN
Hello world 도커 이미지 만들기
Recent Posts
Archive Posts
Tags