본문 바로가기
Back Side

Error response from daemon: failed to create task for container: failed to initialize logging driver: dial tcp [::1]:24224: connect: connection refused

by developerBeluga 2023. 9. 1.
728x90
반응형

 

 

 

 

 

 

그만 도망치자

로그를 만지니 별별 오류를 다 만나고 있는 요즘...

사실 지금까지 미루고 있었던 오류가 있었다. 

 

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라는 이름으로 좋은 문서가 있었다.

 

https://gdevillele.github.io/engine/admin/logging/fluentd/

 

 

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.

 

 

 

 

 

728x90
반응형

댓글