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

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

ただいまの
回答率

90.50%

  • MySQL

    5859questions

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

  • Docker

    713questions

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

  • Flask

    211questions

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

  • docker-compose

    127questions

  • SQLAlchemy

    43questions

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

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

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 542

yakult1995

score 8

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

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

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

version: '2'
services:
  web:
    build:
      context: ./
    volumes:
      - ../app:/app/
    ports:
      - 8888:8888
    container_name: web_server

  mysql:
    image: mysql
    volumes:
      - /home/ubuntu/db:/var/lib/mysql
    ports:
      - 3306:3306
    container_name: mysql_server
    environment:
      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の公式イメージ使用しています

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • xenbeat

    2018/04/24 23:41

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

    キャンセル

回答 2

+1

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 16: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のコンテナが反映されていませんでした

    キャンセル

  • 2018/04/24 16:20

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

    docker-compose stop
    docker-compose rm -f
    docker-compose up -d

    キャンセル

  • 2018/04/24 16:25

    docker-compose stop
    docker-compose rm -f
    docker-compose up -d

    docker-compose down
    docker-compose up -d

    のどちらのコマンドで再起動しても変化ありませんでした

    キャンセル

+1

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

version: '2'
services:
  web:
    build:
      context: ./
    volumes:
      - ../app:/app/
    ports:
      - 8888:8888
    container_name: web_server
    depends_on: # ここを追加
      - mysql

  mysql:
    image: mysql
    volumes:
      - /home/ubuntu/db:/var/lib/mysql
    ports:
      - 3306:3306
    container_name: mysql_server
    environment:
      MYSQL_ROOT_PASSWORD: '*****'

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/24 16:25

    depends_onはnetworksも書かないと動かない罠があった気がします。
    もしエラーが出て怒られたら下記の記事に出てくるdocker-compose.ymlを参考にnetworksの設定を足してみてください。
    https://qiita.com/mom0tomo/items/7e611ac829863d4c5c82

    キャンセル

  • 2018/04/24 16:29

    ご指摘ありがとうございます。

    確かにlinksの方がお手軽だと思っていたのですが、リファレンスを斜め読みしたら --link フラグは無くす予定の様子でしたので、deponds_onで提案させていただきました。

    https://docs.docker.com/compose/compose-file/#links

    キャンセル

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • MySQL

    5859questions

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

  • Docker

    713questions

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

  • Flask

    211questions

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

  • docker-compose

    127questions

  • SQLAlchemy

    43questions

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