취미가 좋다

[2-6] docker 꿀팁 본문

Sparta Coding Club/Docker

[2-6] docker 꿀팁

benlee73 2021. 7. 31. 11:16

사용하지 않는 docker 리소스 정리

사용하지 않는 컨테이너, 이미지, 네트워크, 볼륨을 삭제하면 메모리나 디스크 낭비를 줄일 수 있다.

 

아래의 명령어로 차례대로 컨테이너, 이미지, 네트워크, 볼륨을 확인한다.

docker ps -a
docker images
docker network ls
docker volume ls

 

아래의 명령어로 불필요한 리소스를 삭제한다.

docker rm container_id
docker rmi image_id
docker network rm network_id
docker volume rm volume id
docker system prune

docker system prune 명령어는 아래의 여러 가지 것들을 삭제한다.

-a에 옵션을 붙이면 더 많은 것들을 삭제한다.

 

container와 image의 경우에는 disk 용량을 많이 사용하므로 주기적으로 삭제하면 좋다.

 

Docker layer caching

Docker layer caching을 활용하여 빌드 속도를 빠르게 할 수 있다.

 

도커 이미지는 dockerfile의 명령어가 하나씩 실행될 때마다 layer가 새로 생기는 방식으로 이미지를 빌드한다.

그래서 도커 빌드를 하게 되면 layer가 쌓이는 과정을 콘솔 창에서 확인할 수 있다.

 

기존에 존재하던 이미지와 같은 과정인 명령어를 실행할 때는 같은 layer를 활용하여 명령어 실행을 생략할 수 있다.

따라서 자주 변경되는 명령어를 dockerfile 아래에 작성하면, 기존 이미지의 layer caching을 최대한 활용하여 빌드 속도를 높일 수 있다.

 

아래는 dockerfile 작성의 나쁜 예이다.

FROM python:3.8

ADD app.py .

ADD templates ./templates/

ADD requirements.txt .

RUN pip install -r requirements.txt

CMD ["python", "app.py"]

app.py 와 templates에 있는 코드들은 자주 바뀌는 파일들이다.

따라서 코드가 바뀔 때마다, 기존 layer를 활용하지 못하고 아래의 명령어까지 계속해서 다시 실행해야한다.

 

즉, 자주 바뀌게 되는 코드를 추가하는 부분을 dockerfile 아래에 작성하는 것이 효율적이다.

 

dockerignore

gitignore와 동일한 역할을 수행한다.

이미지를 빌드할 때, 사용하지 않을 파일들을 등록할 수 있다.

 

.dockerignore 라는 텍스트 파일을 생성하고, 등록할 폴더나 파일명을 입력하면 된다.

 

Docker image 축소

도커 이미지의 사이즈를 줄이면 registry에 올리고 다운 받는 속도가 향상된다.

또한 컨테이너도 더 빠르게 실행할 수 있다.

 

1. 작은 크기의 base image 사용

python:3.8 기준, 다양한 종류의 tag가 존재하기 때문에, 자신에게 맞는 이미지를 사용하면 된다.

 

alpine

  • 작고, 보안에 집중한 alpine-linux를 기반으로 만들어진 image
  • 보통 모든 이미지들중에서 가장 작음 (python:3.8-alpine기준 16.05MB)
  • python기준으로 봤을 때, pip install을 할 때 불리한 점이 있음

buster, jessie, stretch

  • debian에서 만든 linux를 기반으로 만들어진 image
  • buster, jessie, stretch는 os의 codename이다.
  • python:3.8과 python:3.8-buster는 동일하다. (python:3.8기준 332.17MB)

slim

  • 실행에 필요한 환경만 만들어둔 image
  • 이미지가 기본이미지에 비해서는 작음 (python:3.8 기준 41.11MB)
  • 보통 python 실행환경에서 가장 많이 쓰이는 이미지

 

2. multistage build

Dockerfile 안에 여러 FROM 문을 두고, 각 명령어를 실행하면서 생성되는 것들에서 필요한 것만 가져와서 이미지를 생성하는 방식이다.

FROM python:3.8-slim AS builder

ADD requirements.txt requirements.txt

RUN pip install -r requirements.txt

FROM python:3.8-slim-buster
COPY --from=builder/usr/local/lib/python3.8/site-packages /usr/local/lib/python3.8/site-packages

ADD templates templates

ADD app.py .

CMD ["python", "app.py"]

위쪽 FROM에서 이미지를 가져와서 requirements.txt로 필요한 패키지를 설치한다.

 

아래의 두 번째 이미지를 가져오고, 이전 이미지에서 설치한 패키지만 가져온다.

생성된 컨테이너에는 requirements.txt 도 포함되지 않게 된다.

즉, 필요한 것만 가져와서 이미지 크기를 줄일 수 있다.

'Sparta Coding Club > Docker' 카테고리의 다른 글

[3-2] 도커가 편한 이유  (0) 2021.08.05
[3-1] AWS로 서비스 배포하기  (0) 2021.08.04
[2-5] Docker-compose  (0) 2021.07.31
[2-4] 컨테이너의 리소스 사용량 제한  (0) 2021.07.31
[2-3] 여러 컨테이너 연결  (0) 2021.07.30
Comments