그만 도망치자
로그를 만지니 별별 오류를 다 만나고 있는 요즘...
사실 지금까지 미루고 있었던 오류가 있었다.
Error response from daemon: failed to create task for container: failed to initialize logging driver: dial tcp [::1]:24224: connect: connection refused
docker-compose로 fluentd와 다른 컨테이너들을 함께 키면 fluentd가 로깅하는 컨테이너들만 켜지지 않는 상황이다.
오류 코드를 보면 현재 fluentd가 실행되지 않았다면서 멈춘 것이다.
docker 데스크탑을 보면 fluentd는 켜져있다.
그런데 저 주황색으로 된 로깅이 필요한 컨테이너들은 Created 상태여서 움직이질 않는다.
그동안은 다시 docker-compose up 명령어를 실행했다.
그러면 이미 fluentd가 켜져있어 다른 컨테이너들이 잘 올라갔다.
하지만 처음부터 실행되지 않는게 꽤 귀찮아져서 해결해야겠다고 생각해 이거저거 알아봤다.
바로 해결 방법을 알고 싶은 사람은 두번째 방법으로 가시길 🙏
첫번째 방법: depends_on 사용하기
현재 문제의 원인이 fluentd가 다른 컨테이너보다 늦게 켜져서 그런거다.
그렇다면 해결책으로 fluentd가 다른 컨테이너보다 빨리 켜지게 하면 된다.
찾아보니 컨테이너 실행순서를 컨트롤 할 수 있다고 한다.
간단하게 depends_on 으로 대상 컨테이너가 실행 상태가 된 히우에 실행하게 만들어 줄 수 있다고 해서 코드를 수정했다.
fluentd:
build: .
image: my-fluentd:latest
user: "0"
volumes:
- ./fluentd/log:/fluentd/log
- ./fluentd/conf:/fluentd/etc
ports:
- 24224:24224
- 24224:24224/udp
restart: always
s:
(...)
links:
- fluentd
depends_on:
- fluentd
logging:
driver: fluentd
options:
fluentd-address: localhost:24224
tag: TypeValidatorService
restart: always
과연 됐을까?
아니요 🤬
여전히 똑같은 오류가 나온다.
depends_on으로 안되는 이유는 이 옵션은 단순히 컨테이너 시작를 제어한다.
뭔말이냐고 할 수 있는데 예리하다.
나도 단순해도 컨테이너 시작 순서를 제어하면 당연히 fluentd가 완전히 시작되고 그 다음에 되도록 히야한다고 생각했다.
하지만 이 점이 depends_on을 사용할 때 혼란스러운 점 중 하나다.
depends_on은 컨테이너 시작의 순서를 제어한다.
여기에서 "컨테이너 시작"과 "애플리케이션이 컨테이너 내에서 완전히 준비됨"은 다르다!
예를 들어, A서비스가 B서비스에 depends_on 되어 있다면 docker는 B의 컨테이너를 먼저 시작한다.
그 후 A의 컨테이너를 시작하는데 여기에서 중요한 점이 있다.
바로 B의 컨테이너가 시작됐다고 해서 B 서비스의 애플리케이션이 준비된 것은 아니다.
그렇기 때문에 depends_on만으로는 완전한 연결 준비 상태를 보장하기 어렵다.
두번째 방법: fluentd-aync-connect 옵션 ✅
docker 공식 홈페이지에 fluentd logging driver라는 이름으로 좋은 문서가 있었다.
fluentd-async-connect 설명이 너무 간결한데 이 옵션은 fleuntd에 연결할 때 비동기로 연결을 시도한다.
그래서 시작 시에 fleutnd가 아직 준비되지 않았을 때 컨테이너가 시작되는 것을 방지한다.
fluentd:
build: .
image: my-fluentd:latest
user: "0"
volumes:
- ./fluentd/log:/fluentd/log
- ./fluentd/conf:/fluentd/etc
ports:
- 24224:24224
- 24224:24224/udp
restart: always
s:
(...)
links:
- fluentd
depends_on:
- fluentd
logging:
driver: fluentd
options:
fluentd-address: localhost:24224
fluentd-async-connect: "true" // 여기 추가
tag: TypeValidatorService
restart: always
전체코드는 이렇다.
이렇게 해주니 잘 동작한다 👍
fin.
댓글