Moby: Tidak Dapat Mengikat Port melalui API Jarak Jauh

Dibuat pada 10 Jun 2016  ·  3Komentar  ·  Sumber: moby/moby

Saya dapat meluncurkan wadah dan memetakan port mereka dari CLI. Namun, hal yang sama tampaknya tidak mungkin dilakukan melalui Remote API. Dalam kedua kasus saya menjalankan dengan mesin buruh pelabuhan di Mac OS El Capitan.

Saya sekarang telah menyederhanakan kasus uji ke minimum absolut, yang didasarkan pada gambar ubuntu standar hanya dengan satu paket netcat-openbsd, apt-get diinstal (dan dijalankan sebagai nc ).

Menyetel ulang sistem

Sebelum setiap tes, saya berlari

eval $(docker-machine env default); docker stop $(docker ps -a -q); docker rm $(docker ps -a -q) 

...untuk menghentikan dan menghapus semua kontainer sebelumnya.

Versi CLI (dapat dialamatkan)

CLI berikut berhasil menampilkan layanan yang dapat dialamatkan...

docker run -it --rm -p 3000:3000 ubuntu-nc /bin/bash -c 'echo "Working" | nc -l 3000'

Membuktikan Layanan Beralamat

Saya dapat membuktikan bahwa layanan dapat diakses dengan port yang dipetakan dengan benar dari luar wadah buruh pelabuhan (pada IP yang dialokasikan ke VM oleh mesin buruh pelabuhan) dengan menjalankan yang berikut ...

$ nc 192.168.99.100 3000
Working

Versi NodeJS (tidak dapat dialamatkan)

Mencoba memunculkan layanan yang sama melalui Dockerode di Node membuat layanan yang tidak dapat dialamatkan, meskipun Dockerode tampaknya meneruskan semua argumen ke Docker, dan saya tampaknya mematuhi konvensi https://godoc.org/github. com/docker/engine-api/types/container#Config dan https://godoc.org/github.com/docker/engine-api/types/container#HostConfig karenanya mengangkat masalah ini.

Ini adalah kode yang saya coba gunakan ...

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);
        });

    });
});

Versi NodeJS pasti menjalankan layanan dalam wadah

Misalnya saya dapat mengakses layanan dari dalam wadahnya sendiri ...

$ docker exec -it 3dd7 /bin/bash -c "nc localhost 3000"
Working

Namun, itu tampaknya tidak menghormati pemetaan port eksternal yang telah diminta, jadi jika saya memulai kembali tes kerja di atas dari awal, kemudian mencoba mengakses layanan dari luar wadah dengan cara yang sama seperti 'Membuktikan Layanan Beralamat' sebelumnya, itu melaporkan koneksi yang gagal.

$ nc -v 192.168.99.100 3000
nc: connectx to 192.168.99.100 port 3000 (tcp) failed: Connection refused

Informasi Debug Ekstra

Keluaran dari 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

Keluaran dari 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
versio1.11

Komentar yang paling membantu

Oke, sepertinya ada titik koma palsu seperti...

ExposedPorts: {
        "3000/tcp:": {},
 },

...yang menyebabkan ExposedPorts diabaikan secara diam-diam.

Sangat disayangkan tidak ada pelaporan kesalahan yang jelas, tampaknya berkat perilaku 'model skema terbuka' dari Remote API.

Saya tidak bisa melihat bagaimana menelan kesalahan ini ketika properti jelas dimaksudkan untuk mengontrol Docker bisa menjadi fitur.

Semua 3 komentar

Oke, sepertinya ada titik koma palsu seperti...

ExposedPorts: {
        "3000/tcp:": {},
 },

...yang menyebabkan ExposedPorts diabaikan secara diam-diam.

Sangat disayangkan tidak ada pelaporan kesalahan yang jelas, tampaknya berkat perilaku 'model skema terbuka' dari Remote API.

Saya tidak bisa melihat bagaimana menelan kesalahan ini ketika properti jelas dimaksudkan untuk mengontrol Docker bisa menjadi fitur.

tunggu apa? apakah itu?...salah ketik?
Saya telah membaca ini karena saya memiliki masalah yang sama -- tidak dapat membuat pemetaan port apa pun berfungsi, tidak ada alamat IP Jaringan.
(tapi saya tidak salah ketik)
Apakah tidak ada lagi yang bisa dipelajari di sini?

tidak apa-apa...Saya telah belajar sesuatu: setelah membuat wadah Anda kemudian harus "mulai ()" wadah sebelum Anda mendapatkan Alamat IP atau pemetaan port.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat