質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

2回答

3279閲覧

Dockerコンテナ間通信 Dockerコンテナから別のコンテナのmysqlデータベースに接続したい

Kchan_01

総合スコア110

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2022/03/21 12:50

編集2022/03/22 07:16

docker-composeを使ってコンテナオーケストレーションを学んでいます。

以下のフォルダ構成で、appコンテナから、dbコンテナのmariadbにアクセスしたいのですが、エラーが出てうまくいきません。

ディレクトリ構成

. ├── app │ └── Dockerfile ├── db │ └── Dockerfile └── docker-compose.yml

コード

app/Dockerfile

1FROM debian:buster 2 3RUN set -x \ 4 && apt-get update \ 5 && apt-get install --no-install-recommends --no-install-suggests -y \ 6 mariadb-client \ 7 vim 8 9CMD [ "tail", "-f" ]

db/Dockerfile

1FROM debian:buster 2 3RUN set -x \ 4 && apt-get update \ 5 && apt-get install --no-install-recommends --no-install-suggests -y \ 6 mariadb-server \ 7 mariadb-client \ 8 vim 9 10CMD service mysql start \ 11 && tail -f /dev/null

docker

1version: "3.9" 2 3services: 4 app: 5 build: ./app 6 networks: 7 - frontend 8 9 db: 10 build: ./db 11 expose: 12 - 3306 13 networks: 14 - frontend 15 16networks: 17 frontend: 18 driver: bridge 19 20volumes: 21 db_data: {}

実行コマンド

appコンテナに入って、以下のコマンドを実行しましたが、エラーが出ます。

sh

1root@0e0ad0889639:/# mysql -h db -uroot 2ERROR 2002 (HY000): Can't connect to MySQL server on 'db' (115) 3 4## 接続は出来ているようです。 5root@0e0ad0889639:/# ping db 6PING db (192.168.128.3) 56(84) bytes of data. 764 bytes from test_db_1.test_frontend (192.168.128.3): icmp_seq=1 ttl=64 time=0.104 ms 864 bytes from test_db_1.test_frontend (192.168.128.3): icmp_seq=2 ttl=64 time=0.142 ms

コンテナが接続できない理由を教えて頂きたいです。よろしくお願いします。

試したこと

dbコンテナ側

dbコンテナは初期設定等は行っていないです。
dbのコンテナでmariadbを立ち上げる事はできます。

root@9d3b519e464f:/# service --status-all [ ? ] hwclock.sh [ + ] mysql [ - ] rsync
MariaDB [mysql]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | +--------------------+ 3 rows in set (0.001 sec) MariaDB [mysql]> SELECT User,Host FROM mysql.user; +------+-----------+ | User | Host | +------+-----------+ | root | localhost | +------+-----------+

appのコンテナ側

コンテナ名を返るとエラーが変わるので、通信自体は出来ていそうです。

root@69ccb34f8a30:/# mariadb -u root -h db ERROR 2002 (HY000): Can't connect to MySQL server on 'db' (115) root@69ccb34f8a30:/# mariadb -u root -h aa ERROR 2005 (HY000): Unknown MySQL server host 'aa' (-2)

環境

sh

1❯ docker -v 2Docker version 20.10.12, build e91ed57 3❯ sw_vers 4ProductName: macOS 5ProductVersion: 12.3 6BuildVersion: 21E230

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

mariadbのconfigファイルの設定が、外部ホストを受け入れないようになっていたことが原因でした。

etc/mysql/mariadb.conf.d/50-server.cnfにbind-address = appを設定し、

データベースの設定ですべてのホストを受け入れるように設定しました。

USE mysql; GRANT ALL ON *.* TO 'root'@'%' identified by 'pass' WITH GRANT OPTION ; GRANT ALL ON *.* TO 'root'@'localhost' identified by 'pass' WITH GRANT OPTION ; FLUSH PRIVILEGES ;

これでつながるようになりました。

投稿2022/03/22 08:25

Kchan_01

総合スコア110

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

新しくネットワークを作成している様子ですが、もともとdocker composeで立ち上げるとbridgeのネットワークが作成された記憶です。
なので、新しくネットワークを作成しなくてもできそうな気はします。

yml

1# docker-compose.yml 2version: "3.9" 3 4services: 5 app: 6 build: ./app 7 8 db: 9 build: ./db 10 volumes: 11 - db_data:/var/lib/mysql 12 expose: 13 - 3306 14 15volumes: 16 db_data: {}

専用にネットワークを作成したいのであれば、デフォルトで専用のネットワークができる(XXX_defaultのネットワークが作成される)ので気にしなくてもよいと思います。

雑で申し訳ないですが、以下のdocker-compose.ymlはappからdbコンテナへアクセスできます。

yml

1# docker-compose.yml 2version: '3' 3services: 4 db: 5 image: mysql:5.7.26 6 command: mysqld --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci 7 environment: 8 MYSQL_ROOT_PASSWORD: pass0 9 MYSQL_USER: user 10 MYSQL_PASSWORD: pass0 11 MYSQL_ALLOW_EMPTY_PASSWORD: "yes" 12 expose: 13 - '3306' 14 app: 15 image: mysql:5.7.26 16 command: mysqld --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci 17 environment: 18 MYSQL_ROOT_PASSWORD: pass1 19 MYSQL_USER: user 20 MYSQL_PASSWORD: pass1 21 MYSQL_ALLOW_EMPTY_PASSWORD: "yes"

特にネットワークの作成も、linkなども使用していません。

気になる点としては、そもそもdbコンテナのmariadbは立ち上がってますか?
dbコンテナに入ってみてmysql -uでもいいですしプロセスとか確認してみてください。

以下は話半分で見てもらえればいいですが、なんか、dbのdockerfileのservice mysql startが怪しいです。
多分mariadbが動かなくても、SysVinit(serviceコマンド)のコマンド自体は成功し(mariadbの起動に失敗したことを正常に返す)、そのままtail -f /dev/nullが実行されているような気がします。
一番いいのはSysVinit経由(serviceとかsystemctlとか)で動かすよりも直接mariadbのプロセスのみを起動するのがいいと思います。
mariadbの場合、公式imageがあるのでそれをとってくるのも手かと思います。

投稿2022/03/22 06:01

YuuT

総合スコア673

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kchan_01

2022/03/22 08:26

回答ありがとうございます。mariadbのconfigファイルの設定がデフォルトのままだとダメだったようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問