이번에는 scratch를 이용해서 애플리케이션을 최대한 경량화된 상태로 도커 이미지를 만들어 보는 실습을 통해 scratch에 대한 이해를 하고자 한다. 먼저 scratch를 통해 애플리케이션 이미지 생성을 위한 실행파일 생성, c 컴파일러 gcc를 설치하고자 한다.
ubuntu@docker:~/ch11$ mkdir lightweight2 && cd $_
ubuntu@docker:~/ch11/lightweight2$ sudo apt install -y gcc
# C 프로그램으로 정적 바이너리 생성(실행시 go to lightweight image! 메시지 출력)
ubuntu@docker:~/ch11/lightweight2$ vim go-to-lightweight-image.c
#include <stdio.h>
int main()
{
printf("Go to lightweight image!\n");
return 0;
}
ubuntu@docker:~/ch11/lightweight2$ gcc --static -o go-to-lightweight-image go-to-lightweight-image.c
ubuntu@docker:~/ch11/lightweight2$ ./go-to-lightweight-image
Go to lightweight image!
명령어를 통해 정적 바이너리로 컴파일 할 수 있다. 정적 바이너리는 실행에 필요한 라이브러리를 포함하므로, scratch 같은 최소한의 docker 이미지에서도 독립적으로 실행할 수 있다.
#Ubuntu 기반 Docker image 생성
ubuntu@docker:~/ch11/lightweight2$ vim dockerfile ubuntu
FROM ubuntu:20.04
COPY go-to-lightweight-image /
CMD /go-to-lightweight-image
우분투 이미지를 기반으로 go-to-weight-image 파일을 컨테이너의 루트 디렉토리에 복사했다. 기본 실행 명령어로 설정하여 컨테이너가 시작될 때 go-to-lightweight-image 파일이 자동으로 실행된다.
# Docker 빌드 및 실행
ubuntu@docker:~/ch11/lightweight2$ docker build -t lightweight:1.0 -f dockerfile-ubuntu .
이렇게 해주면 lightweight1.0 이미지에서 c프로그램이 우분투 기반으로 실행이 된다.
#scratch 이미지를 활용하여 Docker image 생성
scratch 이미지는 아무것도 포함하지 않은 빈 베이스 이미지로, 기본적인 실행파일과 필요한 라이브러리까지 사용자가 모두 제공해야한다.
ubuntu@docker:~/ch11/lightweight2$ vim dockerfile-scratch
FROM scratch
COPY go-to-lightweight-image /
CMD ["/go-to-lightweight-image"]
앞서 만든 정적 바이너리 파일을 컨테이너 루트 디렉토리에 복사를 해주고 scratch 이미지는 기본 운영체제가 없으므로 파이을 추가하려면 반드시 정적 바이너리 파일이 필요하다. 컨테이너가 실행될 때 /go-to-lightweight-image 파일을 실행하도록 설정하였다.
# Docker 빌드 및 실행
ubuntu@docker:~/ch11/lightweight2$ docker build -t lightweight:1.0 -f dockerfile-scratch .
# 이미지 크기 비교
scratch 이미지는 매우 가벼운 컨테이너 환경을 제공하는 것 같다. 용량을 줄이고 보안을 강화할 때 효과적인 것 같다.
# 도커 이미지 파일 결과 확인
ubuntu@docker:~/ch11/lightweight2$ docker run -it lightweight:1.0
Go to lightweight image!
ubuntu@docker:~/ch11/lightweight2$ docker run -it lightweight:2.0
Go to lightweight image!
'OS > Docker' 카테고리의 다른 글
[Docker(go, shell-scr)] Multi-stage Build 이미지 경량화 (0) | 2024.11.04 |
---|---|
[Docker] 데이터 지속성을 위한 Volume 구성 (0) | 2024.10.30 |
[Docker] 이미지 경량화 (1) | 2024.10.28 |
[Docker] Dokerfile 빌드 (개발 & 배포 과정) (0) | 2024.10.28 |
[Docker] Dockerfile 및 명령어 (0) | 2024.10.28 |