programing

로컬에서 mysql 도커에 연결할 수 없습니다.

copyandpastes 2022. 10. 29. 12:32
반응형

로컬에서 mysql 도커에 연결할 수 없습니다.

도커 이미지에서 mysql 데이터베이스에 접속하려고 합니다.하지만 그것은 오류를 던지고 있다.

다음은 사용하고 있는 도커 이미지입니다.https://hub.docker.com/_/mysql/

도커 이미지를 실행하기 위해 사용한 명령어는 다음과 같습니다.

docker run -p 3306:3306 --name mysql_80 -e MYSQL_ROOT_PASSWORD=password -d mysql:8

의 출력을 다음에 나타냅니다.docker ps명령어

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                              NAMES
9f35d2e39476        mysql:8             "docker-entrypoint.s…"   5 minutes ago       Up 5 minutes        0.0.0.0:3306->3306/tcp

도커 검사를 사용하여 IP를 확인하고 해당 IP에 ping을 실행하면 IP에 도달할 수 없음을 나타냅니다.

docker inspect 9f35d2e39476 | grep -i ipaddress

접속을 시도하면localhost그리고.127.0.0.1다음과 같은 에러가 발생.

인증 플러그인 'caching_sha2_password'를 로드할 수 없습니다.

우선 안정적이지 않은 소프트웨어를 사용하고 있으므로 릴리스와 예기치 않은 동작 사이에 큰 변화가 있을 수 있습니다.

편집 : 개발 종료, 2018년 4월 19일 안정판 출시

둘째, 컨테이너에 직접 ping할 수 없습니다. 컨테이너는 다른 네트워크에 있지만 다른 컨테이너를 사용하여 ping할 수 있습니다.

mysql 8 사용caching_sha2_password기본 인증 플러그인으로 사용mysql_native_password자세한 것은 이쪽.

많은 mysql 드라이버는 다음과 같은 지원을 추가하지 않았습니다.caching_sha2_password아직.

문제가 있는 경우 다음과 같은 방법으로 이전 인증 플러그인으로 변경할 수 있습니다.

docker run -p 3306:3306 --name mysql_80 -e MYSQL_ROOT_PASSWORD=password -d mysql:8 mysqld --default-authentication-plugin=mysql_native_password

도커 컴포지트에서 기동할 때 수정 사항을 발견했습니다.

services:

  db:
    image: mysql
    command: mysqld --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example

즉, MySQL을 시작할 때 새 MySQL 암호/인증 메커니즘에서 복구합니다.

저도 같은 문제가 있었습니다만, mysql 8.X를 실행하고 있는 도커 컨테이너에서는 문제가 해결되지 않았습니다.컨테이너에 로그인했습니다.

docker exec -it CONTAINER_ID bash

다음으로 루트로 mysql에 로그인합니다.

mysql --user=root --password

root 비밀번호 입력(기본값은 'root') Finally Run:

ALTER USER 'username' IDENTIFIED WITH mysql_native_password BY 'password';

다 됐습니다.

이는 이미 답변이 끝난 상태입니다.게시

psychechemedia의 답변은 거의 효과가 있었습니다(win 10에서 새로 설치).그리고 제가 해야 할 아주 중요한 일이 한 가지 있습니다. 왜냐하면 이번이 제 첫 번째 시도가 아니었기 때문입니다.첨부한 데이터 폴더가 있는 경우, 제 예제 mysql 볼륨에서 먼저 이 폴더의 내용을 비우거나 삭제합니다.작업 중인 도커 구성 파일:

version: '3'
services:
    mysql-development:
      image: mysql:8.0.19
      container_name: mysql
      command: --default-authentication-plugin=mysql_native_password
      environment:
        MYSQL_ROOT_PASSWORD: XXX
        MYSQL_DATABASE: YYY
        MYSQL_USER: ZZZ
        MYSQL_PASSWORD: WWW
      ports:
        - "3306:3306"
        - "33060:33060"
      working_dir: /var/lib/mysql
      volumes:
        - "./mysql:/var/lib/mysql:rw"
  • 도커 컴포지트 파일에서 환경 변수를 업데이트합니다.
  • mysql 데이터 폴더 만들기(볼륨): mkdir mysql
  • docker-compose 구문을 확인합니다.exe 설정
  • 구축: 도커 구성.exe 빌드
  • 실행: 도커 컴포지트.을 실행하다

터미널 자체를 사용하여 MySQL에 연결하려고 할 경우 빌드가 불안정할 수 있습니다.그러나 Sequel Pro와 같은 GUI 클라이언트를 사용하여 MySQL에 연결하려고 하면 MySQL 8의 새로운 인증 기능을 지원하지 않을 수 있습니다.

를 '도커 '로 시작합니다.--default-authentication-plugin=mysql_native_password명령어를 실행하면 MySQL에서 기본값이 되어 오래된 인증을 사용합니다.

docker run -p 3306:3306 --name mysql_80 -e MYSQL_ROOT_PASSWORD=password -d mysql:8 --default-authentication-plugin=mysql_native_password

위의 정보는 훌륭하지만, 여기 몇몇 사람들에게 도움이 될 만한 추가적인 생각이 있습니다.root기본적으로는 계정은 원격으로 연결할 수 없습니다.이를 사용하려면 호스트 사용 권한을 포함해야 합니다. 8를 사용하고 에서는, 「8」(「8.0.25)」, 「8.0.25)을 .MYSQL_ROOT_HOST8. 3.8의 docker-compose.yml 느낌이에요.

mysqldb:
    image: $REPONAME/mysql:$MYSQLDB_VERSION
    build:
      context: ./docker/mysqldb
      args:
        MYSQLDB_VERSION: $MYSQLDB_VERSION
    environment:
      MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD
      MYSQL_ROOT_HOST: "%"
      MYSQL_DATABASE: dbname
      MYSQL_USER: dbuser
      MYSQL_PASSWORD: dbpass
    command: [mysqld, --default-authentication-plugin=mysql_native_password, --character-set-server=utf8mb4, --collation-server=utf8mb4_unicode_ci, --innodb_monitor_enable=all, --max-connections=1001]
    ports:
      - 3306:3306
    healthcheck:
      test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
      timeout: 10s
      retries: 10

MySQL 8.0을 사용하여 "caching_sha2_password plugin" 오류를 표시하지 않으려면 Docker에서 영구 데이터를 사용하여 MySQL 8.0을 설정하는 방법과 mysql_native_password를 사용하여 MySQL 8.0 컨테이너를 실행하는 방법에 대한 게시물을 확인하십시오.

즉, 로컬 "my.cnf" 구성 파일을 만들 수 있습니다.

$ sudo nano /usr/local/opt/mysql/config/my.cnf`

필요한 config 문을 추가합니다.

[mysqld]
default-authentication-plugin=mysql_native_password

그런 다음 해당 파일을 볼륨바인드로 "docker run" 스테이트먼트에 포함합니다.

$ docker run --restart always --name mysql8.0 - 
v/usr/local/opt/mysql/8.0:/var/lib/mysql -v 
/usr/local/opt/mysql/config:/etc/mysql/conf.d -p 3306:3306 -d -e 
MYSQL_ROOT_PASSWORD=your_password mysql:8.0

다음 단계에 대한 자세한 내용은 여기를 참조하십시오.

https://medium.com/@crmcmullen/how-to-run-in-a-docker-in-docker-filen-with-consent-local-data-58b89aec496a

https://medium.com/@crmcmullen/how-to-run-password-8-0-with-password-authentication-502de5gc661

이것은 해결된 것으로 생각되지만, 이것을 극복하기 위해 무엇이 필요한지 기록하고 싶었다.비슷한 문제가 있어서 이전 비밀번호 표준으로 되돌리는 것은 해결책이 되지 않았습니다.caching_sha2_password를 사용해야 했기 때문에 위의 명령어 중 하나를 사용해야 했습니다.

docker run -it --rm mysql mysql -h 172.31.116.20 -p -P6603

여기서 172.31.116.20은 컨테이너가 가동되고 있는 로컬 IP 주소이며, -P6603은 컨테이너가 가동하고 있는 포트입니다.

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
5092251b3dbf        mysql               "docker-entrypoint..."   16 minutes ago      Up 16 minutes       33060/tcp, 0.0.0.0:6603->3306/tcp   test1-mysql

MySQL 컨테이너용 도커 사이트에서 다음 솔루션을 찾았습니다.https://hub.docker.com/_/mysql/

"Connect to MySQL from the MySQL command line client" 섹션에 있습니다.

이것은 2022년 4월에 나에게 효과가 있었다.

  1. 데이터베이스 컨테이너 ID 가져오기
docker ps
  1. 다른 터미널 탭에서 db 컨테이너를 탭합니다.
docker exec -it RUNNING_DB_CONTAINER_ID_HERE bash
mysql --user=root --password
update mysql.user set host='%' where user='root';
flush privileges;
  1. Sequel Ace 등에서 mysql에 연결
host: 127.0.0.1
user: root
password: docker (as defined in your docker compose file)
Port: 4407 (as defined in your docker compose file)

참조용 도커 구성:

db:
    container_name: docker_database
    image: mysql/mysql-server:8.0.29
    ports:
        - "4407:3306"
    volumes:
        - ./db:/var/lib/mysql
    environment:
        - MYSQL_ROOT_PASSWORD=docker
        - MYSQL_DATABASE=your_database_here
        - TZ=Europe/London
    command: ['mysqld', '--default-authentication-plugin=mysql_native_password']

도커 파일

...
CMD ["mysqld", "--authentication-policy=mysql_native_password"]
..

사양대로

dev.mysql.com/doc/refman/8.0/en/server-system-variables.html

--default-authentication-module이 삭제됩니다.

언급URL : https://stackoverflow.com/questions/49019652/not-able-to-connect-to-mysql-docker-from-local

반응형