오늘은
사실 Docker를 사용하다 보면 Container로 그 순간을 찰칵~ 찍어서 생성을 해준다.
하지만 코드는 진화하기 때문에 새로운 Docker container를 생성해줘야 할 때가 있다.
컨테이너 안에는 많은 정보가 존재하고, 그 중 유지를 시켜야 하는 것들이 많다.
동일 이미지를 사용하더라도 컨테이너끼리는 file system을 공유하지 않음
그래서 데이터를 유지시킬 방법이 Docker에서는 2가지가 있다.
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은 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란 내가 원하는 volume을 docker container 내의 volume에 연결하는 기능을 말한다.
docker run -v {host_path}:{container_path} <docker_image>
docker로 편리하게 application을 띄웠는데 연결이 안되면 안되겠지? 서로 통신할 수 있는 방법을 알아보자.
docker network create test
docker run -d -p {host_port}:{container_port} --network {network} --network-alias {alias} {image_name}
매번 Docker run을 하기에는 너무 귀찮다. 편하게 Docker로 application을 띄우게 해주는 도구인 docker-compose를 보자
YAML이란 YAML Ain't Markup Language 으로, 데이터를 저장하는 파일 포맷이다. 비슷한 형식으로 XML과 JSON이 존재하지만, 사람이 읽기가 더 편하다는 장점이 있다.
version: "3.9"
services:
flask:
build:
context: .
ports:
- "5000:5000"
docker-compose up -d
```docker
docker-compose down
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 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"]
ADD . .
과 같은 command를 사용할 경우, 의도하지 않은 파일 image가 늘어날 수 있다.