Docker와 친해지기(2)

Road.1·2021년 9월 6일
2

Docker

목록 보기
2/2
post-thumbnail

복습🐋

  • Docker가 원하는 프로그램을 실행하는 부분의 어려움을 해결해주었다.
  • Docker는 성능 손실이 거의 없이, 컴퓨팅 공간을 제공하며, 이미지 크기 역시 작다.
  • 이미지와, 컨테이너에 대한 개념을 알고 여러 명령어로 조작을 해보았다.

오늘은

  • Docker를 사용해서 복잡한 어플리케이션을 배포하는 방법을 알아본다.
  • docker-compose, docker image 최적화 등 Docker를 더 잘 활용하기 위한 꿀팁에 대해 알아본다.

Docker Container 데이터를 유지

사실 Docker를 사용하다 보면 Container로 그 순간을 찰칵~ 찍어서 생성을 해준다.

하지만 코드는 진화하기 때문에 새로운 Docker container를 생성해줘야 할 때가 있다.

컨테이너 안에는 많은 정보가 존재하고, 그 중 유지를 시켜야 하는 것들이 많다.

  • 예를들면, 가치있는 데이터
  • docker를 사용하지 않는 경우에 disk에 데이터를 올려두고 참조하는 식으로 사용을 함

동일 이미지를 사용하더라도 컨테이너끼리는 file system을 공유하지 않음

그래서 데이터를 유지시킬 방법이 Docker에서는 2가지가 있다.

  • named volume
  • bind mount

  • named volum은 Docker(Linux에서는 /var/lib/docker/volume/)가 관리하는 Host File System의 일부에 Data가 저장된다.

  • Docker에서 Data를 존속시킬 수 있는 Best한 방법!

  • bind mount는 Data가 Host System의 어디에든지 저장될 수 있다.

  • 저장되는 Data는 System File이거나 Directory일 수 있다.

  • Docker Host 또는 Docker Container의 Non-Docker 프로세서들이 언제든지 저장된 Data를 수정할 수 있다.

Named volume을 사용해서 DB데이터를 유지하기

named volume은 docker에서 유지되는 데이터를 관리해야 할 때 편리하게 이름으로 사용할 수 있게 만들어둔 volume 이다.

docker volume create {volume name}

docker volume inspect {volume name} 으로 named volume에 대한 정보를 더 알 수 있다. 예를들면 어디에 저장되어 있는지

docker run -itd -v /host/some/where:/container/some/where ubuntu

Docker를 run 할 당시에 -v 옵션으로 host file system과 연결하도록 선언할 수 있다.

  • 직관적으로 host의 file sysetem과 container의 파일시스템이 연결되도록한다.

  • 장점은 어디서 volume을 잡을지 아주 직관적으로 알 수 있다.

Docker Bind mount으로 docker container에 연결하기

Docker bind mount란 내가 원하는 volume을 docker container 내의 volume에 연결하는 기능을 말한다.

  • 코드가 수정될 때마다 image를 생성하고, container를 새로 띄우는 것은 너무 cost가 크다.
docker run -v {host_path}:{container_path} <docker_image>

Docker에서 여러개의 container를 연결하기

docker로 편리하게 application을 띄웠는데 연결이 안되면 안되겠지? 서로 통신할 수 있는 방법을 알아보자.

  • Docker container는 분리된 filesystem과 네트워크를 가진다.
  • 따로 설정이 없으면 filesystem과 network 통신이 불가능!
  • 이를 network를 통해서 docker container끼리 통신을 하게 만들 수 있다.

Docker network 생성

  • docker network 생성
docker network create test
  • docker network 연결해서 container 실행하기
docker run -d -p {host_port}:{container_port} --network {network} --network-alias {alias} {image_name}

Docker-compose

매번 Docker run을 하기에는 너무 귀찮다. 편하게 Docker로 application을 띄우게 해주는 도구인 docker-compose를 보자

  • Docker-compose는 여러 컨테이너를 편리하게 실행하기 위해서 만들어둔 도구이다.
  • YAML 파일을 통해 container를 실행하는데 필요한 옵션을 정의할 수 있다.

YAML이란 YAML Ain't Markup Language 으로, 데이터를 저장하는 파일 포맷이다. 비슷한 형식으로 XML과 JSON이 존재하지만, 사람이 읽기가 더 편하다는 장점이 있다.

  • ex. flask를 사용하는 경우
version: "3.9"

services:
  flask:
    build:
      context: .
    ports:
      - "5000:5000"
  • docker-compose.yaml이라는 이름으로 만들면 docker-compose command를 사용할 때 기본으로 사용된다.
  • 맨 위에 version은 docker-compose의 스키마의 버젼을 뜻한다.
  • services 밑에 container의 정의를 적어서 사용한다.
  • build를 적어두면 이미지를 빌드하여 사용한다.
  • docker-compose로 container 띄우기
docker-compose up -d
  • docker-compose로 container 삭제하기
```docker
docker-compose down
  • docker-compose에서는 bind mount, named volume을 모두 지원한다.
version: "3.9"
services:
  flask:
    build:
      context: .
    volumes:
      - ./templates:/templates
    ports:
      - "5000:5000"
  mongo:
    image: mongo:latest
    volumes:
      - mongo:/data/db/
    ports:
      - "27017:27017"

volumes:
  mongo:

Docker 이미지 Tip

Docker layer caching을 활용하여 빌드 속도 빠르게 하기

Docker image가 빌드되는 방식

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

  • 만약 자주 변경되는 부분이 dockerfile의 위쪽에 있게 된다면 layer caching을 활용하지 못한다.

  • 좋은 예

FROM python:3.8

ADD requirements.txt .

RUN pip install -r requirements.txt

ADD app.py .

ADD templates ./templates/

CMD ["python", "app.py"]
  • 나쁜 예
FROM python:3.8

ADD app.py .

ADD templates ./templates/

ADD requirements.txt .

RUN pip install -r requirements.txt

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

.dockerignore 파일 추가하기

  • docker는 image를 빌드할 때의 작업 디렉토리를 build context라고 한다.
  • ADD . .과 같은 command를 사용할 경우, 의도하지 않은 파일 image가 늘어날 수 있다.
profile
AI 엔지니어가 되고싶은 대학생 입니다.

0개의 댓글