私の主な質問は、docker run --name db -e MYSQL_ROOT_PASSWORD=test -d -p 3306:3306 mariadb
コマンドを使用してmariadbのDockerコンテナーを作成した後、SQLデータベースにアクセスするにはどうすればよいですか?
一時的なコンテナ(終了後にコンテナが削除された)を使用したソリューションをどこかで見ましたが、もう見つかりません。
Sudo docker exec -it [other flags] [command] db
のようなコマンドを探しています。
MySQLコマンドラインクライアントからMariaDBに接続する次のコマンドは、別のmariadbコンテナーインスタンスを開始し、元のmariadbコンテナーに対してmysqlコマンドラインクライアントを実行します。これにより、データベースインスタンスに対してSQLステートメントを実行できます。
$ docker run -it --link some-mariadb:mysql --rm mariadb sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
... some-mariadbは、元のmariadbコンテナの名前です。
MySQLコマンドラインクライアントの詳細については、MySQLのドキュメントをご覧ください。
MySQLクライアントをホストにインストールし、
apt-get install mysql-client
次に、次のコマンドを使用してデータベースコンテナーにアクセスします。
mysql -u<user> -p<pass> -h $(docker inspect --format '{{ .NetworkSettings.IPAddress }}' <db-container>)
このコマンドは、DockerコンテナーのIPを自動的に取得します。
<user>
、<pass>
、<db-container>
は、それぞれの値に置き換えてください。あなたの場合:
mysql -uroot -ptest -h $(docker inspect --format '{{ .NetworkSettings.IPAddress }}' db)
コマンドを使用すると、mariadbを標準ポート3306で実行できます。そうでない場合は、mysqlコマンドに新しいポートを指定する必要があります。
わずかに異なる構文、ubuntu 18.04のdocker 18.05.0-ce:
Sudo docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' db
から 公式Mariadbウェブサイト :
LocalhostでMariaDBサーバーに接続しようとすると、クライアントはネットワークをバイパスし、ローカルファイルシステムのソケットファイルを使用してサーバーに接続しようとします。ただし、サーバーのファイルシステムがホストから分離されているため、MariaDBがコンテナー内で実行されている場合、これは機能しません。クライアントはコンテナ内のソケットファイルにアクセスできないため、接続に失敗します。
したがって、クライアントがサーバーコンテナーと同じマシンで実行されている場合でも、MariaDBサーバーへの接続はTCPを使用して行う必要があります。
公式のイメージを含むほとんどのMariaDBイメージでは、#my.cnf#ファイルのbind-addressオプションを使用して外部TCP接続が無効になっています。このガイドで使用されているdockerイメージはUbuntuに基づいています、したがって、ファイルは/etc/mysql/my.cnfにあります。
MariaDBを使用するには、構成ファイルを編集して適切なオプションを変更し、コンテナーを再起動する必要があります。
コンテナー内で、ファイルmy.cnfを編集し、bind-addressで始まる行を確認します。行の先頭にハッシュを入れてコメント化します。
#bind-address = 127.0.0.1
ファイルを保存します。
コンテナー内にいる間に、シャットダウンコマンドをMariaDBに送信します。これによりサーバーがシャットダウンされ、ホストに戻ります。
mysqladmin -u root -p shutdown
コンテナを再起動します。今回は、MariaDBサーバーでネットワークが有効になります。
docker start mariadbtest
コンテナに割り当てられているIPアドレスを見つけます。
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mariadbtest
これで、そのIPアドレスへのTCP接続を使用してMariaDBサーバーに接続できます。
上記のようにMariaDBでネットワーク接続を有効にすると、コンテナーの外部からサーバーに接続できるようになります。
ホストでクライアントを実行し、サーバーアドレス( "-h")を前の手順で見つけたコンテナーのIPアドレスに設定します。
mysql -h 172.17.0.2 -u root -p
この単純な形式の接続は、ほとんどの状況で機能します。構成によっては、サーバーのポートを指定するか、TCPモードを強制する必要があります。
mysql -h 172.17.0.2 -P 3306 --protocol=TCP -u root -p
別々のDockerコンテナーで実行されている複数のMariaDBサーバーは、TCPを使用して相互に接続できます。これは、Galeraクラスターの形成や複製に役立ちます。
Dockerを介してクラスターまたはレプリケーション設定を実行する場合、コンテナーで異なるポートを使用する必要があります。これを実現する最も速い方法は、コンテナーポートをシステム上の別のポートにマッピングすることです。これは、コンテナーを作成するときに(docker runコマンド)、必要に応じて-pオプションを数回使用して実行できます。たとえば、Galeraノードでは、次のようなマッピングを使用します。
-p 4306:3306 -p 5567:5567 -p 5444:5444 -p 5568:5568