[mysql] 호스트에서 Docker 컨테이너의 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
.
서버 호스트 이름 (바인드 주소) : ‘0.0.0.0’; 포트 : 3306- ‘0.0.0.0’은 ‘0.0.0.0’으로 확인됩니다. IP에 생성 된 서버 소켓 : ‘0.0.0.0’.
답변
Docker MySQL 호스트가 올바르게 실행중인 경우 로컬 컴퓨터에서 연결할 수 있지만 다음과 같이 호스트, 포트 및 프로토콜을 지정해야합니다.
mysql -h localhost -P 3306 --protocol=tcp -u root
3306을 Docker 컨테이너에서 전달한 포트 번호로 변경합니다 (귀하의 경우 12345).
Docker 컨테이너 내에서 MySQL을 실행하고 있기 때문에 소켓을 사용할 수 없으며 TCP를 통해 연결해야합니다. mysql 명령에서 “–protocol”을 설정하면 변경됩니다.
답변
localhost 대신 “127.0.0.1”을 사용하면 mysql은 tcp 메소드를 사용하며 다음과 같이 컨테이너를 연결할 수 있어야합니다.
mysql -h 127.0.0.1 -P 3306 -u root
답변
docker-compose를 확인하는 것이 좋습니다. 작동 방식은 다음과 같습니다.
다음과 같은 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
다음으로 실행 :
$ docker-compose up
노트:
- 최신 mariadb 이미지 태그는 https://hub.docker.com/_/mariadb/를 참조 하십시오.
이제 다음과 같이 mysql 콘솔에 액세스 할 수 있습니다.
$ mysql -P 8083 –protocol = tcp -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와 동일한 조언이지만 docker-compose의 전체 예제입니다.
답변
간단한 방법은 mysql 유닉스 소켓을 호스트 머신에 공유하는 것입니다. 그런 다음 소켓을 통해 연결
단계 :
- 호스트 컴퓨터에 대한 공유 폴더 만들기 예 :
mkdir /host
- 볼륨 마운트 옵션으로 도커 컨테이너를 실행합니다
docker run -it -v /host:/shared <mysql image>
. - 그런 다음 mysql 구성 파일
/etc/my.cnf
을 변경하고 파일의 소켓 항목을 다음과 같이 변경하십시오.socket=/shared/mysql.sock
service mysql restart
Docker에서 MySQL 서비스 다시 시작- 마지막으로 소켓을 통해 호스트에서 MySQL 서버에 연결합니다
mysql -u root --socket=/host/mysql.sock
. 암호가 -p 옵션을 사용하는 경우
답변
docker-machine에서 docker를 실행하는 경우?
IP를 얻으려면 실행하십시오.
docker-machine ip <machine>
머신의 IP를 반환하고 mysql 연결을 시도합니다.
mysql -h<docker-machine-ip>
답변
내 서버에 대해 임시 도커 컨테이너를 실행하여이 작업을 수행하므로 호스트에 설치된 항목에 대해 걱정할 필요가 없습니다. 먼저 필요한 사항을 정의합니다 (목적에 맞게 수정해야 함).
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 플래그가 필요합니다.