2

vagrant を使用してホストされている docker コンテナー内で単純なノード アプリを実行しようとすると、問題が発生します。

このページでは、基本的なアプローチについて説明しています: https://www.vagrantup.com/blog/feature-preview-vagrant-1-6-docker-dev-environments.html

私ができないことは、自分のマシンからノードアプリにアクセスすることです-理論的には、「hello world」スタイルのノード/エクスプレスアプリをlocalhost:8181...

以下は私がこれまでに持っているものです:

Vagrantfile:

Vagrant.configure("2") do |config|

  config.vm.provider "docker" do |d|

    d.build_dir = "."

    d.ports = ["8080:5000"]

    # Is this necessary if EXPOSE is used in Dockerfile?
    d.expose = ["5000"]

    d.remains_running = true

    d.volumes = ["/shared"]

  end

  config.vm.network "forwarded_port", guest: 8080, host: 8181

  config.vm.synced_folder "~/Documents/shared", "/shared"

end

Dockerfile:

# DOCKER-VERSION 0.8.0

FROM centos:6.4

RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm

RUN yum install -y npm ImageMagick

ADD . /app

# Not necessary because node_modules are bundled
# RUN cd /app; npm install

EXPOSE 5000

CMD ["node", "/app/index.js"]

ドキュメントをできる限り厳密にフォローしましたが、私が求めているものを達成できないようです。何か案は?

注:ノードアプリは、通常どおり実行されている場合、つまり次$ node indexの場所でアクセスされている場合に機能していますlocalhost:5000

前もって感謝します

編集:

index.js:

var express = require('express'),
    http = require('http');

var app = express();

var port = 5000;

app.get('/', function(req, res) {
    res.send('Hello World');
});

var server = http.createServer(app);

server.on('listening', function() {
    console.log('Express server listening on port ' + port);
});

server.listen(port, '0.0.0.0');

setInterval(function(){
    console.log('running');
}, 5000);

パッケージ.json:

{
  "name": "vagrant-docker-node",
  "version": "0.0.0",
  "dependencies": {
    "express": "^4.1.0"
  },
  "main": "index.js"
}
4

3 に答える 3

2

私は実際に同じ問題に遭遇しました。意図した動作なのかバグなのかforwarded_portはわかりませんが、Docker プロバイダーを使用して Vagrantfile を設定しても、ホストの boot2docker マシンでは何も起こりません。

何か不足していない限り、正しいポートを開く別の Vagrantfile を独自のホスト マシンに提供するか、Vagrant によって提供されたものを変更する必要があります。


アプローチ 1: 独自のホスト マシンを提供する (boot2docker に基づく)

boot2docker ホストのベース Vagrantfile は次のとおりです: boot2docker Vagrantfile。この Vagrantfile のコピーを編集し、ここで転送ポートを設定する必要があります。

次に、Docker アプリの Vagrantfile で、次のように変更します。

config.vm.provider "docker" do |d|
  # Specify here the path to the updated host Vagrantfile
  d.vagrant_vagrantfile = "../boot2docker/Vagrantfile"

  ... # edited out for clarity
end

更新されたホスト マシンを指定していることを確認してください。ここでは、上位レベルの共有ディレクトリに設定します。これは、このマシンを個別の Vagrantfile を使用して複数の Docker アプリ間で共有する場合は、同じホスト Vagrantfile を指す必要があるためです (そうしないと、新しいホスト VM をスピンアップしようとします)。 .


アプローチ 2: Vagrant のホスト マシンを更新する

にある Vagrant によって自動的に使用される Vagrantfile を更新することもできます%VAGRANT_HOME%/data/docker-host/Vagrantfile。ポートを開くようにファイルを変更します。

次にvagrant global-status、ホスト マシンの ID を取得し、vagrant reload machineIdマシンを再起動して、ポートの再オープンと更新をトリガーします。


これを行うためのより良い方法または認可された方法があるかどうかはわかりませんが、Docker コンテナーから物理マシンにポートを転送する唯一の方法です。

于 2014-05-20T09:50:36.137 に答える
0

Vagrant を使用して、公開されたポート 5000 を Docker からホストに転送するべきではありませんか?

    config.vm.network "forwarded_port"、ゲスト: 5000、ホスト: 8181

(たとえば、ホスト ブラウザーからポート 8181 でアプリにアクセスできるようにするため)

それ以外の:

config.vm.network "forwarded_port", guest: 8080, host: 8181



フロー/リダイレクトの概要:

Docker コンテナー Vagrant VM お使いのコンピューター
 :8080 => :5000 => :8181

于 2014-05-13T17:21:42.580 に答える
0
  1. ホスト OS (「vagrant」コマンドを実行する OS) は何ですか? Linux 以外 (OSX や Windows など) の場合、Docker コンテナーは Linux VM (通常は VirtualBox 内の TinyCore Linux) の上に乗っており、その VirtualBox 内から Docker コンテナーへのポート転送が行われます。
  2. 「netstat -tlpn」(Linux の場合) または「netstat -an」(OSX の場合) を使用してリッスンしている TCP ソケットを探すと、ポート転送が有効になっている証拠が表示されます。
于 2014-12-13T02:43:58.040 に答える