docker - 3

이영준·2024년 5월 29일

Docker Volume의 필요성

만약 docker container가 무슨 이유로건 중단되거나 재실행된다면 그 안에 데이터는 어떻게 될까?

  • 특정 소프트웨어가 docker container를 통해 일회성으로 동작하는 것이 아니라, 계속해서 동작해야 한다면 데이터는 영구적으로 보관되어야 함
  • 이를 보장하는 기능이 docker volumes -> Data Persistence
  • docker container내의 가상 파일 시스템과 호스트 시스템의 파일 시스템을 맵핑

docker volume 정의

  • 호스트 파일 시스템 폴더를 docker container 파일 시스템의 폴더로 마운트 하는 것

docker volume 타입

  • host volumes: docker run -v를 실행할 때 페어로 지정
    • docker run -v /home/.../logs:/var/;ib/airflow/logs
    • : 앞이 호스트 파일 시스템 패스고 뒤가 컨테이너 파일 시스템 패스임.
  • Anonymous Volumes : docker run -v를 실행할 때 컨테이너 패스만 지정
    • dockerfile에서 사용되는 방식인데 호스트 쪽에 액세스되지는 않지만 재시작해도 유지
    -Named Volumes : docker run -v를 실행할 때 이름과 컨테이너 패스 지정

이미지 생성 시 docker volume 지정

  1. dockerfile
    • volume 명령을 통해 anonymous volume만 지정 가능
  2. docker-compose
    • host volume이나 named volume을 사용하는 것이 일반적

실습 - docker volume

순서

  • nginx를 실행하고자 함
    • docker run -d --name=nginx -p 8081:80 nginx
    • 브라우저 방문 : http://localhost:8081/
    • docker exec --user=root -it nginx sh
      • apt update
      • apt install nano
      • nano /usr/share/nginx/html/index.html (내용 편집)
      • 내용 편집 후 exit
    • docker restart nginx 위의 과정을 반복해 html문서의 내용 확인시 원상복구됨

결과


  • 이 내용을 바꿔보고자 함

순서(docker file 사용)

다수의 container로 구성된 소프트웨어 실행

실습

사전 정보

순서

  • docker build -t vote ./vote
  • docker build -t result ./result
  • docker build -t worker ./worker
  • docker images
    redis와 postgres는 공식 이미지들이라 빌드할 필요는 없음.

build

docker build를 통해 vote,result,worker 이미지 생성

build 2

# 하나씩 실행
 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


port mapping이 안되서 연결은 안됨

네트워크 관련 이슈

vote에 로그인해서 inputils-ping 설치 후 ping 명령으로 redis 호스트 이름이 연결되는지 확인
ping redis

어떻게 해결이 가능한가?

  • docker의 network 기능 사용
  • network을 하나 만들고 모든 커테이너들을 이 네트워크 안으로 지정.

docker network를 새로 만들자

#docker network create
 docker container rm -f $(docker container ls -aq)
 docker network create mynetwork
 docker run -d --name=redis --network mynetwork redis
 docker run -d --name=db -e POSTGRES_PASSWORD=password --network
mynetwork postgres
 docker run -d --name=vote -p 5001:80 --network mynetwork vote
 docker run -d --name=result -p 5002:80 --network mynetwork result
 docker run -d --name=worker --network mynetwork worker

해결 완료

docker-compose 네트워킹

  • docker끼리 네트워크 연결이 필요하 경우
    • services에 준 이름으로 호스트 이름이 생성
    • 별도에 DNS 서버가 하나 생성되어 이름을 내부 IP로 변환
  • 별도로 네트워크를 구성하고 싶다면 network에 네트워크를 나열하고 네트워크를 적절하게 서비스에 지정해주어야함.
profile
개인공부용(업데이트 중단)

0개의 댓글