Docker 좀더 활용하기

이재홍 http://www.pyrasis.com 2014.08.02 ~ 2014.09.20

빈 베이스 이미지 생성하기

아무것도 들어있지 않은 베이스 이미지를 생성하는 방법입니다. Docker에서는 빈 베이스 이미지를 scratch 이미지라고 부릅니다.

/dev/null 장치를 이용하여 빈 tar 파일을 만들어서 docker import 명령에 전달합니다.

$ tar cv --files-from /dev/null | sudo docker import - scratch

scratch 이미지는 안에 아무것도 없기 때문에 컨테이너로 생성이 되지 않습니다. 여기서 Dockerfile을 작성하여 여러분이 만든 실행 파일을 넣으면 됩니다.

간단하게 C언어로 만든 프로그램을 scratch 이미지에 넣어보겠습니다. 먼저 hello 디렉터리를 생성한 뒤 hello 디렉터리로 이동합니다.

$ mkdir hello
$ cd hello

다음 내용을 hello.c로 저장합니다.

hello.c

#include <stdio.h>

int main ()
{
    printf("Hello Docker\n");
    return 0;
}

hello.c 파일을 컴파일하여 실행 파일로 만듭니다. scratch 이미지에는 아무 라이브러리도 없으므로 반드시 정적(static) 바이너리로 컴파일해야 합니다.

~/hello$ gcc hello.c -static -o hello

컴파일러 설치

우분투

$ sudo apt-get install gcc

CentOS

$ sudo yum install gcc
$ sudo yum install glibc-static

다음 내용을 Dockerfile로 저장합니다.

Dockerfile

FROM scratch
ADD ./hello /hello
CMD ["/hello"]

scratch 이미지를 기반으로 새로운 이미지를 생성합니다.

  • FROM: 어떤 이미지를 기반으로 할지 설정합니다. Docker 이미지는 기존에 만들어진 이미지를 기반으로 생성합니다. <이미지 이름>:<태그> 형식입니다. 여기서는 앞에서 만든 scratch 이미지를 설정합니다.
  • ADD: 이미지에 포함할 파일을 설정합니다. <로컬 경로> <이미지 경로> 형식입니다. 앞에서 hello.c 파일을 컴파일하여 생성한 hello 파일을 설정합니다.
  • CMD: 컨테이너가 시작되었을 때 실행할 실행 파일 또는 스크립트입니다. hello 파일이 실행되도록 설정합니다.

docker build 명령으로 이미지를 생성합니다.

~/hello$ sudo docker build --tag hello:0.1 .

이제 scratch 이미지를 이용해서 만든 hello:0.1 이미지를 컨테이너로 생성합니다.

$ sudo docker run --rm hello:0.1
Hello Docker

Hello Docker가 출력되면 실행 파일이 정상적으로 실행된 것입니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

30 November 2014