web-dev-qa-db-ja.com

ホストからdockerコンテナーでmysqlに接続する

(おそらくDockerまたはmysqlの管理に関する知識が限られているため、愚かな質問ですが、この問題に一晩中費やしたため、あえて質問します。)

一言で言えば

Dockerコンテナで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'。

65
gturri

Docker MySQLホストが正常に実行されている場合、ローカルマシンから接続できますが、次のようにホスト、ポート、プロトコルを指定する必要があります。

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

3306をDockerコンテナーから転送したポート番号に変更します(この場合、12345になります)。

Dockerコンテナ内でMySQLを実行しているため、ソケットは使用できず、TCP経由で接続する必要があります。 mysqlコマンドで「--protocol」を設定すると、それが変更されます。

103
maniekq

Localhostの代わりに「127.0.0.1」を使用する場合、mysqlはtcpメソッドを使用し、コンテナを次の方法で接続できるはずです。

mysql -h 127.0.0.1 -P 3306 -u root
31
Vasili Pascal

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

ノート:

これで、mysqlコンソールに次のようにアクセスできます。

$ mysql -P 8083 --protocol = tcp -u root -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を使用した完全な例です。

17
l3x

簡単な方法は、mysql unixソケットをホストマシンと共有することです。次に、ソケットを介して接続します

手順:

  • ホストマシンの共有フォルダーを作成します。例:mkdir /Host
  • ボリュームマウントオプションdocker run -it -v /Host:/shared <mysql image>でdockerコンテナーを実行します。
  • 次に、mysql構成ファイル/etc/my.cnfを変更し、ファイル内のソケットエントリをsocket=/shared/mysql.sockに変更します
  • DockerでMySQLサービスservice mysql restartを再起動します
  • 最後に、ソケットmysql -u root --socket=/Host/mysql.sockを介してホストからMySQL servverに接続します。パスワードに-pオプションを使用する場合
12
Jobin

docker-machineでdockerを実行している場合

iPを取得するために実行します:

docker-machine ip <machine>

マシンのIPを返し、mysqlに接続してみます:

mysql -h<docker-machine-ip>
6
Gerardo Rochín

これは、サーバーに対して一時的なdockerコンテナーを実行することで行うため、ホストに何がインストールされているかを心配する必要はありません。まず、必要なものを定義します(目的に合わせて変更する必要があります)。

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

私は常に、他のコンテナが必要とする新しいdockerネットワークを作成します。

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インターフェースを終了すると自動的に削除されますが、サーバーは実行を続けます。サーバーとホスト間でボリュームを共有して、データやスクリプトのインポートを簡単にすることもできます。お役に立てれば!

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

構成と一致するように、ユーザー、ポート、およびホストを忘れずに変更してください。データベースユーザーにパスワードが設定されている場合、-pフラグが必要です。

3
Hamfri

変換のために、ホストで~/.my.cnfファイルを作成できます。

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

次に、mysqlクライアントでmysqlを実行して接続を開きます。

1
Rod Terry