도커 메모리저장, 빌드 팁들 (2)

김지용·2022년 5월 5일
0

도커 파일 메모리 저장을 위한 두가지 방법
1. named volume

  • 도커 컨테이너에 필요한 데이터를 유지시켜보기
  1. bind mount
  • 내가 원하는 폴더들을 컨테이너에서 사용할 수 있게 만듦
    몽고db 띄우는 명령어
    docker run --name mongo_db -p 27017:27017 -d mongo

--name 옵션은 컨테이너 이름주는 옵션
-p 옵션은 로컬호스트 27017 을 컨테이너의 27017호스트에 연결하는 옵션
-d 백그라운드에서 실행시키는 옵션

docker volume create memo
도커 메모리를 memo라는 이름의 네임드볼륨에 저장하기
docker volume inspect memo 커맨드를 통해서 named volume에 대한 정보를 더 알 수 있음. 예를들면 어디에 저장되어 있는지 등등

docker run -d -p 27017:27017: -v memo:/data/db mongo
-v 옵션으로 네임드 볼륨에 연결 / memo라는 네임드볼륨을 data/db 라는 폴더랑 연결하고 이미지 이름을 넣으면됨.

Docker bind mount란?
내가 원하는 volume을 docker container 내의 volume에 연결하는 기능
docker run -v {host_path}:{container_path} <docker_image>
docker run -v "$(pwd)/templates:/templates" -p 80:5000 ecec1023/docker-memo:version2

pwd = 경로

docker run -v \Users\ecec1\prac\docker\memo-app\templates -p 80:5000 -d ecec1023/docker-memo:version2

도커 네트워크 문법
docker network create test
도커 네트워크 생성

docker run -d -p 24017:24017 --network test --network-alias mongo mongo
도커 네트워크 연결해서 컨테이너 실행하기
--network-alias mongo 는 앞으로 mongodb에 연결하고 싶을 때 네트워크에서 mongo라는 이름을 쓰면 연결해주겠다는 뜻임.

docker run -it --network test nicolaka/netshoot
nicolaka/netshoot 이라는 이미지를 가져와서 테스트 해보는 명령어
dig mongo를 커맨드를 쳐보면 몽고 네트워크 연결된 경로를 파악할 수 있음.

  1. 네트워크 생성
    docker network create memo
  2. mongo db network 연결
    docker run -d -p 24017:24017 --network memo --network-alias mongo mongo
  3. app.py DB link 변경
    client = MongoClient('mongo', 27017) # localhost -> mongo로 변경
  4. 새로운 이미지 생성
    docker build -t ecec1023/docker-memo:version3 .
  5. flask app network 연결
    docker run -p 5000:5000 --network memo ecec1023/docker-memo:version3(예제 명령어)
    docker run -d -p 80:5000 --network memo ecec1023/memoapp:version3(실제 적용 명령어)

도커컨테이너의 리소스 사용량 제한
1. 할당된 메모리의 제한을 둔다(해당 메모리를 초과하면 자동으로 꺼짐)
docker run -ti python:3.8
-->> docker run -ti -m 10m python:3.8 (10g를 쓰면 10기가바이트를 할당)

  1. CPU 옵션을 0.5로 준다(기본적으로 파이썬 프로그램은 1씩 씀.) 적게 사용하게 만들려고 0.5로 테스트
    docker run -ti --cpus=0.5 python:3.8

Docker-compose(bind mount와 named volume 모두 지원)
실행명령어 : docker-compose up /
docker-compose up -d(백그라운드실행) / docker-compose down(실행취소)
세팅 내용
version: "3.9"

services:
flask:
build:
context: .
ports:
- 5000:5000
mongo:
image: mongo:latest
ports:
- 27017:27017

mongo db는 named volume을 써서 데이터 유지 / template도 이전처럼 templates폴더의 index.html에 자동연결

세팅내용
version: "3.9"
services:
flask:
build:
context: .
volumes: --->>> volumes 라는 필드가 있어서 아래처럼 연결하면 bind mount가 되고,
- ./templates:/templates
ports:
- "5000:5000"
mongo:
image: mongo:latest
volumes:
- mongo:/data/db/
ports:
- "27017:27017"

volumes: --->>> 위의 services아래가 아닌 volumes 라는 필드를 앞으로 들여쓰기해서 mongo를 적 어주면 새로운 named volume 생성
mongo:

사용하지 않는 리소스들 정리하기 순서
1. 리소스들 확인 명령
docker ps -a
docker images
docker network ls
docker volume ls

  1. 리소스들 삭제 명령(id or name)
    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 용량을 많이 사용하므로 주기적으로 삭제하면 좋음 ---

도커 이미지 꿀팁들
1. 도커 이미지의 빌드속도를 빠르게 하는 것
- docker layer cache 사용
도커명령어 하나가 실행될 때마다 레이어가 생기는 방식으로 이미지를 빌드
docker build . 명령어에서 CACHED 뜨는 부분.

Dockerfile 에서 제일 많이 바뀌는 부분을 제일 아래로 보내야함.
바뀌는 것들이 위에 있으면 아래에 있는 친구들은 layer caching이 안 됨.
  1. 도커 이미지의 사이즈를 줄이기
    .dockerignore 파일 추가하기 (도커 빌드 사이즈가 커지면 하는 걸 추천)
    /venv 등등 추가 ( ADD . . 이런식으로 모든 파일 추가하게 될 때)

  2. 작은 base image 사용해서 도커이미지 축소하기

  • 여태껏 사용한 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 실행환경에서 가장 많이 쓰이는 이미지
  • Docker image의 크기를 줄이는 것의 장점
    • docker pull을 할 때 속도가 줄어듭니다.
    • 따라서, 더 빠르게 docker container를 실행할 수 있습니다.
  1. multistage build 활용하기

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
--->>> 카피는 requirements.txt 의 pip install 하면 깔리는 위치의 라이브러리들을 가져와서 쓸 수 있게 하는 방법

ADD templates templates

ADD app.py .

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

docker run -ti test:latest /bin/bash 실행해서 requirements.txt 가 빠져서 실행되는지 체크 가능

요약
1.named volume 을 통해 db 연동
2.bind mount를 통해 개발환경에서 좀더 편하게 내가 원하는 폴더들을 컨테이너에서 사용할 수 있게 만듦
3. docker network 여러개의 컨테이너가 실행되는 환경에서 서로 통신이 필요할 때 세팅하는 법
4. 도커 컨테이너의 리소스가 과하게 사용되는 것을 제한하는 방법
5. 도커 리소스를 편하게 관리하기 위해 docker-compose.yaml을 통해서 도커 리소스를 실행
6. 사용하지 않는 도커 리소스 정리하는 법 배움
7. 도커를 빠르게 빌드하고, 작게 빌드하는 꿀팁들을 배움

source venv/bin/activate (virtual venv 활성화 명령어)

profile
김죵입니당 ^^

0개의 댓글