우아한 Dockerfile를 작성하는 방법

검토

컨테이너의 시작, 그들은 Dockerfile 시작에서 필요한 컨테이너는 Kubernetes,이 기사는 우아한 Dockerfile 파일을 작성하는 방법을 설명합니다.

이 문서에서는 주로 포함 :

  • Docker 용기
  • Dockerfile
  • 다단계 빌드의 사용

덕분에 우리는 우리가 연습을 할 수 있도록,이 주제에 대한 프로젝트 및 직원의 일부의 지원 덕분에 연습을 지속적으로 시스템 자원과 많은 시간을 제공합니다.

A, 부두 노동자 용기

1.1 용기 특징

우리 모두는 컨테이너는 다음과 같은 특징을 가지고 있습니다 표준 소프트웨어 단위 것을 알고 :

  • 어디서나 실행 컨테이너는 코딩 할 수 및 종속성을 패키지에 관련된 설정 파일은 어떤 환경에서 작업이 동일 보장.
  • 자원 활용 : 프로세스 컨테이너는 더 미세하게 CPU 및 메모리 사용, 서버의 컴퓨팅 리소스의 따라서 활용도를 설정하는 것이 가능하며, 분리 단계를 제공합니다.
  • 빠른 확장 : 각 컨테이너가 별도의 프로세스로 실행 할 수 있으며, 컨테이너가 시작 속도를 높이고 효율성을 중지 할 수 있도록 시스템 리소스를 기본 운영 체제를 공유 할 수 있습니다.

1.2 Docker 용기

현재 시장의 주류 용기 엔진 도커, 로켓 / RKT, 오픈 VZ / 오딘, 등등, 그리고 파티 선박 엔진은 가장 많이 사용되는 엔진 고정 표시기 컨테이너입니다 지배합니다.

도커 컨테이너는 일련의 프로세스와 시스템의 나머지 부분에서 격리되어, 다른 거울에 의해 제공되는 이러한 프로세스를 실행하는 데 필요한 모든 파일은 개발의 전체 프로세스는 생산, 리눅스 용기 이동성과 일관성을 테스트 섹스. 채널의 개발에 대한 반복 선박의 속도를 실행하는 기존의 테스트 환경에 따라 훨씬 빠르게, 그리고 클라우드 플랫폼 (PaaS를)에 배포 주류의 다양한 로컬 시스템을 지원합니다. 도커 컨테이너는 당황은 "온라인 붕괴의 다양한 실행할 수있는 일반 개발 환경"을 해결합니다.

도커 컨테이너 기능 :

  • 경량 : 도커 용기가 더 이상이 레이어 작업 GuestOS를 필요로하기 때문에 가상 머신에 도커 컨테이너 상대, 그것은 더 많은 자원 오버 헤드를 저장할 수 있도록 가상 머신, 운영 체제 수준의 자원으로부터 격리되는 동안 컨테이너, 자원 분리 공정 수준 시스템.
  • 빠른 : 시작하고 심지어 밀리 초 시작이 달성 될 수있다, 시작 GuestOS없이 컨테이너를 만듭니다.
  • 이식성 : 도커 컨테이너 응용 프로그램 및 기술은 컨테이너에 종속 라이브러리 및 이미지 변환 패킷의 런타임 환경은 다른 플랫폼에서 실행할 수 있습니다.
  • 자동화 : (예 :는 Kubernetes) 컨테이너 컨테이너 생태 안무 작업은 컨테이너의 자동화 된 관리를 달성하는 데 도움이 있습니다.

二, Dockerfile

Dockerfile 구성 콘텐츠 명령을 호출 할 수있는 모든 사용자의 조합을 포함하는 텍스트의 문서 파일을 기술하기 위해 사용되며, 또한, 사용자는 연속 도커 명령 실행 빌드 자동 회선을 사용하여 복수의 라인을 구축하는 수단을 이용할 수있다.

자기 미러 Dockerfile 작성하여 운영 및 유지 보수를보다 쉽게 ​​우리의 거울을 관리 할 수 ​​있지만, 환경이 균일하지 필요가 걱정 더 이상, 개발, 테스트 팀의 효율성을 향상시킬 수 있도록, 실질적으로 균일 한 환경을 제공하기 위해, 테스트 팀을 개발할 수 있습니다.

Dockerfile 구문은 일반적으로 단지 11를 매우 간단한 사용된다 :

2.1 쓰기 정상적으로 Dockerfile

우아한 Dockerfile 주요 참고 다음 쓰기 :

  • Dockerfile 파일은 이미지 중 최종 생산보다 더 수준이 너무 오래 걸리지 않을 것이다.
  • 임시 파일을 설치, 같은 로그와 같은 원하지 않는 컨텐츠를 구축 이미지를 포함하지 마십시오.
  • 런타임 기본 이미지를 사용해보십시오, 프로세스는 건물의 Dockerfile 런타임에 배치 할 필요가 없습니다.

그냥 위의 3 점 좋은 Dockerfile을 쓸 수 있습니다 기억하십시오.

이해를 용이하게하기 위해, 우리는 두 Dockerfile 사례와 단순 비교를 실시 :

FROM ubuntu:16.04
RUN apt-get update
RUN apt-get install -y apt-utils libjpeg-dev \     
python-pip
RUN pip install --upgrade pip
RUN easy_install -U setuptools
RUN apt-get clean
FROM ubuntu:16.04
RUN apt-get update && apt-get install -y apt-utils \
  libjpeg-dev python-pip \
           && pip install --upgrade pip \
      && easy_install -U setuptools \
    && apt-get clean

우리는 첫 눈에 명확하고 합리적인 구조에서, 그것은 꽤 좋은 것 같다, 처음 Dockerfile 봐. 읽기 쉬운, 두 번째 Dockerfile, 소형 봐, 당신이 쓴 이유는 무엇입니까?

  • 첫 번째 장점은 Dockerfile : 프로세스 층 실수를 실행하는 경우, 이미 실행이 완료 층이 다시 실행되지 않으므로 그 후, 다시 구축 정정. 이것은 크게 빌드 다음 시간을 줄일 수 있지만 문제는 거울에 의해 점유 다단계 공간이 될 예정이다 커지게된다.
  • 두 번째 Dockerfile 모든 구성 요소는 1 층에있는 모든 어느 정도 너무 적은 공간 거울을하기로 결심하지만, 기본 이미지의 생산에 경우 컴파일러 오류가 수정 빌드 동등하게 시작하려면 다음 그룹 중 하나를 다시하고 있습니다 하나 개의 레이어에서 컴파일 된 구성 요소의 전면에서 더 많은 시간이 소요되는, 모든 것을 다시 컴파일해야합니다.

그것은 다음 표에서 두 Dockerfile 컴파일 된 이미지 크기에서 볼 수있다 :

$ docker images | grep ubuntu      
REPOSITORY      TAG     IMAGE ID    CREATED     SIZE                                                                                                                                   
ubuntu                   16.04       9361ce633ff1  1 days ago 422MB
ubuntu                   16.04-1   3f5b979df1a9  1 days ago  412MB

어 ... 마치 특별한 효과가 있지만, Dockerfile은 매우 긴, 당신은 단지 127 Dockerfile 가장 높은 수준이 있기 때문에, 수준을 감소 고려할 수있는 경우.

다단계 빌드 셋째, 사용

고정 표시기 고정 표시기는 이미지의 소형화를 위해, 17.05 이후 여러 수준의 건물을 지원하기 위해 업그레이드 할 수있을 것입니다, 우리는 포장 거울을 구축하기 위해 여러 단계의 방법을 사용합니다. 다단계 빌드 건설 미러링 나타납니다 전에 우리는 보통 Dockerfile 이상 Dockerfile를 사용합니다.

단일 파일의 3.1 건설

다단계가 구축되기 전에 구축 한 파일을 사용하여, 하나의 파일은 모든 빌드 프로세스 모두에 Dockerfile 아래에 포함 된 (프로젝트 종속성, 컴파일, 테스트, 패키지 공정 포함)이다 :

FROM golang:1.11.4-alpine3.8 AS build-env
ENV GO111MODULE=off
ENV GO15VENDOREXPERIMENT=1
ENV BUILDPATH=github.com/lattecake/hello
RUN mkdir -p /go/src/${BUILDPATH}
COPY ./ /go/src/${BUILDPATH}
RUN cd /go/src/${BUILDPATH} && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go install –v

CMD [/go/bin/hello]

이 방법은 몇 가지 문제가 나타납니다 :

  • 파일이 특히 긴 것 Dockerfile 더 많은 일들이 시간을 필요로하는, 유지 보수가 기하 급수적으로 감소 할 것이다;
  • 과도한 수준의 미러링은 미러 볼륨 점진적 배치가 더 느리게 될 것이다 증가;
  • 코드 누출의 위험이 있습니다.

Golang 예에, 그냥 다음 실제 런타임이 컴파일 환경은 작업의 역할이 아닌, 빌드 환경을 가지고, 어떤 런타임 환경에 의존하지 않는, 컴파일이 완료, 소스 코드 컴파일러의 어떤 명령 사용이 없다고 필요 미러 이미지를 유지 없습니다.

당신이 볼 수있는 테이블에서 최종 빌드 단일 파일 공간의 3백12메가바이트을 차지합니다.

이상 3.2 빌드 파일

더 좋은 해결책이없는 밖으로 다단계 전에 구축? 이, 예를 들어, 다중 파일 빌드 또는 빌드 서버에 컴파일러를 설치하지만, 빌드 서버 컴파일러의 설치가 매우 비 대한되기 위해 빌드 서버로 이어질 것이기 때문에이 방법은, 우리가 권장하지 않은 빌드 서버에 컴파일러를 설치하는 것입니다, 어댑터는 각 언어, 의존, 오류가 발생하기 쉬운, 높은 유지 보수 비용의 여러 버전이 필요합니다. 그래서 우리는 여러 파일을 작성하는 방법을 설명합니다.

멀티 파일의 건설, 여러 Dockerfile의 사실, 사용을 결합하여 다음 스크립트를 실행합니다. 가정 세 가지 문서가되어 있습니다 Dockerfile.run, Dockerfile.build, build.sh.

  • 일부 Dockerfile 구성 요소 Dockerfile.run는 가장 효율적인 라이브러리를 포함, 프로그램이 필요한 실행해야합니다;
  • 단지 쓸모없는 완전한 구축, 구축하는 데 사용 Dockerfile.build;
  • build.sh 기능은 Dockerfile.run하고 Dockerfile.build가 Dockerfile.build 구성 될 좋은 일들을 구축하고 디스패처 역할로 간주 Dockerfile.run을 수행합니다.

Dockerfile.build

FROM golang:1.11.4-alpine3.8 AS build-env
ENV GO111MODULE=off
ENV GO15VENDOREXPERIMENT=1
ENV BUILDPATH=github.com/lattecake/hello
RUN mkdir -p /go/src/${BUILDPATH}
COPY ./ /go/src/${BUILDPATH}
RUN cd /go/src/${BUILDPATH} && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go install –v

Dockerfile.run

FROM alpine:latest
RUN apk –no-cache add ca-certificates
WORKDIR /root
ADD hello .
CMD ["./hello"]

Build.sh

#!/bin/sh
docker build -t –rm hello:build . -f Dockerfile.build
docker create –name extract hello:build
docker cp extract:/go/bin/hello ./hello
docker rm -f extract
docker build –no-cache -t –rm hello:run . -f Dockerfile.run
rm -rf ./hello

실행 build.sh의 건설 프로젝트를 완료합니다.

당신은 테이블에서 볼 수있는 멀티 파일이 크게 거울의 풋 프린트를 감소 구축 할 수 있지만, 세 가지 문서는 유지 보수 비용도 높은, 관리 할 필요가있다.

이상 3.3 빌드 순서

마지막으로, 우리는 대망의 멀티 레벨 건물 봐.

우리는 Dockerfile에 FORM 문을 여러 번 사용하는 데 필요한 여러 단계의 구축을 완료, 명령의 각 다른 기본 이미지를 사용할 수 있으며, 새로운 시작을 만들 것이다 명령의 각, 우리는 다른 건물의 단계의 결과를 복사 할 수 있습니다 쉽게 위에서 언급 한 문제를 해결하고 만 Dockerfile 파일을 작성해야 할 수 있습니다, 마지막 빌드가 발생합니다 왼쪽 최종 이미지의 무대. 위의 17.05와의 버전 도커을 확보 할 필요가 : 그것은 주목할 가치가있다. 우리 다음, 특정 동작을.

는 "건설-ENV"의 별칭을 무대 위치를 Dockerfile에서 사용할 수 있습니다 :

FROM golang:1.11.2-alpine3.8 AS build-env

그리고 무대 미러에서 파일을 복사하는 것은, 거울은 어떤의에 파일을 복사 할 수 있습니다 :

COPY –from=build-env /go/bin/hello /usr/bin/hello 

간단한 예를 살펴 보겠습니다 :

FROM golang:1.11.4-alpine3.8 AS build-env
 
ENV GO111MODULE=off
ENV GO15VENDOREXPERIMENT=1
ENV GITPATH=github.com/lattecake/hello
RUN mkdir -p /go/src/${GITPATH}
COPY ./ /go/src/${GITPATH}
RUN cd /go/src/${GITPATH} && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go install -v
 
FROM alpine:latest
ENV apk –no-cache add ca-certificates
COPY --from=build-env /go/bin/hello /root/hello
WORKDIR /root
CMD ["/root/hello"]

도커 실행 고정 표시기 이미지 후 -t -rm hello3 실행을 구축하고, 우리는 미러의 크기를 보면 다음 :

다단계 건물이 우리에게 편의를 많이 가져왔다, 가장 큰 장점은, 또한 유지 보수 부담 Dockerfile을 줄일 수있을만큼 작은 런타임 이미지의 경우 다음 사항을 확인 그래서 우리는 강하게 도커 이미지로 포장하는 다단계의 사용이 코드를 구축 추천하는 것입니다.

저자 : 콩

내용 출처 : 기술의 CreditEase 연구소

추천

출처yq.aliyun.com/articles/709431