일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- SQL
- ELT
- airflow
- 데이터레이크
- spark
- Kafka
- snowflake
- dag
- redshift
- AWS
- docker-compose
- 데이터파이프라인
- 웹 크롤링
- ETL
- yarn
- docker
- 알고리즘
- 컨테이너 삭제
- airflow.cfg
- Django Rest Framework(DRF)
- docker hub
- dag 작성
- Hive
- truncate
- 웹 스크래핑
- 데이터마트
- selenium
- Django
- Serializer
- 데이터 웨어하우스
Archives
- Today
- Total
개발 기록장
03. Docker Volume과 다수 컨테이너 SW 다루기 본문
반응형
학습 주제: Docker Volume, 컨테이너와 이미지 삭제(클린업), 다수의 컨테이너로 구성된 소프트웨어 실행, Docker-Compose
Docker Volume
Docker Volume의 필요성
- Docker Container가 실행되었다가 중단되었을때의 데이터 처리
- 특정 소프트웨어가 Docker Container를 통해 일회성으로 동작하는 것이 아닌 계속해서 동작해야 한다면 데이터가 영구적으로 보관 되어야 함
- ex) 데이터베이스가 Docker Container안에서 동작하는데 잠시 컨테이너를 중단해도 데이터가 날아가면 안됨
- 이런 Data Persistence 보장하는 기능이 Docker Volumes
- Docker Container내의 가상 파일 시스템과 호스트 시스템의 파일 시스템을 매핑
- ex) 호스트 파일 시스템의 /home/jiwon/logs를 Docker Container의 /var/lib/airflow/logs로 맵핑
- 이 경우 Docker Container가 중단되더라도 모든 Airflow logs는 기록이 남게 됨
Docker Volume의 예시) Container와 Host 시스템이 특정 폴더를 공유
- Container가 사라지더라도 데이터를 남게 하는 것
- Container로 MySQL을 실행하는 경우 데이터가 저장되는 공간을 Docker Volume으로 설정
Docker Volume의 정의
- 호소트 파일 시스템 폴더를 Docker Container 파일 시스템의 폴더로 마운트 하는 것
- 호스트쪽에서 내용을 바꾸면 바로 Docker Container 쪽에도 반영됨(반대도 가능)
- 이를 통해 Docker Container의 상태와 관계없이 데이터를 영구적으로 변환
- 호스트쪽에서 내용을 바꾸면 바로 Docker Container 쪽에도 반영됨(반대도 가능)
- 파일 시스템 마운트:
- 원래 마운트란 디스크와 같은 물리적인 장치를 파일 시스템의 특정 위치(폴더)에 연결해주는 것을 말함
- 예를 들어 윈도우에서 USB를 꼽으면 내 컴퓨터에 새로운 :D 혹은 :E와 같은 새로운 폴더가 생기는 것이 마운트임
Docker Volume 타입
- Host Voluems: docker run -v를 실행할 때 페어로 지정
- docker ruen -v /home/jiwon/logs:/var/lib/airflow/logs
- :앞이 호스트 파일 시스템 path이고 뒤가 컨테이너 파일 시스템 path
- Anonymous Volumes: docker run -v를 실행할 때 패스만 지정
- docker run -v /var/lib/mysql/data
- 이 방식이 Dockerfile에서 사용되는 방식으로 호스트 쪽에 액세스 되지 않지만 재시작 해도 유지됨
- Named Volumes: docker run -v를 실행할 때 이름과 컨테이너 패스를 지정
- docker run -v name:/var/lib/mysql/data
- 가장 선호되는 방식(가장 많이 쓰임). 이 방식이 하나의 Volume을 다수의 컨테이너에서 공유하는 것도 가능하게 함
- 이 포맷으로 docker-compose에서도 사용됨
Volume을 Readonly로 지정하고 싶다면?
- name:/var/lib/mysql/data: ro
Docker 환경 클린업: 컨테이너와 이미지 삭제
Using 커맨드 라인
- Image를 삭제하려면 실행 중인 Container가 없어야 함
- 순서: Container 중단 -> Container 삭제 -> Image 삭제
- 컨테이너 삭제
- docker container ls -> container Id 개별적으로 docker container rm 뒤에 추가 해야함
- ex) $ docker container rm cfb08d30f4ec f2a8dcac5aca cb46ab7b4957
- 일괄 삭제: $ docker container rm -f $(docker container ls -aq)
- docker container ls -aq은 현재 존재하는 모든 container id 리스팅 -> 이것이 삭제 인자로 적용
- docker container ls -> container Id 개별적으로 docker container rm 뒤에 추가 해야함
- 이미지 삭제
- docker image ls -> image Id 개별적으로 docker image rm 뒤에 추가 해야함
- 일괄 삭제: $ docker image rm -f $(docker image ls -q)
- 삭제 확인
- docker ps
- docker images
- docker image ls
Using Docker Desktop
- Docker Desktop에서 모두 삭제하는 것이 가장 직관적임
- Desktop에서 Troubleshoot 메뉴 -> clear/Purge data: 일괄 삭제됨
다수의 컨테이너가 존재하는 프로그램 다루기
실행할 프로그램 설명
- Docker에서 제공해주는 예제 프로그램: Cat vs. Dog 투표 프로그램
- vote, result, redis, Postgresdb(db), Worker 존재
5개의 컨테이너 따로 다루기
이미지 빌드(./~에 있는 Dockerfile읽어 이미지 빌드)
- vote 이미지 빌드: docker build -t vote ./vote
- result 이미지 빌드: docker build -t result ./result
- worker 이미지 빌드: docker build -t worker ./worker
- redis와 postgres는 공식 이미지이므로 빌드할 필요 X
- 빌드된 이미지 목록 확인: docker images
컨테이너 실행
- docker run -d --name=redis redis
- docker run -d -e POSTGRES_PASSWORD=postgres --name=db postgres
- docker run -d --name=vote -p 5001:80 vote
- docker run -d --name=result -p 5002:80 result
- docker run -d --name=worker worker
결과: 컨테이너를 모두 각각 실행했으므로 각 컴포넌틀간의 네트워크 연결이 안됨 즉, 투표 결과가 DB에 저장 X -> result에 결과 안 넘어옴 문제
하나의 컨테이너로 다루기
위의 문제를 해결하기 위해 network를 하나 만들고 모든 컨테이너들을 이 네트워크 안으로 지정
- docker의 network 기능 사용(전에는 docker run의 link 옵션 사용)
- 연결 상황에 따라 별개의 네트워크를 만들고 사용도 가능함
- back-tier
- front-tier
- 예제에서는 mynetwork를 하나 만들고 진행
docker network create
- 위에서 따로 만든 것들 삭제: docker container rm -f $(docker container ls -aq)
- rm -f: -f 옵션 container 실행중이어도 삭제 가능
- mynetwork라는 이름으로 네트워크 생성: docker network create mynetwork
- mynetwork 연결하고 redis 실행: docker run -d --name=redis --network mynetwork redis
- mynetwork 연결하고 Postgres 실행: docker run -d --name=db -e POSTGRES_PASSWORD=password --network mynetwork postgres
- -e POSTGRES_PASSWORD=password: password 라는 비밀번호를 지정함(비밀번호 지정해야 오류 안 남)
- mynetwork 연결하고 vote 실행: docker run -d --name=vote -p 5001:80 --network mynetwork vote
- mynetwork 연결하고 result 실행: docker run -d --name=result -p 5002:80 --network mynetwork result
- mynetwork 연결하고 worker 실행: docker run -d --name=worker --network mynetwork worker
- 위에서 따로 만든 것들 삭제: docker container rm -f $(docker container ls -aq)
반응형
'데브코스(DE) > Docker & K8S' 카테고리의 다른 글
05. Kubernetes(K8s) (0) | 2024.05.31 |
---|---|
04. Docker Compose (0) | 2024.05.30 |
02. Docker에서 웹 서비스 실행 (0) | 2024.05.28 |
01. Docker (0) | 2024.05.28 |