4

私はdockerが初めてで、nodejs expressをその中で実行しようとしています。シェルスクリプトとその動作を使用して依存関係をインストールしようとしていますが、最終的にmysqlに接続できません。

私のdockerファイルはmysqlをインストールし、ユーザーとデータベースを作成し、nodejsもインストールします。次に npm install を実行し、アプリを起動しようとしますが、knex は次のメッセージで mysql に接続できないと言います:

Knex:Error Pool2 - Error: connect ECONNREFUSED /var/run/mysqld/mysqld.sock

これが私が使用しているコードの要点です。(重要な部分だけで、nodejs部分は不完全です):

https://gist.github.com/jradesenv/527f6e59ab2e7985c38fbed3a2084c83

これを解決またはデバッグする方法について、誰かが良い考えを持っていることを願っています。

4

3 に答える 3

4

ベスト プラクティスは、マイクロサービスのコンポーネントを独自のコンテナーに分離しておくことです。

たとえば、 Dave Kerrの「 Learn Docker by building a Microservice」を参照してください。

ここに画像の説明を入力

彼は 2 つのサービスを宣言しています。

version: '2'  
services:  
  users-service:
    build: ./users-service
    ports:
     - "8123:8123"
    depends_on:
     - db
    environment:
     - DATABASE_HOST=db
  db:
    build: ./test-database

データベース専用の Dockerfile を使用する場合:

FROM mysql:5

ENV MYSQL_ROOT_PASSWORD 123  
ENV MYSQL_DATABASE users  
ENV MYSQL_USER users_service  
ENV MYSQL_PASSWORD 123

ADD setup.sql /docker-entrypoint-initdb.d
于 2016-06-10T20:04:53.577 に答える
3

Docker コンテナーは、単一のコマンドを実行するように設計されています。mysql インストーラーは、登録したサービスが OS の起動時に自動的に開始されることを想定していますが、コンテナー内ではそうではありません。

適切な解決策は、これらを 2 つの別個のコンテナー (1 つの db コンテナーと別の nodejs/app コンテナー) に分割することです。ホスト名を自動的にセットアップする docker-compose 構成を使用して、2 つをリンクして一緒に実行します。

あまり理想的ではないオプションは、コンテナ内で複数のプロセスを実行および管理するために使用できるSupervisordです。他のアプリと同じようにインストールし、db と node アプリを、supervisord が管理する 2 つのサービスとして構成してから、コンテナーの実行コマンドとして Supervisord を起動します。

于 2016-06-10T20:04:37.917 に答える
1

docker-compose を使用して、nodejs 用と mysql 用の dockerfile を作成します。各コンテナは、それぞれのことを行う責任があります。コンポーズで、それらをリンクします。次に、nodejs db 接続を mysql コンテナーにポイントします。

于 2016-06-10T23:50:14.963 に答える