Docker

Docker란? + build process

foxlee 2021. 2. 19. 20:13

도커 

  • 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징 => 배포, 관리 단순화
  • 컨테이너를 구축, 배포, 복사하고 다른 환경에서 유연하게 사용가능
  • 컨테이너를 위한 플랫폼 셋
  • Docker is a set of platform as a service products that use OS-level virtualization to deliver software in packages called containers

도커 이미지

  • 프로그램, 소스코드, 라이브러리 등 파일을 묶어주고, 컨테이너 안에서 특정 프로세스를 실행하기 위해 필요한 모든 파일, 설정값을 가지고 있음
  • 하나의 이미지로 여러 컨테이너 생성 가능
  • 깃헙와 유사한 도커헙을 통해 버전 관리 및 배포 가능

레이어 기반

  • 이미지는 여러개의 읽기 전용 레이어로 구성되어 있고 파일이 추가/수정되면 새로운 레이어 생성됨
  • 예) 우분투 이미지가 레이어a,b,c로 구성되어 있다면, nginx는 레이어a,b,c+nginx가 됨
  • 예) 웹앱 이미지가 nginx 기반이라면 웹앱 소스가 변경된 경우 레이어abc,nginx는 그대로이기 때문에 변경된 소스의 레이어만 다운받으면 되므로 효율적으로 이미지 관리 및 공간 관리가 됨

컨테이너 

  • 이미지를 실행한 상태

도커파일 빌드하기

FROM alpine

RUN apk add --update redis

CMD ["redis-server"]

1. docker build .

Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM alpine   ### dockerhub 에서 image pull
latest: Pulling from library/alpine
ba3557a56b15: Pull complete
Digest: sha256:a75afd8b57e7f34e4dad8d65e2c7ba2e1975c795ce1ee22fa34f8cf46f96a3be
Status: Downloaded newer image for alpine:latest
 ---> 28f6e2705743 ### temp image
Step 2/3 : RUN apk add --update redis
 ---> Running in e0f434a36974 ### temp image id 28f6e2705743 에서 temp container에 redis 설치
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz
(1/1) Installing redis (6.0.10-r0)
Executing redis-6.0.10-r0.pre-install
Executing redis-6.0.10-r0.post-install
Executing busybox-1.32.1-r3.trigger
OK: 8 MiB in 15 packages
Removing intermediate container e0f434a36974 ### temp container id e0f434a36974 삭제
 ---> ba9bb61d7d7b  ### temp image
Step 3/3 : CMD ["redis-server"]
 ---> Running in 8916ee365413 ### temp container id 8916ee365413 생성
Removing intermediate container 8916ee365413 ### temp container id 8916ee365413 삭제
 ---> f719e09ac4fe ### image 생성
Successfully built f719e09ac4fe

2. 두번째 빌드 - 캐시 사용 - 생성된 이미지 id 동일함

Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM alpine
 ---> 28f6e2705743
Step 2/3 : RUN apk add --update redis
 ---> Using cache
 ---> ba9bb61d7d7b
Step 3/3 : CMD ["redis-server"]
 ---> Using cache
 ---> f719e09ac4fe
Successfully built f719e09ac4fe

3. Dockerfile 수정

FROM alpine

RUN apk add --update redis
RUN apk add --update gcc ### 추가된 부분

CMD ["redis-server"]

4. 추가(변경)된 부분부터 설치 또는 실행(Cache x) 변경되고 새로운 이미지 생성됨(Image ID 변경) 

$ docker build .

Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM alpine
 ---> 28f6e2705743
Step 2/4 : RUN apk add --update redis
 ---> Using cache
 ---> ba9bb61d7d7b
Step 3/4 : RUN apk add --update gcc
 ---> Running in a7ea50ee4a0d
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz
(1/11) Installing libgcc (10.2.1_pre1-r3)
(2/11) Installing libstdc++ (10.2.1_pre1-r3)
(3/11) Installing binutils (2.35.1-r1)
(4/11) Installing libgomp (10.2.1_pre1-r3)
(5/11) Installing libatomic (10.2.1_pre1-r3)
(6/11) Installing libgphobos (10.2.1_pre1-r3)
(7/11) Installing gmp (6.2.1-r0)
(8/11) Installing isl22 (0.22-r0)
(9/11) Installing mpfr4 (4.1.0-r0)
(10/11) Installing mpc1 (1.2.0-r0)
(11/11) Installing gcc (10.2.1_pre1-r3)
Executing busybox-1.32.1-r3.trigger
OK: 118 MiB in 26 packages
Removing intermediate container a7ea50ee4a0d
 ---> 5170956d5689
Step 4/4 : CMD ["redis-server"]
 ---> Running in b595b6faece4
Removing intermediate container b595b6faece4
 ---> d15f90c4757a
Successfully built d15f90c4757a