0

ブリッジ ネットワークの下で 3 つのサービス (db、nginx、および Web サービス) をリンクし、ローカルホストまたはコンテナー内からさまざまなサービスを調べて、Web サービス用の対話型ターミナルを用意したいと考えています。どうすればこれを達成できますか?

私の docker-compose 構成は次のとおりです。

version: '2'
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile-alpine
    command: /bin/bash
    ports:
      - "5000:5000"
    volumes:
      - $REPO_DIR:/repository
    links:
      - db
      - nginx
  nginx:
    image: nginx:stable-alpine
    ports:
      - "8080:8080"
    volumes:
      - $NGINX_STATIC_DIR:/var/www/static
      - $NGINX_CONFIG_FILE:/etc/nginx/nginx.conf
  db:
    image: mysql/mysql-server
    ports:
      - "3307:3306"
    environment:
      MYSQL_USER: $MYSQL_USER
      MYSQL_PASSWORD: $MYSQL_PASSWORD
      MYSQL_DATABASE: $MYSQL_DATABASE
      MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD
    volumes:
      - $DB_DATA_DIR:/var/lib/mysql
      - $DB_LOG_DIR:/var/log/mysql

ここで、Web サービスは をmhart/alpine-node:6.7.0ベースとして使用し、さらにいくつかのユーティリティと Python3.5 および Flask を追加します。

実行docker-compose run webすると、インタラクティブ ターミナルにアクセスできますが、db および nginx サービスが適切に起動/リンクされません。次の出力が得られます。

Starting courseadmin_nginx_1
Starting courseadmin_db_1
bash-4.3#

そして、コンテナ内からのさらなるネットワーク フォレンジックにより、nginx も db も存在しないことが判明しました。docker-compose upホストシステムにmysqlがインストールされていることを認められたdbサービスのポート競合が実際に作成されたため、この主張をさらにサポートできdocker-compose runます.

一方、試してみるとdocker-compose up、はるかにアクティブなトレースが得られますが、インタラクティブなターミナルは得られません:

Starting courseadmin_nginx_1
Recreating courseadmin_db_1
Recreating courseadmin_web_1
Attaching to courseadmin_nginx_1, courseadmin_db_1, courseadmin_web_1
db_1     | Initializing database
courseadmin_web_1 exited with code 0
db_1     | Database initialized
db_1     | MySQL init process in progress...
db_1     | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
db_1     | Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
db_1     | mysql: [Warning] Using a password on the command line interface can be insecure.
db_1     | mysql: [Warning] Using a password on the command line interface can be insecure.
db_1     | mysql: [Warning] Using a password on the command line interface can be insecure.
db_1     | mysql: [Warning] Using a password on the command line interface can be insecure.
db_1     | 
db_1     | /entrypoint.sh: ignoring /docker-entrypoint-initdb.d/*
db_1     | 
db_1     | 
db_1     | MySQL init process done. Ready for start up.
db_1     | 

対話型ターミナルと 3 つのコンテナーの適切なリンクを実現するにはどうすればよいですか?

4

1 に答える 1

2

私はあなたの質問を完全に理解しているかどうか完全には確信が持てないので、私ができる部分に答えようとします:

一見すると、ファイルは問題ないように見えます。コマンドdocker-compose.ymlを正しく実行すると、これが確認されたように見えます。docker-compose upただし、指定しますversion: '2'docker-composeドキュメントによると、バージョン 2 以降、リンクは暗黙的にそれ自体で行われますdocker-compose(十分な評判がないため、コメントにリンクを追加します)。これは、その部分を削除できることを意味しますlinks:(これらのエイリアスを明示的に指定しようとしない限り、その場合はこの部分を無視できます)。V1 と V2 の違いを説明する優れたリソースはこれだと思いましたが(彼はlinks投稿のステップ 2 で説明しています)、もちろんdocker-compose docs.

残りについては、私の提案:

  • docker-compose up -dすべてを分離モードで実行します。Docker Compose は、正しく構成されている限り、暗黙的なリンクを処理します。を使用したコンテナ間ネットワークの詳細についてはdocker-composeこれが私にとって素晴らしいリソースでした。実際の内容docker-composeは、そのページのセクション 3.3 から始まります。
  • すべてが起動して実行されるとdocker ps -a、アクティブなコンテナが表示されます
  • 「対話型端末」を起動するには、docker exec -it $container_id bash正しく思い出せば実行してください。これにより、そのコンテナでターミナルが起動します。exec指定されたコンテナーでコマンドを実行します。iフラグは「対話型」端末を起動し、tフラグは TTY レイヤーとbashシェルの種類を指定します。

追加の推奨事項を追加できる場合は、構成にdepends_on:クラスを追加してくださいweb。これにより、Web コンテナーが SQL と Nginx の両方が完全に開始されるまで待機します。そのようです:

services:
  web:
    [...]
    depends_on:
      - nginx
      - db
于 2016-10-08T19:37:05.633 に答える