Moby: ์›๊ฒฉ API๋ฅผ ํ†ตํ•ด ํฌํŠธ๋ฅผ ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์—†์Œ

์— ๋งŒ๋“  2016๋…„ 06์›” 10์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: moby/moby

CLI์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ํ•ด๋‹น ํฌํŠธ๋ฅผ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Remote API๋ฅผ ํ†ตํ•ด์„œ๋Š” ๋™์ผํ•œ ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ Mac OS El Capitan์—์„œ docker-machine์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ๋‹จ์ผ ํŒจํ‚ค์ง€ netcat-openbsd, apt-get์ด ์„ค์น˜๋œ ํ‘œ์ค€ ์šฐ๋ถ„ํˆฌ ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ตœ์†Œํ•œ์œผ๋กœ ๋‹จ์ˆœํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค( nc ๋กœ ์‹คํ–‰).

์‹œ์Šคํ…œ ์žฌ์„ค์ •

๊ฐ ํ…Œ์ŠคํŠธ ์ „์— ๋‚˜๋Š” ์‹คํ–‰

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

...์ด์ „์˜ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ค‘์ง€ํ•˜๊ณ  ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

CLI ๋ฒ„์ „(์ฃผ์†Œ ์ง€์ • ๊ฐ€๋Šฅ)

๋‹ค์Œ CLI๋Š” ์ฃผ์†Œ ์ง€์ • ๊ฐ€๋Šฅํ•œ ์„œ๋น„์Šค๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค...

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

์ฃผ์†Œ ์ง€์ • ๊ฐ€๋Šฅ ์„œ๋น„์Šค ์ฆ๋ช…

๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ์™ธ๋ถ€(docker-machine์ด VM์— ํ• ๋‹นํ•œ IP)์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋งคํ•‘๋œ ํฌํŠธ๋กœ ์„œ๋น„์Šค์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Œ์„ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ nc 192.168.99.100 3000
Working

NodeJS ๋ฒ„์ „(์ฃผ์†Œ ์ง€์ • ๋ถˆ๊ฐ€)

Dockerode๊ฐ€ Docker์— ๋ชจ๋“  ์ธ์ˆ˜๋ฅผ ๋ถ„๋ช…ํžˆ ์ „๋‹ฌํ•˜์ง€๋งŒ ๋ถ„๋ช…ํžˆ https://godoc.org/github์˜ ๊ทœ์น™์„ ์ค€์ˆ˜ํ•˜๊ณ  ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋…ธ๋“œ์—์„œ Dockerode๋ฅผ ํ†ตํ•ด ๋™์ผํ•œ ์„œ๋น„์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ•˜๋ฉด ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์—†๋Š” ์„œ๋น„์Šค๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. 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

๋‹ค๋งŒ, ์š”์ฒญํ•œ ์™ธ๋ถ€ ํฌํŠธ ๋งคํ•‘์„ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ ๊ฐ™์œผ๋‹ˆ, ์œ„์˜ ์ž‘์—… ํ…Œ์ŠคํŠธ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ณ , ์•ž์„œ 'Proving Addressable Service'์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ์™ธ๋ถ€ ์—์„œ ์„œ๋น„์Šค์— ์ ‘๊ทผ์„ ์‹œ๋„ํ•˜๋ฉด, ์‹คํŒจํ•œ ์—ฐ๊ฒฐ์„ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.

$ 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
versio1.11

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ€์งœ ์„ธ๋ฏธ์ฝœ๋ก ์ด ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

... ์ด๋กœ ์ธํ•ด ExposedPorts๊ฐ€ ์ž๋™์œผ๋กœ ๋ฌด์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Remote API์˜ '๊ฐœ๋ฐฉํ˜• ์Šคํ‚ค๋งˆ ๋ชจ๋ธ' ๋™์ž‘ ๋•๋ถ„์— ๋ช…๋ฐฑํ•œ ์˜ค๋ฅ˜ ๋ณด๊ณ ๊ฐ€ ์—†๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋ถˆํ–‰ํ•œ ์ผ์ž…๋‹ˆ๋‹ค.

์†์„ฑ์ด Docker๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด ๋ถ„๋ช…ํ•  ๋•Œ ์˜ค๋ฅ˜๋ฅผ ์‚ผํ‚ค๋Š” ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๊ธฐ๋Šฅ์ด ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  3 ๋Œ“๊ธ€

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ€์งœ ์„ธ๋ฏธ์ฝœ๋ก ์ด ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

... ์ด๋กœ ์ธํ•ด ExposedPorts๊ฐ€ ์ž๋™์œผ๋กœ ๋ฌด์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Remote API์˜ '๊ฐœ๋ฐฉํ˜• ์Šคํ‚ค๋งˆ ๋ชจ๋ธ' ๋™์ž‘ ๋•๋ถ„์— ๋ช…๋ฐฑํ•œ ์˜ค๋ฅ˜ ๋ณด๊ณ ๊ฐ€ ์—†๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋ถˆํ–‰ํ•œ ์ผ์ž…๋‹ˆ๋‹ค.

์†์„ฑ์ด Docker๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด ๋ถ„๋ช…ํ•  ๋•Œ ์˜ค๋ฅ˜๋ฅผ ์‚ผํ‚ค๋Š” ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๊ธฐ๋Šฅ์ด ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ฌด์—‡์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค? ๊ทธ๊ฑฐ์˜€์–ด?...์˜คํƒ€?
๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์ฝ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํฌํŠธ ๋งคํ•‘์ด ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  ๋„คํŠธ์›Œํฌ IP ์ฃผ์†Œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
(ํ•˜์ง€๋งŒ ๋‚˜๋Š” ๋‹น์‹ ์˜ ์˜คํƒ€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค)
์—ฌ๊ธฐ์—์„œ ๋” ๋ฐฐ์šธ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๊นŒ?

์‹ ๊ฒฝ ์“ฐ์ง€ ๋งˆ์„ธ์š”...์ œ๊ฐ€ ๋ฐฐ์šด ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“  ํ›„ IP ์ฃผ์†Œ๋‚˜ ํฌํŠธ ๋งคํ•‘์„ ์–ป๊ธฐ ์ „์— ์ปจํ…Œ์ด๋„ˆ๋ฅผ "start()"ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰