1. ホーム
  2. docker

[解決済み] 他のコンテナからDockerコンテナにアクセスする

2022-05-11 04:45:09

質問

2つの異なるイメージに基づいて2つのdockerコンテナを作成しました。ひとつはデータベース、もうひとつはウェブサーバーです。両方のコンテナは私の mac osx 上で実行されています。

私はホストマシンからdbコンテナにアクセスすることができ、同じようにホストマシンからwebserverにアクセスすることができます。

しかし、Web サーバから db 接続にアクセスするにはどうしたらよいでしょうか。

dbコンテナを起動する方法は

docker run --name oracle-db -p 1521:1521 -p 5501:5500 oracle/database:12.1.0.2-ee

として、wlsコンテナを起動しました。

docker run --name oracle-wls -p 7001:7001 wls-image:latest

に接続することで、ホスト上のDBにアクセスすることができます。

sqlplus scott/welcome1@//localhost:1521/ORCLCDB

ホスト上のwlsに以下のようにアクセスできます。

http://localhost:7001/console

どのように解決するのですか?

最も簡単な方法は --link を使うことですが、新しいバージョンの docker はこの方法から離れつつあり、実際、このスイッチはまもなく削除される予定です。

以下のリンクは、2つのコンテナを接続するための素晴らしい方法を提供しています。アタッチ部分は読み飛ばしてもかまいません。

https://web.archive.org/web/20160310072132/https://deis.com/blog/2016/connecting-docker-containers-1/

興味のある部分は、2つのコンテナ間の通信です。一番簡単な方法は、ウェブサーバコンテナから名前でDBコンテナを参照することです。

例を挙げます。

db コンテナの名前を db1 と名付け、ウェブサーバコンテナ web0 . コンテナは両方ともブリッジネットワーク上にあるべきです。つまり、ウェブコンテナはDBコンテナの名前を参照することで接続できるはずです。

つまり、アプリのWeb設定ファイルがある場合、DBホストには、名前 db1 .

もし古いバージョンのdockerを使用している場合は、-linkを使用する必要があります。

例を挙げます。

ステップ1. docker run --name db1 oracle/database:12.1.0.2-ee

であれば、Webアプリを起動するときに 使います。

ステップ2 docker run --name web0 --link db1 webapp/webapp:3.0

と入力すると、WebアプリがDBにリンクされます。しかし、私が言ったように、-link スイッチはすぐに削除されるでしょう。

代わりにdocker composeを使うと、ネットワークを構築してくれます。しかし、あなたのシステム用に docker compose をダウンロードする必要があります。 https://docs.docker.com/compose/install/#prerequisites

の設定例はこのようなものです。

ファイル名は base.yml

version: "2"
services:
  webserver:
    image: moodlehq/moodle-php-apache:7.1
    depends_on:
      - db
    volumes:
      - "/var/www/html:/var/www/html"
      - "/home/some_user/web/apache2_faildumps.conf:/etc/apache2/conf-enabled/apache2_faildumps.conf"
    environment:
      MOODLE_DOCKER_DBTYPE: pgsql
      MOODLE_DOCKER_DBNAME: moodle
      MOODLE_DOCKER_DBUSER: moodle
      MOODLE_DOCKER_DBPASS: "m@0dl3ing"
      HTTP_PROXY: "${HTTP_PROXY}"
      HTTPS_PROXY: "${HTTPS_PROXY}"
      NO_PROXY: "${NO_PROXY}"
  db:
    image: postgres:9
    environment:
      POSTGRES_USER: moodle
      POSTGRES_PASSWORD: "m@0dl3ing"
      POSTGRES_DB: moodle
      HTTP_PROXY: "${HTTP_PROXY}"
      HTTPS_PROXY: "${HTTPS_PROXY}"
      NO_PROXY: "${NO_PROXY}"

これはネットワークに一般的な名前を付けます。この名前が何であるかは、--name スイッチを使用しない限り、私の頭の中から思い出すことはできません。

IE docker-compose --name setup1 up base.yml

注意: --name スイッチを使用した場合、docker compose を呼び出す際には必ずこのスイッチを使用する必要があります。 docker-compose --name setup1 down これは、ウェブサーバとデータベースについて複数のインスタンスを持つことができるようにするためで、この場合、docker composeはコマンドを実行したいインスタンスを認識します。CI/CDで、同じサーバーでテストを並行して行う場合に最適です。

Docker composeはdockerと同じコマンドも持っています。 docker-compose --name setup1 exec webserver do_some_command

一番良いのは、ユニットテスト用にDBを変更したい場合、upコマンドに.ymlファイルを追加しておけば、似た名前の項目があれば上書きしてくれるので、key=>valueの置き換えのように考えています。

例です。

db.yml

version: "2"
services:
  webserver:
    environment:
      MOODLE_DOCKER_DBTYPE: oci
      MOODLE_DOCKER_DBNAME: XE
  db:
    image: moodlehq/moodle-db-oracle

次に docker-compose --name setup1 up base.yml db.yml

これで、db.は別の設定で上書きされます。各コンテナからこれらのサービスに接続する必要がある場合、serviceで設定した名前、この場合はwebserverとdb.を使用します。

あなたの場合、この方が実際に便利な設定かもしれませんね。yml ファイルで必要な変数をすべて設定し、起動が必要なときに docker compose のコマンドを実行するだけでよいからです。

このセットアップは、より便利だと思います。

注意: 私は --port なぜなら、ポートを公開することは、コンテナ->コンテナ間の通信には必要ないからです。ホストの外からコンテナ、またはアプリケーションに接続したい場合にのみ必要です。ポートを公開すると、そのホストが許可するすべての通信に対してポートが開放されます。つまり、ポート80でウェブを公開することは、物理ホスト上でウェブサーバーを起動することと同じであり、ホストが許可していれば外部からの接続を許可することになる。また、何らかの理由で複数のウェブアプリを同時に実行したい場合、80番ポートを公開すると、そのポートで公開しようとした場合、他のウェブアプリを実行できなくなる。また、Docker Composeで--nameスイッチを指定すると、すべてのコンテナが独自のネットワーク上に配置されるため、衝突することはありません。つまり、コンテナの中のコンテナを作るようなものです。

UPDATE: 機能をさらに使い、JenkinsのようなCICDプログラムのために他の人がどのようにそれを行ったかを見た後。ネットワークも有効な解決策です。

例です。

docker network create test_network

上記のコマンドは、他のコンテナをアタッチすることができる "test_network" を作成します。これは --network スイッチ演算子で簡単にできます。

の例です。

docker run \
    --detach \
    --name db1 \
    --network test_network \
    -e MYSQL_ROOT_PASSWORD="${DBPASS}" \
    -e MYSQL_DATABASE="${DBNAME}" \
    -e MYSQL_USER="${DBUSER}" \
    -e MYSQL_PASSWORD="${DBPASS}" \
    --tmpfs /var/lib/mysql:rw \
    mysql:5

もちろん、プロキシのネットワーク設定がある場合でも、"-e" または "--env-file" スイッチステートメントを使ってコンテナにそれらを渡す必要があります。そうすれば、コンテナはインターネットと通信することができます。Dockerでは、新しいバージョンのDockerではプロキシ設定はコンテナに吸収されるはずだと言っていますが、私は習慣的にプロキシ設定を渡しています。これは、なくなりつつある"-link"スイッチの代わりとなるものです。コンテナが作成したネットワークに接続されると、コンテナの「名前」を使って他のコンテナからそのコンテナを参照することができます。上記の例では、次のようになります。 db1 . すべてのコンテナが同じネットワークに接続されていることを確認すれば、それで完了です。

cicdパイプラインでネットワークを使用する詳しい例は、こちらのリンクを参照してください。 https://git.in.moodle.com/integration/nightlyscripts/blob/master/runner/master/run.sh

これは、Moodleの巨大な統合テストのためにJenkinsで実行されるスクリプトですが、アイデア/サンプルはどこでも使用することができます。これが他の人の助けになることを願っています。