CLIからコンテナーを起動し、それらのポートをマップすることができます。 ただし、リモートAPIでは同じことは不可能のようです。 どちらの場合も、Mac OS ElCapitanでdocker-machineを使用しています。
テストケースを最小限に簡略化しました。これは、単一のパッケージnetcat-openbsd、apt-getがインストールされた(そしてnc
として実行される)標準のubuntuイメージに基づいています。
各テストの前に、私は実行します
eval $(docker-machine env default); docker stop $(docker ps -a -q); docker rm $(docker ps -a -q)
...以前のすべてのコンテナを停止して削除します。
次のCLIは、アドレス指定可能なサービスを正常に起動します...
docker run -it --rm -p 3000:3000 ubuntu-nc /bin/bash -c 'echo "Working" | nc -l 3000'
次のコマンドを実行することで、Dockerコンテナの外部(docker-machineによってVMに割り当てられたIP)から適切にマップされたポートでサービスにアクセスできることを証明できます...
$ nc 192.168.99.100 3000
Working
Dockerode on Nodeを介して同じサービスを起動しようとすると、Dockerodeがすべての引数をDockerに渡すように見えても、アドレス指定できないサービスが作成されます。私はhttps://godoc.org/githubの規則に準拠しているようです。 com / docker / engine-api / types / container#Configおよびhttps://godoc.org/github.com/docker/engine-api/types/container#HostConfigしたがって、この問題が発生します。
これは私が使おうとしているコードです...
var fs = require("fs"),
dockermachine = require("dockermachine"),
dockerode = require("dockerode");
var createOptions = {
Image:"ubuntu-nc",
Tty:true,
ExposedPorts: {
"3000/tcp:": {},
},
Cmd:[
"/bin/bash", "-c", "echo Working | nc -l 3000"
],
HostConfig:{
PortBindings: {
"3000/tcp": [{
"HostIP":"0.0.0.0",
"HostPort": "3000"
}],
},
},
};
dockermachine.inspect("default").then(function(info){
var docker = new dockerode({
host:info.Driver.IPAddress,
port:2376,
ca:fs.readFileSync(info.HostOptions.AuthOptions.CaCertPath),
cert:fs.readFileSync(info.HostOptions.AuthOptions.ClientCertPath),
key:fs.readFileSync(info.HostOptions.AuthOptions.ClientKeyPath),
});
docker.createContainer(createOptions, function(err, result){
var container = docker.getContainer(result.id);
container.attach({stream: true, stdout: true, stderr: true}, function (err, stream) {
stream.pipe(process.stdout);
});
container.start(function(err, data){
if(err) console.log(err);
});
});
});
NodeJSバージョンは間違いなくコンテナ内でサービスを実行します
たとえば、独自のコンテナ内からサービスにアクセスできます...
$ docker exec -it 3dd7 /bin/bash -c "nc localhost 3000"
Working
ただし、要求された外部ポートマッピングを尊重していないようです。そのため、上記の作業テストを最初からやり直してから、前述の「アドレス可能なサービスの証明」と同じ方法で、コンテナの外部からサービスにアクセスしてみてください。失敗した接続を報告します。
$ nc -v 192.168.99.100 3000
nc: connectx to 192.168.99.100 port 3000 (tcp) failed: Connection refused
docker version
の出力:
bash-3.2$ docker version
Client:
Version: 1.10.1
API version: 1.22
Go version: go1.5.3
Git commit: 9e83765
Built: Fri Feb 12 22:11:40 UTC 2016
OS/Arch: darwin/amd64
Server:
Version: 1.11.2
API version: 1.23
Go version: go1.5.4
Git commit: b9f10c9
Built: Wed Jun 1 21:20:08 2016
OS/Arch: linux/amd64
docker info
の出力:
bash-3.2$ docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 3
Server Version: 1.11.2
Storage Driver: aufs
Root Dir: /mnt/sda1/var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 7
Dirperm1 Supported: true
Logging Driver: json-file
Plugins:
Volume: local
Network: null host bridge
Kernel Version: 4.4.12-boot2docker
Operating System: Boot2Docker 1.11.2 (TCL 7.1); HEAD : a6645c3 - Wed Jun 1 22:59:51 UTC 2016
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 995.9 MiB
Name: default
ID: FWTM:2N6I:VM5L:OL4U:RD3K:HFKH:6VYP:QSV5:VHG5:ZTSW:GFOP:CDNT
Debug mode (server): true
File Descriptors: 14
Goroutines: 35
System Time: 2016-06-10T13:58:19.242425997Z
EventsListeners: 0
Init SHA1:
Init Path:
Docker Root Dir: /mnt/sda1/var/lib/docker
Labels:
provider=virtualbox
OK、次のような偽のセミコロンがあったようです...
ExposedPorts: {
"3000/tcp:": {},
},
...これにより、ExposedPortsは黙って無視されました。
リモートAPIの「オープンスキーマモデル」の動作のおかげで、明らかなエラーレポートが表示されないのは非常に残念です。
プロパティが明らかにDockerを制御することを目的としている場合に、このエラーを飲み込むことがどのように機能になるのかわかりません。
待って、何? それでしたか?...タイプミス?
私は同じ問題を抱えているのでこれを読んでいます-ポートマッピングを機能させることができず、ネットワークIPアドレスもありません。
(しかし、私はあなたのタイプミスを持っていません)
ここで学ぶべきことは他にありませんか?
気にしないでください...私は何かを学びました:コンテナを作成した後、IPアドレスまたはポートマッピングを取得する前にコンテナを「start()」する必要があります。
最も参考になるコメント
OK、次のような偽のセミコロンがあったようです...
...これにより、ExposedPortsは黙って無視されました。
リモートAPIの「オープンスキーマモデル」の動作のおかげで、明らかなエラーレポートが表示されないのは非常に残念です。
プロパティが明らかにDockerを制御することを目的としている場合に、このエラーを飲み込むことがどのように機能になるのかわかりません。