ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Docker image build & Dockerfile
    도커 | 쿠버네티스 2022. 10. 29. 16:36

    1. 도커 이미지(Docker image)

    2. 베이스 이미지

    3. Docker 명령어

    4. Dockerfile: FROM / RUN

    5. 도커 이미지의 레이어

    1. 도커 이미지(Docker image)

    출처 : https://www.netapp.com/blog/containers-vs-vms/

      chroot : 

                파일을 격리하여 독립된 공간을 생성

    # example directory tree
    root
    ├── sub1
    │   ├── file1
    │   └── file2
    ├── sub2
    │   └── file1
    └── sub3
    
    -->
    
    root
    ├── sub1
    │   ├── file1
    │   └── file2
    ├── root
    │   └── file1
    └── sub3

      namespace :

                pid, mnt, net, ipc, uts, user, cgroup, time 등의 설정을 통해 독립된 공간을 생성

      cgroup :

                자원을 제한, 할당

      Union Mount :

                 레이어를 통한 이미지 구축

    2. 베이스 이미지

       Image registry

           Image repository에서 개인에게 할당된 container image 저장공간   

       Image repository

           기업에서 운영되는 container image 저장공간

              1. Docker hub

    docker hub : 출처 : https://hub.docker.com/search?q=

            2. AWS Marketplace

    AWS Marketplace 출처 : https://aws.amazon.com/marketplace/search/results?ref_=header_nav_dm_container

    base image 사용

     

     

    centos - Official Image | Docker Hub

    DEPRECATION NOTICE This image is no longer supported/maintained (non-EOL tags last updated November 16, 2020, docker-library/official-images#9102; see also https://www.centos.org/centos-linux-eol/ and docker-library/docs#2205). Please adjust your usage acc

    hub.docker.com

    https://hub.docker.com/_/centos

    출처 : https://hub.docker.com/_/centos
    출처 : https://hub.docker.com/_/centos

    # command line
    docker run --name centos centos:7
    # Dockerfile
    FROM centos:7    # 베이스 이미지로 centos:7 사용

    3. Docker 명령어

        이미지를 통해 컨테이너 생성

    docker run --name <container name> <option> <image name:tag>
    
    example :
    	docker run --name web -it centos:7

        컨테이너로 새로운 이미지 생성

    docker commit --change='CMD ["/usr/sbin/httpd", "-DFOREGROUND"]' <container name> <image name>

        로컬의 파일을 컨테이너로 복사

    docker cp <file name> <container name>:<file path in container>
    
    example :
    	docker cp index.html web:/usr/share/nginx/html/index.html

        # 반대로 컨테이너의 파일을 로컬로 복사하는 것도 가능

     

        컨테이너의 read write 레이어의 변경사항에 대해 확인

    docker diff {컨테이너명}
    
    	C : 변경 A : 추가
        
    commend's result example :
    	C /var
     	C /var/cache
    	C /var/cache/nginx
    	A /var/cache/nginx/fastcgi_temp

     

    4. Dockerfile: FROM / ADD/COPY/RUN

    # example
    FROM ubuntu:latest
    ADD sub_app.tar /
    COPY main_app /main_app
    RUN apt-get update \
            && apt-get install -y java-11-amazon-corretto.x86_64 \
            && chmod +x main_app \
            && apt-get clean
    CMD ["/main_app"]
    EXPOSE 80

        FROM : base image를 설정

        ADD : 로컬에 있는 파일을 컨테이너에 추가, 만약 tar 등 압축파일을 추가할 경우 압축해제

        COPY : 로컬에 있는 파일을 컨테이너에 복사

        RUN : 컨테이너가 만들어질 때 주어진 명령어 자동으로 실행

        CMD : 컨테이너가 실행될 때 사용할 명령어

        EXPOSE : 열어줄 포트를 입력, 포트를 열어주는 것은 아님

     

    5. 도커 이미지의 레이어

    Dockerfile에 적혀있는 명령의 개수에 따라 레이어 수가 결정된다.

    만약 여러 명령을 하나로 연결하여 실행할 경우 레이어 수를 줄일 수 있다.

    레이어가 많고 작음을 상황에 따라 적절하게 사용할 필요가 있다.

    많은 Dockerfile이 사용되고 서로 공유할 수 있는 레이어가 많을 경우 레이어를 분리하여 사용하는 것이 좋을 것 같다.

    #example
    
    # version 1
    FROM ubuntu:latest
    COPY main_app /main_app
    RUN apt-get update
    RUN apt-get install -y java-11-amazon-corretto.x86_64
    RUN chmod +x main_app
    RUN apt-get clean
    CMD ["/main_app"]
    EXPOSE 80
    
    # version 1의 레이어
    | FROM |
    | COPY |
    | RUN  |
    | RUN  |
    | RUN  |
    | RUN  |
    | CMD  | 
    
    # version 2
    FROM ubuntu:latest
    COPY main_app /main_app
    RUN apt-get update \
            && apt-get install -y java-11-amazon-corretto.x86_64 \
            && chmod +x main_app \
            && apt-get clean
    CMD ["/main_app"]
    EXPOSE 80
    
    # version 2의 레이어
    | FROM |
    | COPY |
    | RUN  |
    | CMD  |

     

    댓글

Designed by Tistory.