호스트에서 도커 컨테이너의 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
솔루션을 검증하려면
- 전술한 레포의 클론을 작성합니다.
git clone https://github.com/wangkuiyi/mysql-server-in-docker cd mysql-server-in-docker
- 도커 MySQL 빌드
docker build -t mysql:yi .
- 를 기동한다.MySQL 서버를 기동한다.
docker run --rm -d -p 23306:3306 mysql:yi
- 호스트에 MySQL 클라이언트를 설치합니다(아직 설치되어 있지 않은 경우).에서 실행하고 에 Ubuntu 18.04를 사용하고 .
apt-get
sudo apt-get install -y mysql-client
- 호스트에서 컨테이너에서 실행 중인 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>
변환의 경우,~/.my.cnf
호스트 내의 파일:
[Mysql]
user=root
password=yourpass
host=127.0.0.1
port=3306
그럼 다음번엔 그냥 뛰어mysql
mysql 클라이언트가 접속을 엽니다.
도커 실행 -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 아로라
>>합니다..env
filename을 클릭합니다.
.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
다음 에서 " " "를 실행합니다.>$ mysql
sql 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
'programing' 카테고리의 다른 글
Windows 10에서는 MariaDB와 MySQL이 매우 느리다 (0) | 2023.01.01 |
---|---|
공통 MySQL 필드 및 해당 데이터 유형 (0) | 2023.01.01 |
이름이 JPA에서 예약된 단어인 엔티티 필드를 매핑하는 방법 (0) | 2023.01.01 |
Java 8의 기본 가비지 수집기 (0) | 2023.01.01 |
봄 JPA @LIKE와 함께 쿼리 (0) | 2023.01.01 |