도커 | 쿠버네티스

Docker image build & Dockerfile

BTC_기범 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  |