네트웍스와 볼륨을 추가해본다
네트웍스에서
탑키를 지정해주지 않으면 서비스에 지정된 이름으로 DNS resolution이 됨
DNS 해석(DNS resolution)은 도메인 이름을 해당 도메인의 IP 주소로 변환하는 프로세스를 말합니다. DNS(Domain Name System)은 인터넷에서 도메인 이름을 IP 주소로 매핑하기 위한 시스템입니다.
vote라는 이름으로 엑세스하면 내부 IP 어드레스로 변환이 됨.
이게 아니라, 하나로 네트워크를 연결하고 싶지 않고, 2개의 네트워크로 연결하고 싶다.
백티어: 노출 안되는 컴포넌트들
프론티어: 사용자들에게 노출됨.
이렇게 네트웍스 탑레벨 키워드 만들고, 아래 키를 정의
다시 서비스로 돌아가서 vote, result는 프론트티어 소속. 나머지는 백티어 소속이 되어야 함.
vote, result는 프론트 티어, 백티어 모두에 속함.
이 이유는. 프론드 앱은 백엔드도 엑세스 할 수 있어야 함. 그러나, 백앤드 앱은 프론트 앤드에 액세스 할 일은 없음.
네트워크 아이솔레이션을 구현.
모든 서비스에 네크웍스 키가 들어감. 리스트 형으로 네트워크를 언급해줌.
vote, result는 둘 다 적어줌.
조금 더 보안이 좋은 형태로
이전 정보가 유지가 되어야 할 텐데, 다 하지는 않고 db 서비스를 쓰는데, 이 서비스의 db데이터의 볼륨을 만들어본다.
야멀 파일 volumes:에 db-data:이렇게 기록. 이는 앞의 서비스 중에 사용된다는 것을 의미함.
도커 컨테이너 상황과 관계없이 데이터 유지됨.
나중에 가면 볼륨을 다른 컨테이너에도 달아줌.
일단은 postgres만
volumes:
db-data:
services:
db:
volumes:
- db-data:/var/lib/postgresql/data
앞에는 볼륨 아이디, 뒤에는 attach 되는 저장위치를, 외부에 있는 폴더가 마운트함.
네임드 볼륨임.
vote에
command를 붙일 수 있음 vote 이미지의 경우 build 커맨드를 통해 도커파일을 통해 빌드함. cmd 명령어로 어느 명령어로 실행될지 이미 기록되어 있음. 이를 오버라이드 하고 싶으면 command로 바꿀 수 있음
depends_on 이 있는데 5개 컨테이너가 실행될 때 이상적인 실행순서가 있음. redis가 실행되고 vote가 실행되는게 이상적임. 운에 따라 vote가 먼저 실행될 수도 있는데, 이걸 막고싶으면 depend_on을 써서 redis가 컨테이너로 실행이 되어야 vote가 실행될 수 있다고 명시할 수 있음. condtion은 옵션임. 이 redis 서비스가 실행이 되고, 서비스가 건강할 때만 vote가 실행 될 수 있다고 명시.
컨디션은 3개가 가능함.
vote는 healthcheck을 달아놓음. 외부에서 건강한지 확인해볼 수 있음.
아님 도커 엔진이 이 컨테이너의 서비스가 정상적인지 아닌지 확인할 수 있음.
헬스체크로 탭 누르면 알아서 만들어줌
테스트로 주어진 명령을 15초 마다 실행시켜 응답이 5초 이상, 3번 실패하면 건강에 이상있다고 판단함.
컨테이너가 시작되고 10초 후에 시작해라.
사실은 도커 이미지를 만들 때 도커파일에서도 쓸 수 있는 기능임.
도커 컴포즈에서 오버라이드 할 수 있 음.
리턴값이 0이라면 성공, 1이 리턴되면(0이 아닌값이) 실패.
volumes를 써서
./vote:/app
왼쪽은 호스트 파일 시스템, 오른쪽은 컨테이너 파일시스템이므로
이는 호스트 볼륨이 된다.
vote라는 서브 폴더와 컨테이너의 app 폴더와 연결.
오른쪽은 . 안붙이네?
각 CMD ,엔트리 포인트 덮
헬스체크
덮어쓰기 할 수 있음.
test로 지정된 명령을 지정된 주기마다 몇초 이내 실행되는지 확인
최대 3번 리트라이
해당 서비스가 컨테이너로 실행되고 40초가 지난 후 실행.
컴포즈, 도커파일이든 적어주면 좋다.
먼저 실행되어야 하는 서비스들이 무엇인지
리스트 형으로 숏 폼 실행가능
딕셔너리형으로
그 상황이 건강할 때만 내 서비스 실행
service_started - 건강여부 상관없이 서비스 시작하면 내 서비스 시작
condition으로
해당 컨테이너 시작여부
해당 컨테이너 건강여부 - healthcheck에 따라
디펜던시 모듈이 성공적으로 끝난 다음에야 실행해라. 현재는 불필요한 예. 나중에 에어플로우, 도커 이미지 실행할 때 초기화 작업해주고, 다른 컨테이너들이 실행되는 경우가 있음. 처음 초기화 해주는 컨테이너를 모든 다른 컨테이너들이 depends on 걸어주고 컨디션을 위 조건으로 걸어주면, 해당 컨테이너가 성공적으로 끝난 후에야 실행 가능.
에어플로우 init 생각해보자.
db데이터의 경우 헬스체크도 이렇게 설정 가능함.
쌍따옴표 해도되고 안해도 되나?
Docker Compose 파일에서는 주로 작은 따옴표(') 또는 큰 따옴표(")를 사용하여 값을 감싸는 것이 일반적입니다. 그러나 일반적으로 값이 공백이나 특수 문자를 포함하지 않는 경우에는 따옴표를 사용하지 않아도 됩니다.
헬스체크 관련 정보를 남기는 의도가 있는것 같음
호스트, 네임드 모두 가능.
호스트의 경우 탑레벨 볼륨에 적어줄 필요 없음.
볼륨에 들어가는건 db-data임.
environment
컨테이너 안에 설정되는 환경변수들이 됨. 도커파일로 치면 ENV, 도커 컨테이너로 실행될 때 살아남는다는 뜻.
map 문법으로 쭉 하나씩
array로 리스트 느낌으로 적어주는 방법
두가지 있음
redis도 호스트 볼륨에 헬스체크 붙여줌
워커의 경우 depend_on이 붙고
build가 더 확장되어서 쓰임.
다른 앱들은
build: /vote
식이었는데
build:
context: ./worker
도커 파일 이름을 바꾸거나, 특정 변수를 바꾸고 싶다면, build 키워드 밑에 이런 형태로 어느 폴더의 도커파일인지(새로운 이름의 도커파일 선택), 환경변수가 있다면 지정해줄 수 있음.
왜 이렇게 쓰는가? -> 이런게 가능하고 빌드할 때 더 많은 파라미터를 지정함으로써 오버라이드가 가능하다는 것을 알려줌.
엔트리포인트를 새로 오버라이드함.
https://github.com/learndataeng/example-voting-app/blob/main/docker-compose.yml
포트 번호는 8001, 8002 사용해야함. 내컴퓨터에선 충돌남.