programing

호스트에서 도커 컨테이너의 mysql에 연결

luckcodes 2023. 1. 1. 12:13

호스트에서 도커 컨테이너의 mysql에 연결

(Docker 또는 mysql 관리에 대한 지식이 한정되어 있기 때문에 아마 바보 같은 질문일 것입니다만, 저는 이 문제에 대해 하룻밤을 보냈기 때문에 감히 질문합니다.)

한마디로 말하면

도커 컨테이너에서 mysql을 실행하고 호스트에서 도커 컨테이너에 연결합니다.지금까지 달성한 최고의 성과는 다음과 같습니다.

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

상세

는 다음과 을 사용하고 있습니다.Dockerfile:

FROM ubuntu:14.04.3
RUN apt-get update && apt-get install -y mysql-server

# Ensure we won't bind to localhost only
RUN grep -v bind-address /etc/mysql/my.cnf > temp.txt \
  && mv temp.txt /etc/mysql/my.cnf

# It doesn't seem needed since I'll use -p, but it can't hurt
EXPOSE 3306

CMD /etc/init.d/mysql start && tail -F /var/log/mysql.log

이 파일이 있는 디렉토리에서 이미지를 빌드하고 실행할 수 있습니다.

> docker build -t my-image .
> docker run -d -p 12345:3306 my-image

이미지에 첨부하면 정상적으로 동작하는 것 같습니다.

# from the host
> docker exec -it <my_image_name> bash

#inside of the container now
$ mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
[...]

그러나 호스트로부터 그다지 성공을 거두지 못했습니다.

> mysql -P 12345 -uroot
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

더 자세한 정보

  • 제가 본 질문 중에 제 질문처럼 보이는 질문이 있어요.단, 동일하지 않습니다(어차피 답이 없습니다).
    • mysql 전용 이미지가 있는 것은 보았지만, 그다지 성공적이지 않았습니다.
    • ★★★grep -v기분이 이상할 수도 있어요.인정하건대, 더 깔끔한 방법이 있을지도 모른다.그러나 이미지를 첨부하면 실제로 예상대로 동작하는 것을 확인할 수 있습니다(즉,bind-address). 안에 그리고 컨테이너 안이 보입니다./var/log/mysql/error.log:

서버 호스트명(bind-address): '0.0.0', 포트: 3306 - '0.0.0'이 '0.0.0'으로 확인됨, 서버 소켓이 IP에 작성됨: '0.0.0'

Docker MySQL 호스트가 올바르게 실행 중인 경우 로컬 시스템에서 연결할 수 있지만 다음과 같이 호스트, 포트 및 프로토콜을 지정해야 합니다.

mysql -h localhost -P 3306 --protocol=tcp -u root

3306을 도커 컨테이너에서 전송한 포트 번호로 변경합니다(이 경우 12345가 됩니다.

도커 컨테이너 내에서 MySQL을 실행하고 있기 때문에 소켓을 사용할 수 없으며 TCP를 통해 연결해야 합니다.mysql 명령어로 "--protocol"을 설정하면 이 설정이 변경됩니다.

localhost mysql 대신 "127.0.0.1"을 사용하는 경우 tcp 메서드가 사용되므로 컨테이너를 다음과 같이 연결할 수 있습니다.

mysql -h 127.0.0.1 -P 3306 -u root

도커 컴포지트를 확인해 볼 것을 권장합니다.그 방법은 다음과 같습니다.

다음과 같은 docker-compose.yml 파일을 만듭니다.

version: '2'

services:

  mysql:
    image: mariadb:10.1.19
    ports:
      - 8083:3306
    volumes:
      - ./mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: wp

다음 실행:

$ 도커(배당)

주의:

  • 최신 mariadb 이미지 태그에 대해서는, https://hub.docker.com/_/mariadb/ 를 참조해 주세요.

이제 다음과 같이 mysql 콘솔에 액세스할 수 있습니다.

$mysql - P 8083 --sysql=sysql -u 루트 -p

Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.5.5-10.1.19-MariaDB-1~jessie mariadb.org binary distribution

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

주의:

  • d 플래그를 전달하면 mysql/mariadb 컨테이너를 분리/백그라운드모드로 실행할 수 있습니다.

  • 비밀번호는 docker-compose.yml 파일에 정의되어 있는 "wp"입니다.

  • maniekq와 같은 조언이지만 도커 컴포지트의 완전한 예시입니다.

간단한 방법은 mysql unix 소켓을 호스트 머신에 공유하는 것입니다.그런 다음 소켓을 통해 연결합니다.

순서:

  • (예: 「」).mkdir /host
  • 옵션이 를 실행합니다.docker run -it -v /host:/shared <mysql image>.
  • 「Da」 「mysql」을 합니다./etc/my.cnf를 '소켓엔트리를 '소켓엔트리는 '소켓엔트리'로 합니다.socket=/shared/mysql.sock
  • 서비스 MySQL을 합니다.service mysql restart
  • 으로 에서 MySQL 합니다.mysql -u root --socket=/host/mysql.sock하는 경우 -p option을 사용합니다

알았어. 드디어 이 문제를 풀었어.다음은 https://sqlflow.org/sqlflow에서 사용하고 있는 솔루션을 나타냅니다.

완전한 솔루션

데모를 자급자족하기 위해 필요한 모든 코드를 https://github.com/wangkuiyi/mysql-server-in-docker로 이동시켰습니다.

솔루션의 열쇠

DockerHub.com의 공식 이미지는 사용하지 않습니다.대신 Ubuntu 18.04에 MySQL을 설치하여 나만의 것을 만들었습니다. 방법을 사용하면 mysqld를 시작하고 0.0.0(모든 IP)에 바인드할 수 있습니다.

자세한 내용은 제 GitHub repo에 기재되어 있는 다음 행을 참조해 주십시오.

SQLFLOW_MYSQL_HOST=${SQLFLOW_MYSQL_HOST:-0.0.0.0}

echo "Start mysqld ..."
sed -i "s/.*bind-address.*/bind-address = ${SQLFLOW_MYSQL_HOST}/" \
    /etc/mysql/mysql.conf.d/mysqld.cnf
service mysql start

솔루션을 검증하려면

  1. 전술한 레포의 클론을 작성합니다.
    git clone https://github.com/wangkuiyi/mysql-server-in-docker
    cd mysql-server-in-docker
    
  2. 도커 MySQL 빌드
    docker build -t mysql:yi .
    
  3. 를 기동한다.MySQL 서버를 기동한다.
    docker run --rm -d -p 23306:3306 mysql:yi
    
  4. 호스트에 MySQL 클라이언트를 설치합니다(아직 설치되어 있지 않은 경우).에서 실행하고 에 Ubuntu 18.04를 사용하고 .apt-get
    sudo apt-get install -y mysql-client
    
  5. 호스트에서 컨테이너에서 실행 중인 MySQL 서버에 연결합니다.
    mysql --host 127.0.0.1 --port 23306 --user root -proot
    

동일한 호스트의 다른 컨테이너에서 연결

같은 호스트 상의 다른 컨테이너에서도 MySQL 클라이언트를 실행할 수 있습니다.

docker run --rm -it --net=host mysql/mysql-server mysql \
   -h 127.0.0.1 -P 13306 -u root -proot

다른 호스트에서 연결

iMac에서는 Homebrew를 사용하여 MySQL 클라이언트를 설치합니다.

brew install mysql-client
export PATH="/usr/local/opt/mysql-client/bin:$PATH"

그러면 위의 Ubuntu 호스트(192.168.1.22)에 액세스할 수 있습니다.

mysql -h 192.168.1.22 -P 13306 -u root -proot

다른 호스트에서 실행 중인 컨테이너에서 연결

iMac에서 실행되는 컨테이너에서 MySQL 클라이언트를 실행하여 Ubuntu 워크스테이션의 컨테이너에서 MySQL 서버에 연결할 수도 있습니다.

docker run --rm -it --net=host mysql/mysql-server mysql \
    -h 192.168.1.22 -P 13306 -u root -proot

특별한 케이스

MySQL 클라이언트와 서버를 동일한 호스트에서 실행되는 별도의 컨테이너에서 실행하는 경우 CI를 설정할 때 MySQL 서버 Docker 이미지를 직접 구축할 필요가 없습니다. '우리'를 .--net=container:mysql_server_container_name클라이언트 컨테이너를 실행할 때 사용합니다.

서버를 시작하려면

docker run --rm -d --name mysql mysql/mysql-server

클라이언트를 시작하려면

docker run --rm -it --net=container:mysql mysql/mysql-server mysql \
 -h 127.0.0.1 -P 3306 -u root -proot

도커머신에서 도커를 운영하고 있다면?

execute to get IP:

docker-machine ip <machine>

머신의 IP를 반환하고 connect mysql을 시도합니다.

mysql -h<docker-machine-ip>

터미널 실행 시:docker exec -it container_name /bin/bash그 후, 다음과 같이 입력합니다.mysql

이 작업은 서버에 임시 도커 컨테이너를 실행함으로써 이루어지기 때문에 호스트에 설치된 컨테이너에 대해 걱정할 필요가 없습니다.먼저 필요한 것을 정의합니다(목적에 맞게 변경해야 합니다).

export MYSQL_SERVER_CONTAINER=mysql-db
export MYSQL_ROOT_PASSWORD=pswd 
export DB_DOCKER_NETWORK=db-net
export MYSQL_PORT=6604

항상 다른 컨테이너에 필요한 새로운 도커 네트워크를 만듭니다.

docker network create --driver bridge $DB_DOCKER_NETWORK

mySQL 데이터베이스 서버 시작:

docker run --detach --name=$MYSQL_SERVER_CONTAINER --net=$DB_DOCKER_NETWORK --env="MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD" -p ${MYSQL_PORT}:3306 mysql

새 서버 컨테이너의 IP 주소 캡처

export DBIP="$(docker inspect ${MYSQL_SERVER_CONTAINER} | grep -i 'ipaddress' | grep -oE '((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])')"

서버에 대한 명령줄 인터페이스를 엽니다.

docker run -it -v ${HOST_DATA}:/data --net=$DB_DOCKER_NETWORK --link ${MYSQL_SERVER_CONTAINER}:mysql --rm mysql sh -c "exec mysql -h${DBIP} -uroot -p"

이 마지막 컨테이너는 서버가 계속 실행되는 동안 mySQL 인터페이스를 종료할 때 자동으로 제거됩니다.또한 서버와 호스트 간에 볼륨을 공유하여 데이터 또는 스크립트를 더 쉽게 가져올 수 있습니다.이게 도움이 됐으면 좋겠네요!

mysql -u root -P 4406 -h localhost --protocol=tcp -p

사용자, 포트 및 호스트를 구성에 맞게 변경해야 합니다.데이터베이스 사용자가 암호로 구성된 경우 -p 플래그가 필요합니다.

실행 중인 컨테이너에 할당된 IP 주소를 검사하고 해당 호스트에 연결해야 합니다.

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container name or id>

접속할 수 있는 범위:

mysql -h <IP provided by inspect command> -P <port> -u <user> -p <db name>

https://mariadb.com/kb/en/installing-and-using-mariadb-via-docker/ #커넥팅에서 adb-from-the-broadb-from-the-brown으로

변환의 경우,~/.my.cnf호스트 내의 파일:

[Mysql]
user=root
password=yourpass
host=127.0.0.1
port=3306

그럼 다음번엔 그냥 뛰어mysqlmysql 클라이언트가 접속을 엽니다.

  • 도커 실행 -e MYSQL_ROOT_PASSWORD=pass --name sql-db -p 3306:3306 mysql

  • 도커 exec -it sql-db bash

  • mysql -u 루트 -p

컨테이너를 실행하려면 다음 명령을 실행합니다.

docker run --name db_name -e MYSQL_ROOT_PASSWORD=PASS--publish 8306:3306 db_name

호스트 시스템에서 mysql db를 가져오려면 이 명령을 실행합니다.

mysql -h 127.0.0.1 -P 8306 -uroot  -pPASS

당신이라면 그렇겠지

mysql -h 127.0.0.1 -P 12345 -uroot  -pPASS

다음 명령을 사용하여 호스트에서 실행 중인 SQL Server 5.7을 연결할 수 있습니다. mysql - h 10.10.1.7 - P 3307 --sysql=sysql -u root -p 。여기서 ip는 호스트 IP이고 3307은 mysql 도커의 포트입니다.명령어를 입력한 후 myql.의 비밀번호를 입력합니다.이제 호스트 머신에서 mysql 도커 컨테이너가 연결되었습니다.

먼저 로그 오류 발생 여부를 참조하십시오.

docker ps -a
docker logs container_name

에러가 있는 경우는, 그 에러의 해결 방법을 검색합니다.에러가 없는 경우는, 다음의 순서로 진행됩니다.

컨테이너 MySQL을 시작한 후 시작하는 데 몇 분이 걸리므로 3~4분 후에 이러한 명령을 실행하십시오.

docker exec -it container_name bash
# ONCE YOU ARE INSIDE CONTAINER 
mysql -u root -p
SHOW DATABASES;
exit

터미널 또는 명령 프롬프트에서 연결하려면 다음과 같이 하십시오.

mysql -h localhost -P 3306 --protocol=tcp -u root -p

저도 같은 일을 시도했지만, 같은 문제에 직면했습니다만, 아래와 같이 /bin/bash를 사용하여 도커 컨테이너를 실행하려고 할 때마다, 한 가지 깨달았습니다.

docker container run -it --name test_mysql -e MYSQL_ROOT_PASSWORD=password -p 3306:3306 mysql:latest /bin/bash

위의 명령어를 누른 후 컨테이너가 시작되지만 동일한 오류가 발생합니다." ERROR 2002(HY000):소켓 '/var/run/mysqld/mysqld'를 통해 로컬 MySQL 서버에 연결할 수 없습니다.양말' (2)"

위의 명령어 대신 아래의 명령어를 사용해 보겠습니다.

docker container run -itd --name test_mysql -e MYSQL_ROOT_PASSWORD=password -p 3306:3306 mysql:latest

docker container exec test_mysql /bin/bash

명령어를 사용하여

mysql -uroot -P3306 -p

이 아이디어가 당신의 경우 효과가 있기를 바랍니다.

Thanks Love 아로라

>>합니다..envfilename을 클릭합니다.

.env「 」:

DB_CONNECTION=mysql
DB_HOST=0.0.0.0:3306
DB_PORT=3306
DB_DATABASE=testdb
DB_USERNAME=sail
DB_PASSWORD=password

여기에 이미지 설명 입력

여기에 이미지 설명 입력

이게 누군가에게 도움이 되는 경우:

내가 선호하는 솔루션

콘텐츠와 함께 ~/.my.cnf 추가

[client]
user=<yourusername>
password=typethepasswordhere
host=127.0.0.1
port=3306

다음 에서 " " "를 실행합니다.>$ mysqlsql cmd로 지정합니다.

하드코어 대안

이렇게 연결할 수도 있습니다.

docker exec -it containername mysql  

sql cmd로 이동하려면

또는

docker exec -it contaiinername bash (or sh) 

하여 실행하다>$ mysql

" con ip "localhost"로
하기 .

언급URL : https://stackoverflow.com/questions/33001750/connect-to-mysql-in-a-docker-container-from-the-host