[解決済み] 他のコンテナからDockerコンテナにアクセスする
質問
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つのコンテナを接続するための素晴らしい方法を提供しています。アタッチ部分は読み飛ばしてもかまいません。
興味のある部分は、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で実行されるスクリプトですが、アイデア/サンプルはどこでも使用することができます。これが他の人の助けになることを願っています。
関連
-
docker use error: input device is not a TTY
-
[解決済み] Dockerコンテナの中から、マシンのローカルホストに接続するにはどうすればよいですか?
-
[解決済み] Docker Dockerコンテナからホストへのファイルコピー
-
[解決済み] ホストからDockerコンテナにファイルをコピーする方法は?
-
[解決済み] リポジトリを使用せずに、あるホストから別のホストにDockerイメージをコピーする方法
-
[解決済み] ホストからDockerコンテナのIPアドレスを取得する方法
-
[解決済み] Dockerでデータベースなどの永続的なストレージを扱う方法
-
[解決済み] 既に起動しているDockerコンテナに新しいTTYで入る方法
-
[解決済み】Dockerは仮想マシンとどう違うの?
-
[解決済み】Dockerコンテナからホストポートにアクセスする方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Docker Unknown フラグ --mount
-
[解決済み] docker ERROR: 不明なブロブ
-
Dockerコンテナ共通のトラブルシューティングと対処法
-
docker-composeの使い方ガイド
-
docker コマンドで例外 permissions denied が発生しました。
-
Docker pullでマニフェスト不明エラーが発生する
-
DockerRegistryV2 イメージの削除
-
[解決済み] Dockerコンテナの中から、マシンのローカルホストに接続するにはどうすればよいですか?
-
[解決済み] 複数のdocker-composeプロジェクト間の通信
-
[解決済み】Dockerコンテナからホストポートにアクセスする方法