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

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

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

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

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

MySQL

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

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

Docker

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

Q&A

2回答

591閲覧

Dockerを用いたコンテナ間通信

yakult1995

総合スコア20

docker-compose

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

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

MySQL

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

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

Docker

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

0グッド

0クリップ

投稿2018/04/24 06:59

編集2022/01/12 10:55

Dockerコンテナ上でDBサーバのアドレスが解決出来ない

1つのサーバ上でweb,dbコンテナの2つを動かしているのですが
webコンテナからdbに接続出来ません

webコンテナに接続してhostsを参照してもdbコンテナが記入されてないです

docker

1version: '2' 2services: 3 web: 4 build: 5 context: ./ 6 volumes: 7 - ../app:/app/ 8 ports: 9 - 8888:8888 10 container_name: web_server 11 12 mysql: 13 image: mysql 14 volumes: 15 - /home/ubuntu/db:/var/lib/mysql 16 ports: 17 - 3306:3306 18 container_name: mysql_server 19 environment: 20 MYSQL_ROOT_PASSWORD: '*****'

また、この状態でFlask上でSQLAlchemyを実行すると

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1045, "Access denied for user 'root'@'172.18.0.3' (using password: NO)") (Background on this error at: http://sqlalche.me/e/e3q8)

となる
SQLAlchemyにはDBユーザ名、パスワード、ホスト名(mysql_server),DB名を指定しています
ちなみに上の172.18.0.3はwebコンテナのIPであり、なぜかlocalhostのDBに接続しようとしています

ちなみにwebコンテナのDockerfileは以下

from python:3.6 RUN apt-get update RUN apt-get install -y nginx # flask RUN pip install flask uwsgi line-bot-sdk requests sqlalchemy pymysql # nginx COPY default /etc/nginx/conf.d/bot.conf RUN rm /etc/nginx/sites-available/default RUN rm /etc/nginx/sites-enabled/default # その他設定 COPY start.sh / COPY uwsgi.ini / CMD ["sh", "/start.sh"]

またwebコンテナはmyslqの公式イメージ使用しています

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

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

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

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

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

xenbeat

2018/04/24 14:41

問題を切り分けていかないと即解決は難しそうです。SQLAlchemyに設定している接続情報を追記ください。あと、そもそもコンテナ間通信の前に、mysqlコンテナの中で、その接続情報にて接続できることは確認されてますでしょうか?
guest

回答2

0

docker-compose depends_onとlinksの違い - Qiita

上記の記事のようにdepends_onかlinksのどちらかを使って
webはmysqlコンテナに依存していますよと宣言するのが一般的な解決方法です。
これでwebコンテナ内のetc/hosts内にmysqlが作られ、ホスト名mysqlで接続出来るようになります。

mysqlコンテナのports設定はホストマシンとコンテナのポートの紐付けです。
従ってlinksやdepends_onとセットで使って接続する場合はmysqlコンテナのposts設定は必要ありません。
ports設定した場合、expose設定もセットでしないと接続受け付けてくれなかったかもしれません。

もしdepends_onやlinksで繋いだはずなのにまだ接続できなかった場合はexpose設定も疑ってみてください。

投稿2018/04/24 07:13

miyabi-sun

総合スコア21158

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

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

yakult1995

2018/04/24 07:19

早速の回答ありがとうございます 下記の用にweb側にlinksでmysqlを設定して見たのですが ``` version: '2' services: web: build: context: ./ volumes: - ../app:/app/ ports: - 8888:8888 links: - mysql container_name: web_server mysql: image: mysql volumes: - /home/ubuntu/fm-list-share/db:/var/lib/mysql container_name: mysql_server environment: MYSQL_ROOT_PASSWORD: '***' ``` 相変わらずwebコンテナ側の/etc/hostsには ``` 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.18.0.3 ab8afa2555cc ``` DBのコンテナが反映されていませんでした
miyabi-sun

2018/04/24 07:20

etc/hostsファイルの書き換えはコンテナを新規作成した時に行われますので、 このようなコマンドの流れで一度コンテナを完全削除した後に起動しなおしてみてください。 docker-compose stop docker-compose rm -f docker-compose up -d
yakult1995

2018/04/24 07:25

docker-compose stop docker-compose rm -f docker-compose up -d docker-compose down docker-compose up -d のどちらのコマンドで再起動しても変化ありませんでした
guest

0

web の中にdepends_onを追加し、mysqlと明示的に繋がった構成にしたら良いのではと思います。

yaml

1version: '2' 2services: 3 web: 4 build: 5 context: ./ 6 volumes: 7 - ../app:/app/ 8 ports: 9 - 8888:8888 10 container_name: web_server 11 depends_on: # ここを追加 12 - mysql 13 14 mysql: 15 image: mysql 16 volumes: 17 - /home/ubuntu/db:/var/lib/mysql 18 ports: 19 - 3306:3306 20 container_name: mysql_server 21 environment: 22 MYSQL_ROOT_PASSWORD: '*****'

Dockerの仮想ネットワークは詳しく把握していませんので解説はできません。ご容赦ください。

投稿2018/04/24 07:21

manzyun

総合スコア2244

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

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

manzyun

2018/04/24 07:29

ご指摘ありがとうございます。 確かにlinksの方がお手軽だと思っていたのですが、リファレンスを斜め読みしたら --link フラグは無くす予定の様子でしたので、deponds_onで提案させていただきました。 https://docs.docker.com/compose/compose-file/#links
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問