programing

도커 디버깅은 mariadb 상태 점검을 구성합니다.

powerit 2023. 10. 30. 21:21
반응형

도커 디버깅은 mariadb 상태 점검을 구성합니다.

mariadb 서비스에서 상태 검사를 추가하려고 하는데 서버에 대한 클라이언트 연결이 차단되어 다음 메시지가 표시됩니다.

ERROR 2005 (HY000): Unknown MySQL server host 'mysql' (0)

연결을 설정할 수 있으며 다음 상태를 확인하지 않아도 모든 것이 정상적으로 실행됩니다.

healthcheck:
  test: /usr/bin/learnintouch/db-health-check.sh
  interval: 30s
  timeout: 10s
  retries: 3

... 상태 점검이 예상대로 작동할 경우:

root@428b1e6c7c1a:/usr/bin/learnintouch/www/folkuniversitet# /usr/bin/learnintouch/db-health-check.sh
+ /usr/bin/mysql/install/bin/mysql --protocol=tcp -h mysql -u root -pxxxxxx -e 'show databases;'
Warning: Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| db_engine          |
| db_learnintouch    |
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+

초기 작업 서비스 구성은 다음과 같습니다.

  mysql:
    image: localhost:5000/mariadb:10.1.24
    environment:
      - MYSQL_ROOT_PASSWORD=xxxxxx
    networks:
      - learnintouch
    volumes:
      - "~/dev/docker/projects/learnintouch/volumes/database/data:/usr/bin/mariadb/install/data"
      - "~/dev/docker/projects/learnintouch/volumes/logs:/usr/bin/mariadb/install/logs"
    deploy:
      replicas: 1
      restart_policy:
        condition: any
        delay: 5s
        max_attempts: 3
        window: 10s

실패한 서비스 구성은 다음과 같습니다.

  mysql:
    image: localhost:5000/mariadb:10.1.24
    environment:
      - MYSQL_ROOT_PASSWORD=xxxxxx
    networks:
      - learnintouch
    volumes:
      - "~/dev/docker/projects/learnintouch/volumes/database/data:/usr/bin/mariadb/install/data"
      - "~/dev/docker/projects/learnintouch/volumes/logs:/usr/bin/mariadb/install/logs"
    deploy:
      replicas: 1
      restart_policy:
        condition: any
        delay: 5s
        max_attempts: 3
        window: 10s
    healthcheck:
      test: /usr/bin/learnintouch/db-health-check.sh
      interval: 30s
      timeout: 10s
      retries: 3

서버 시작 시,mariadb로그는 상태 확인 여부와 상관없이 정확히 동일하며, 다음으로 끝납니다.

2017-12-29 10:27:48 139873749194560 [Note] /usr/bin/mariadb/install/bin/mysqld: ready for connections.
Version: '10.1.24-MariaDB'  socket: '/usr/bin/mariadb/install/tmp/mariadb.sock'  port: 3306  Source distribution

여기 있습니다.db-health-check.shbash 스크립트:

#!/bin/bash -x

/usr/bin/mysql/install/bin/mysql --protocol=tcp -h mysql -u root -pxxxxxx -e "show databases;" || exit 1

도커 버전입니다.

Client:
 Version:      17.05.0-ce
 API version:  1.29
 Go version:   go1.7.5
 Git commit:   89658be
 Built:        Thu May  4 22:10:54 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.05.0-ce
 API version:  1.29 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   89658be
 Built:        Thu May  4 22:10:54 2017
 OS/Arch:      linux/amd64
 Experimental: false

업데이트:

사실 몇 가지 문제들이 있었는데, 그것은 함께 모든 것을 혼란스럽게 만들었습니다.

첫번째는.db-health-check.sh파일이 클라이언트 응용프로그램 컨테이너에 있으므로 서비스 데이터베이스 컨테이너가 상태 확인을 수행해야 할 때 파일을 찾을 수 없습니다.

두 번째는.db-health-check.sh파일이 잘못된 경로를 사용했습니다.mysql고객/usr/bin/mariadb/install/bin/mysql.

세 번째는.db-health-check.sh파일이 연결에 잘못된 호스트 이름을 사용했고 잘못 사용했습니다.mysql대신에localhost.

네 번째는.root사용자가 에 연결할 수 없습니다.1045 (28000): Access denied for user 'root'@'localhost'비밀번호가 없어야 하기 때문에/usr/bin/mariadb/install/bin/mysql --protocol=tcp -h localhost -u root -e "show databases;" || exit 1.

이러한 점을 수정한 후에는 상태 점검을 실시해도 응용 프로그램이 정상적으로 시작되고 실행될 수 있습니다.

선을 더욱 흐리게 만든 한 가지는 첫 번째 건강검진이 성공적으로 통과될 때까지 서비스를 이용할 수 없다는 것이었습니다.실제로 나는 다음과 같이 히텔 체크를 구성했습니다.

healthcheck:
      test: exit 0
      interval: 60s
      timeout: 10s
      retries: 3

처음에 이를 보여주는 컨테이너 상태:

"Health": {
    "Status": "starting",
    "FailingStreak": 0,
    "Log": []
}

60년대의 첫 번째 간격이 만료되고 상태 점검이 성공할 때까지 애플리케이션이 서비스에 연결할 수 없었습니다.

그러므로 나는 애플리케이션을 사용할 수 있도록 너무 오래 기다리지 않도록 짧은 간격을 가져야 합니다.

언급URL : https://stackoverflow.com/questions/48007020/debugging-a-docker-compose-mariadb-healthcheck

반응형