(おそらく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)
さらに詳細
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
ノート:
これで、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を使用した完全な例です。
簡単な方法は、mysql unixソケットをホストマシンと共有することです。次に、ソケットを介して接続します
手順:
mkdir /Host
docker run -it -v /Host:/shared <mysql image>
でdockerコンテナーを実行します。/etc/my.cnf
を変更し、ファイル内のソケットエントリをsocket=/shared/mysql.sock
に変更しますservice mysql restart
を再起動しますmysql -u root --socket=/Host/mysql.sock
を介してホストからMySQL servverに接続します。パスワードに-pオプションを使用する場合docker-machineでdockerを実行している場合
iPを取得するために実行します:
docker-machine ip <machine>
マシンのIPを返し、mysqlに接続してみます:
mysql -h<docker-machine-ip>
これは、サーバーに対して一時的な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インターフェースを終了すると自動的に削除されますが、サーバーは実行を続けます。サーバーとホスト間でボリュームを共有して、データやスクリプトのインポートを簡単にすることもできます。お役に立てれば!
mysql -u root -P 4406 -h localhost --protocol=tcp -p
構成と一致するように、ユーザー、ポート、およびホストを忘れずに変更してください。データベースユーザーにパスワードが設定されている場合、-pフラグが必要です。
変換のために、ホストで~/.my.cnf
ファイルを作成できます。
[Mysql]
user=root
password=yourpass
Host=127.0.0.1
port=3306
次に、mysqlクライアントでmysql
を実行して接続を開きます。