docker 이미지와 docker 파일을 사용할 때 이 점을 고려해야 할 수도 있습니다

용기를 사용하는 장점 중 하나는 환경에 있는 이미지를 미리 설정하고 응용 프로그램 코드와 함께 사용할 준비를 하는 것이다.이 그림들은 우리가 노트북에서 용기를 실행한 다음 구름 속의 용기에서 같은 그림을 실행할 수 있도록 한다.그러나 이러한 이미지를 구축하는 것은 간단한 작업이 아니다. 우리는 흔히 만든 이미지에 쓸모없는 작업이나 비용을 추가한다.이 글은 과거 docker 이미지를 구축할 때 나에게 유용했던 최선의 실천을 공유하기 위한 것이다.
우선, 도커 이미지가 무엇인지 정의해야 합니다.docker 이미지는 운영체제 구조나 패키지, 응용 프로그램 의존 항목, 라이브러리, 응용 프로그램 코드를 포함하는 패키지 단위입니다.가상화 세계에서 온 경우 이미지를 VM 템플릿으로 간주하고 컨테이너는 이 템플릿으로 만든 인스턴스입니다.그렇지 않으면, 개발자라면 이미지를 클래스 정의로 볼 수 있고, 용기는 클래스의 실례로 볼 수 있습니다.
Docker의 이미지는 반드시 어디에 저장해야 합니다. 그렇습니까?이것들이 바로 이른바 이미지 등록표다.이 등록표들은 이미지를 저장하는 저장소와 같다.예를 들면 다음과 같습니다.
  • Docker Hub
  • AWS ECR
  • Oracle Container Registry
  • Azure Container Registry
  • Google Container Registry
  • Red Hat Quay
  • 주의: docker 이미지를 끌거나 밀려면, 이 등록표에 계정을 만들어야 합니다.그림을 로컬 컴퓨터로 끌어다 놓아야만 사용할 수 있습니다.
    주의: 로컬에서 docker 이미지를 만들 수도 있습니다. 등록표가 필요하지 않지만, 다른 컴퓨터에서 이 이미지를 사용하려면 서버 o cloud yo에서 등록표를 사용해야 합니다.
    이미지는 단일 객체로 표시되는 여러 레이어로 구성됩니다.실례 이외의 한 층은 내부 핵이다. 왜냐하면 용기는 호스트 내부 핵을 사용하기 때문이다.
    예를 들면 다음과 같습니다.
    ☁  docker [master] ⚡  docker image pull mongo:latest  
    latest: Pulling from library/mongo
    7b1a6ab2e44d: Already exists 
    90eb44ebc60b: Pull complete 
    5085b59f2efb: Pull complete 
    c7499923d022: Pull complete 
    019496b6c44a: Pull complete 
    c0df4f407f69: Pull complete 
    351daa315b6c: Pull complete 
    5b6df31e95f8: Pull complete 
    e82745116109: Pull complete 
    98e820b4cad7: Pull complete 
    Digest: sha256:cf9f5df5419319390cc3b5d9abfc2d0d0b149b3e9e3e29b579
    Status: Downloaded newer image for mongo:latest
    docker.io/library/mongo:latest
    
    여기에서, 우리는 docker 이미지에서 다른 재미있는 기능을 볼 수 있습니다. 이미지를 끌어올릴 때, docker는 변경된 층이나 로컬 시스템의 새로운 층만 다운로드합니다. 이것은 네트워크 데이터의 비용을 줄이는 데 도움이 됩니다.
  • 이 계층 > 7b1a6ab2e44d: Already exists 내 시스템
  • 에 있음
  • 이 > 90eb44ebc60b: Pull complete가 다운로드되었습니다.
  • 이미지가 매우 작을 수 있습니다. 다음 예를 살펴보겠습니다.
    ☁  docker [master] ⚡  docker pull alpine
    Using default tag: latest
    latest: Pulling from library/alpine
    59bf1c3509f3: Pull complete 
    Digest: sha256:21a3deaa0d32a8057914f36584b5288d2e0118285c70fa8c9300
    Status: Downloaded newer image for alpine:latest
    docker.io/library/alpine:latest
    
    알다시피 알프스 산의 그림에는 더 적은 도층이 있다.ls를 실행해야 합니다.
    ☁  docker [master] ⚡  docker image ls
    REPOSITORY                             TAG         IMAGE ID       CREATED        SIZE
    alpine                                 latest      c059bfaa849c   8 days ago     5.59MB
    mongo                                  latest      4253856b2570   2 weeks ago    701MB
    
    5MB 대 700MB, 표준은 40-200MB 정도의 이미지입니다.
    또 다른 고려 사항은 이미지 이름입니다. 만약 우리가 이전의 명령 이미지가 다음 위치에서 호출된 것을 관찰했다면, (이것은 공식 이미지에 사용되는 것) 버전을 지정하지 않았다면, 기본값은 최신입니다.
    다음 방법으로 이미지가 공식 이미지인지 여부를 질의할 수 있습니다.
    ☁  docker [master] ⚡  docker search ubuntu --filter "is-official=true" 
    NAME                 DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
    ubuntu               Ubuntu is a Debian-based Linux operating sys…   13244     [OK]       
    websphere-liberty    WebSphere Liberty multi-architecture images …   282       [OK]       
    ubuntu-upstart       DEPRECATED, as is Upstart (find other proces…   112       [OK]       
    ubuntu-debootstrap   DEPRECATED; use "ubuntu" instead                45        [OK]      
    
    이제 이미지 101 이후에 우리는 이미지를 사용하거나 만드는 최선의 실천으로 전환해야 한다. 우리 시작합시다.

    오 잠깐만!!


    Dockerfile에 대해 이야기하는 것을 잊을 뻔했어요...
    기본:
  • 이미지 생성 명령을 포함하는 텍스트 문서
  • 예, Dockerfile로 이름을 지정해야 하며 시작 부분은 대문자로 시작해야 합니다
  • .
    아니오, docker 파일, docker 파일, docker 파일로 명명할 수 없습니다.이것은 docker official documentation의 Dockerfile의 작은 예입니다.
    FROM ubuntu:18.04
    COPY . /app
    RUN make /app
    CMD python /app/app.py
    
    지금, 우리는 이 건의들을 계속 토론할 수 있다...

    1. 공식 Docker 이미지를 기본 이미지로 사용


    Dockerfile의 이전 예제에 따르면 기본 이미지는 From 문에서 사용한 이미지입니다.
    FROM ubuntu:18.04
    COPY . /app
    RUN make /app
    CMD python /app/app.py
    

    그렇지만
    주의해야 할 것은 기본 운영체제 이미지를 사용한 다음에 의존항을 설치하기 위해 운행문을 추가하지 말고 의존항이 설치된 공식 이미지를 사용해야 한다는 것이다.
    예:

    이것은 가능하지만 가장 좋은 방법은 아니다.
    FROM ubuntu:18.04
    
    RUN apt-get update && apt-get install -y gnupg
    
    RUN wget -qO - https://www.mongodb.org/static/pgp/server-5.0.asc | sudo apt-key add -
    
    COPY ./mongodb-org-5.0.list /etc/apt/sources.list.d/mongodb-org-5.0.list
    
    RUN apt-get install -y mongodb-org
    
    

    이게 더 좋은 방법이에요.
    FROM mongo:4.4.11-rc0
    
    그것은 당신의 서류를 간소화하고 당신의 생활을 더욱 가볍게 할 것이다.

    2. 처음에 코드를 추가하는 것을 피한다


    앞서 언급한 바와 같이,docker 이미지는 층으로 나뉘어져 있으며, 일부 이미지는 로컬 시스템에 캐시할 수 있습니다. 캐시를 원한다면, 이미지를 추출할 때 용기를 만드는 데 걸리는 시간이 더 적습니다.
    Dockerfile 사용 시
    FROM ubuntu
    COPY . /app
    
    CMD ["java", "-jar", "/app/target/app.jar"]
    
    코드를 변경할 때 두 번째 줄 COPY . /app 에 대응하고 나머지 층은 끌어들이고 FROM ubuntu 만 캐시됩니다.
    코드의 사본을 끝에 두다.
    또한, 보상으로jar 파일을 용기에 복사하기만 하면 모든 파일이 필요하지 않습니다.예를 들어, 너는 자술한 서류를 필요로 하지 않는다
    FROM ubuntu
    RUN apt-get update && apt-get install -y --no-install-recommends \
    openjdk-8-jdk ssh vim
    COPY target/app.jar /app
    CMD ["java", "-jar", "/app/target/app.jar"]
    
    만약 우리가 첫 번째 제안을 기억한다면, 누군가가 오픈 jdk를 설치한 이미지에서 작업을 한 적이 있다
    FROM openjdk
    COPY target/app.jar /app
    CMD ["java", "-jar", "/app/target/app.jar"]
    
    이것은 공식 성명이다.
    ☁  docker [master] ⚡  docker search openjdk --filter "is-official=true"
    NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
    openjdk   OpenJDK is an open-source implementation of …   3046      [OK]
    

    3. 기본 이미지에 특정 버전 추가


    만약 당신이 기억하고 있다면, 처음에 우리는 당신이 어떤 버전도 지정하지 않으면 최신 버전을 사용할 것을 보았을 것이다.
    맞습니까?
    그래, 너는 최신식을 쓰고 싶지 않아...

  • 최신 예측 불가능

  • 최신 2개의 잡아당기기 간 전환 가능

  • 최신 버전은 당신의 비밀번호를 해독할 수 있습니다

  • 최신은 사랑이 아니야!!
  • 특정 이미지 버전 사용
    FROM mongo:4.4.11-rc0
    

    FROM openjdk:slim
    COPY target/app.jar /app
    CMD ["java", "-jar", "/app/target/app.jar"]
    
    docker hub의 탭에서 이미지 버전을 볼 수 있습니다

    이 입력 프롬프트와는 무관합니다.
    또한 모든 이미지를 재구매할 수 있습니다.
    ☁  docker [master] ⚡  docker pull --all-tags alpine
         #output too long to be shown
    
    ☁  docker [master] ⚡  docker image ls | grep alpine
    alpine                                 3           c059bfaa849c   9 days ago      5.59MB
    alpine                                 latest      c059bfaa849c   9 days ago      5.59MB
    ansible-base-lab_managed-host-alpine   latest      77f2f125fa50   6 weeks ago     80.8MB
    alpine                                 20210804    4e873038b87b   4 months ago    5.59MB
    alpine                                 20210730    8fd5af68fdb2   4 months ago    5.59MB
    alpine                                 3.10        e7b300aee9f9   7 months ago    5.58MB
    alpine                                 20210212    b0da5d0678e7   8 months ago    5.62MB
    alpine                                 20201218    430cc6504dbd   11 months ago   5.61MB
    alpine                                 20200917    003bcf045729   14 months ago   5.62MB
    alpine                                 20200626    3c791e92a856   17 months ago   5.57MB
    alpine                                 20200428    5737d7d248e9   19 months ago   5.6MB
    

    4. 서로 다른 용기에서 응용 프로그램 분리


    이것은 간단한 문제가 될 것이며, 용기 하나에는 단지 하나의 문제만 있을 것이다.하나의 웹 응용 프로그램은 하나의 용기만 모든 작업을 완성하는 것이 아니라 세 개의 용기 (웹 응용 프로그램 코드, 데이터베이스, 캐시) 로 구성될 수 있다.
    이것은 원자 변경을 확장하고 진행하는 데 도움이 된다.

    5. 간결한 공식 사진을 사용해도 최저 맛을 가리킨다


    ubuntu와 같은 공식 운영체제 이미지는 우리가 필요로 하지 않는 패키지나 서비스를 포함할 수 있습니다.
    용기의 개념은 프로그램이 예상대로 실행되는 데 필요한 소프트웨어를 제공하는 것이다. 용기에 들어갈 필요가 없을 수도 있다. 이것이 바로 일부 이미지가 케이스를 설치하지 않은 이유이다.
    더 작은 맛도 안전성을 높일 수 있다. 공격이 필요한 서비스가 적고 업데이트가 필요한 서비스도 적기 때문이다.
    작은 맛은 옮기고 저장하기 쉽다.
    오픈 jdk slim과 jdk의 비교 예시를 보도록 하겠습니다.
    ☁  docker [master] ⚡  docker image ls | grep openjdk
    openjdk                                slim                8b0ead3b8172   33 hours ago    407MB
    openjdk                                18-jdk-alpine3.15   c89120dcca4c   3 days ago      329MB
    
    추가 선택:
    ☁  docker [master] ⚡  docker image ls | grep python
    python                                 latest              47ebea899258   20 hours ago    917MB
    python                                 3.7.12-alpine3.15   a1034fd13493   3 days ago      41.8MB
    ☁  docker [master] ⚡ 
    

    코멘트


    이것은 광범위한 가장 좋은 실천 목록이 아니다. 이것은 당신이 사용할 수 있는 가장 간단한 절차를 대표한다. 다음 항목에서 나는 다단계 구축과 우리가 만들 수 있는 모든 아름다운 것들을 더 높은 주제로 쓸 것이다.

    좋은 웹페이지 즐겨찾기