2016-05-12 4 views
-1

とデータベースのアドレスを取得しますdocker-compose.ymlと次のようにドッキングウィンドウを-構成:Wordpressのを設定する場合(手動でnginxのルートディレクトリにダウンロードした) 私が使用ドッカー

web_db: 
    image: mariadb:latest 
    restart: always 
    volumes: 
    - ./var/mysql:/var/lib/mysql 
    environment: 
    MYSQL_ROOT_PASSWORD: X 
    MYSQL_DATABASE: wordpress 
    MYSQL_USER: wordpress 
    MYSQL_PASSWORD: X 
    MYSQL_ROOT_PASSWORD: X 

web_front: 
    image: nginx 
    restart: always 
    ports: 
    - 80:80 
    links: 
    - web_fpm 
    volumes: 
    - ./www:/var/www/html:rw 
    - ./etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro 

web_fpm: 
    build: ./PHP-FPM/ 
    restart: always 
    links: 
    - web_db:mysql 
    volumes: 
    - ./www:/var/www/html 

、私はデータベースのアドレスを求めています。私は localhostを試しましたが、動作しません。

PS:Docker用のWordpress画像がありますが、完全なスタック(nginx + PHP)を持っていて、好きではないので、提案しないでください。 ;)

答えて

0

編集:あなたはポート3306と一緒にホストマシンのIPを入れたいと思うでしょう。

Dockerでコンテナを起動すると、Dockerから割り当てられたIPを使用して起動されます。これらはすべて、docker0ブリッジネットワークを介してドッカーにアクセスできます。 Dockerは、ホストマシン上のdocker0 NICとホストマシンeth0/1をブリッジすることによって、それらをホストマシンにアクセス可能にします。

経由でポートEXPOSEを明示的に使用すると、DockerはそのポートをホストIPTablesで開き、ローカルネットワーク上でアクセスできるようにします。ポートを明示的に開かずにコンテナ内に公開されている場合(ドッカーファイルではDockerファイルにMySQLの場合はEXPOSE 3306と表示されます)、コンテナはマシンでのみ使用できます。

Dockerコンテナで作業する場合は、これを知っておくことが重要です.Docker-composeでlinkを実行すると、別のコンテナがローカルドッカーネットワーク上にあるコンテナにしか伝えられないためです。これは、コンテナが起動し、依存するコンテナを探している場合にのみ役立ちます。要約すると、コンテナが開始されると、Docker IPで開始されます。はDockerによってのみ使用され、docker0経由でホストマシンにブリッジされます。これが重要です。 DockerはこれらのIPを隔離し、ローカルネットワーク経由でアクセスするためにマシン上のポートを開くよう強制します。

質問に戻ると、ホストIPとポート3306を渡す必要がある理由
ネットワーク上でリクエストを行うため、これを行う必要があります。 localhostに入れた場合、コンテナが実際には実行されていないため、が実行されています。172.17.42.xというアドレスで実行されているため、WordPressにはlocalhostというメッセージが表示されます。ただし、ホストマシンはdocker0にブリッジされているため、ホストマシンIPではオンになっています。これが、ホストマシンのIPに与える必要がある理由です。ネットワークは172.17アドレスを解決することができないのは、Dockerに固有のもので、そのマシンのコンテナ固有のものですからです。これはDockerのネットワークにとって非常に基本的なことであり、理解することが重要です。詳細については、this articleを参照してください。リンクされたサービスのための

+0

私のiptablesを実行し、IPを手動で入力するように取得したい場合は、非常に制限されているので、私は外部IPを使用しないようにしたいと思います。そして、私はそれがそれを行う適切な方法であるかどうかはわかりません。 –

+0

私はdocker0とDockerネットワーキングで起こっていることをよりよく説明するために私の答えをさらに明確にしました。また、はい、これはそれを行う適切な方法です、私は経験から話すことができます。私は現在、プロダクション環境で90以上のコンテナを実行しています。あなたはこれらのコンテナをインターネットや外部に公開していません。ドッカーが何をしているのかを理解するためにこのビデオを見たいかもしれません:https://www.youtube.com/watch?v=UV3cw4QLJLs –

+0

私は 'external-IP :3306'であるが、タイムアウトエラーが出る(504ゲートウェイタイムアウト) –

0

お試しください] web_db 'の代わりにlocalhostの

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

コンテナは、別名、または別名が指定されていない場合は、サービス名と同じホスト名で到達可能になります。

+0

動作しません。 'web_web_db_1'(' docker ps -a'で与えられた名前)、 ':3306'(' ps -a'で指定されたポート)を追加しましたが、チャンスはありません。 'docker-compose.yml'の' web_front'に 'web_db:mysql'へのリンクを追加しましたが、チャンスはありません。 –

+0

*あなたがウェブサーバのためにポート80をしたように*あなたがホストマシンで3306を公開する必要があるため、動作しません。それ以外の場合、3306へのすべてのリクエストは、マシンのファイアウォールとiptablesによってブロックされます。 –

0

mysqlを参照する必要があります。作成ファイルで、コンテナをweb_dbコンテナにリンクしていて、「mysql」という別名を与えているからです。 web_fpmコンテナには、web_dbコンテナを指すmysqlのホストファイルにレコードがあります。また

、あなただけのただdocker inspect <web_db_container_id>

+0

どうすればいいですか? –

+0

あなたのweb-fpmコンテナ内にhttp:// mysql(スペースを除いたもの)がweb_dbコンテナのipにマップされているため、データベースのアドレスを尋ねるときにmysqlを入力してください。 – ExoticChimp

+0

動作しません。 :/ –

関連する問題