압축 이미지 볼륨의 다단계 구성
위에서 사용된 공식 파이썬 이미지의 크기는 전체 882MB이며, 이를 기준으로 사용하는 타사 라이브러리를 설치하고 프로젝트에서 필요한 그림 등의 리소스를 추가하면 크기가 1G를 쉽게 초과할 수 있습니다. 큰 이미지, 네트워크 전송은 고객에게 매우 불편하므로 이미지의 크기를 줄이는 것은 매우 필요한 작업입니다.
도커 허브에는 python:3.8-alpine 이미지가 있으며 크기는 44.5MB에 불과합니다. 작은 이유는 Alpine이 일반적으로 임베디드 응용 프로그램에 사용되는 비지박스 아키텍처를 사용하는 운영 체제이기 때문입니다. 이 미러를 사용해보고 일반 라이브러리를 설치하는 것은 괜찮다는 것을 알았지만 numpy 등을 설치하려면 어려울 것이고 인터넷에서 해결책을 찾을 수도 없습니다.
여전히 기본 경로로 돌아가 주류 운영 체제 이미지, 우분투의 크기는 72.9MB, centos의 크기는 209MB입니다. 이것이 내가 우분투를 선호하는 중요한 이유이기도 합니다! ubuntu를 기본 이미지로 사용하면 python 설치 후 크기가 139MB, pip 설치 후 크기가 갑자기 407MB로 늘어나 다른 것을 설치하면 공식 Python 이미지 크기를 쉽게 따라잡거나 초과합니다.
일반적인 경로로는 이미지 파일의 크기를 압축하기 어려운 것 같습니다. 다행히도 곡선으로 나라를 살릴 수 있는 방법은 아직 남아 있는데, 바로 다단공법이다.
다단계 시공의 아이디어는 실제로 매우 간단합니다.먼저 크고 완전한 이미지를 구축한 다음 이미지에서 유용한 부분만 제거하고 새 이미지에 넣습니다. 이 시나리오에서 pip는 이미지를 빌드하는 과정에서만 필요하지만 프로그램을 실행하는 데는 전혀 유용하지 않습니다. pip만 설치한 다음 pip를 사용하여 타사 라이브러리를 설치한 다음 이 미러에서 pip 없이 Python만 있는 미러로 타사 라이브러리를 복사하면 pip가 차지하는 268MB 공간을 절약할 수 있습니다. .
1. 우분투 이미지를 기반으로 Python을 설치합니다.
FROM ubuntu
RUN apt update \
&& apt install python3
그런 다음 다음을 실행합니다.
docker build -t python:3.8-ubuntu .
이러한 방식으로 python:3.8-ubuntu 이미지가 생성됩니다.
2. python:3.8-ubuntu를 기반으로 pip를 설치합니다.
FROM python:3.8-ubuntu
RUN apt install pip
그런 다음 다음을 실행합니다.
docker build -t python:3.8-ubuntu-pip .
이러한 방식으로 python:3.8-ubuntu-pip 이미지가 생성됩니다.
3. 다단계 빌드 대상 이미지:
FROM python:3.8-ubuntu-pip
RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy
FROM python:3.8-ubuntu
COPY --from=0 /usr/local/lib/python3.8/dist-packages/ /usr/local/lib/python3.8/dist-packages/
이 dockerfile에는 두 개의 FROM 명령이 있으므로 설명이 필요합니다.
첫 번째는 python:3.8-ubuntu-pip 이미지를 기반으로 numpy를 설치합니다.물론 실제 응용 프로그램에서는 여기에 사용되는 모든 타사 라이브러리를 작성합니다.
두 번째 FROM은 FROM python:3.8-ubuntu 이미지를 기반으로 하며 모든 타사 라이브러리가 복사됩니다. COPY 명령 뒤의 –from=0은 0단계에서 복사한다는 의미입니다. 실제 애플리케이션에서 컨텍스트에서 프로그램 코드를 복사하고 필요한 ENTRYPOINT 등을 추가합니다.
마지막으로 다시 실행합니다.
docker build -t project:1.0 .
물론 우리 프로젝트의 이미지가 준비되었습니다. 공식 Python 미러를 사용하여 빌드한 버전보다 약 750MB 작습니다.
프로덕션 환경으로 이미지 가져오기
이 시점에서 이미지가 생성되었지만 이미지 파일은 어디에 있으며 프로덕션 환경에서 어떻게 실행합니까? 방금 docker images 명령을 사용했을 때 생성된 이미지를 보았습니다.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello 1.0 01fe19111dc7 59 minutes ago 893MB
python 3.8 f5041c8ae6b1 13 days ago 884MB
ubuntu 20.04 f643c72bc252 5 weeks ago 72.9MB
hello-world latest bf756fb1ae65 12 months ago 13.3kB
docker save 명령을 사용하여 이미지를 지정된 파일에 저장할 수 있으며 저장된 파일은 .tar 형식의 압축 파일입니다.
docker save -o hello.tar hello:1.0
프로덕션 환경의 컴퓨터에 hello.tar를 복사한 다음 가져오기 명령을 실행합니다.
docker load -i hello.tar
사용할 준비가 되었습니다.