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๋ ์ฃผ์ ์ง์ ๊ฐ๋ฅํ ์๋น์ค๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๋ถ๋ฌ์ต๋๋ค...
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
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
์๊ฒ ์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ง ์ธ๋ฏธ์ฝ๋ก ์ด ์์๋ ๊ฒ ๊ฐ์ต๋๋ค.
ExposedPorts: {
"3000/tcp:": {},
},
... ์ด๋ก ์ธํด ExposedPorts๊ฐ ์๋์ผ๋ก ๋ฌด์๋์์ต๋๋ค.
Remote API์ '๊ฐ๋ฐฉํ ์คํค๋ง ๋ชจ๋ธ' ๋์ ๋๋ถ์ ๋ช ๋ฐฑํ ์ค๋ฅ ๋ณด๊ณ ๊ฐ ์๋ ๊ฒ์ ๋งค์ฐ ๋ถํํ ์ผ์ ๋๋ค.
์์ฑ์ด Docker๋ฅผ ์ ์ดํ๊ธฐ ์ํ ๊ฒ์ด ๋ถ๋ช ํ ๋ ์ค๋ฅ๋ฅผ ์ผํค๋ ๊ฒ์ด ์ด๋ป๊ฒ ๊ธฐ๋ฅ์ด ๋ ์ ์๋์ง ์ ์ ์์ต๋๋ค.
๋ฌด์์ ๊ธฐ๋ค๋ฆฝ๋๋ค? ๊ทธ๊ฑฐ์์ด?...์คํ?
๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ฝ๊ณ ์์ต๋๋ค. ํฌํธ ๋งคํ์ด ์๋ํ์ง ์๊ณ ๋คํธ์ํฌ IP ์ฃผ์๊ฐ ์์ต๋๋ค.
(ํ์ง๋ง ๋๋ ๋น์ ์ ์คํ๊ฐ ์์ต๋๋ค)
์ฌ๊ธฐ์์ ๋ ๋ฐฐ์ธ ๊ฒ์ ์์ต๋๊น?
์ ๊ฒฝ ์ฐ์ง ๋ง์ธ์...์ ๊ฐ ๋ฐฐ์ด ๊ฒ์ด ์์ต๋๋ค. ์ปจํ ์ด๋๋ฅผ ๋ง๋ ํ IP ์ฃผ์๋ ํฌํธ ๋งคํ์ ์ป๊ธฐ ์ ์ ์ปจํ ์ด๋๋ฅผ "start()"ํด์ผ ํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์๊ฒ ์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ง ์ธ๋ฏธ์ฝ๋ก ์ด ์์๋ ๊ฒ ๊ฐ์ต๋๋ค.
... ์ด๋ก ์ธํด ExposedPorts๊ฐ ์๋์ผ๋ก ๋ฌด์๋์์ต๋๋ค.
Remote API์ '๊ฐ๋ฐฉํ ์คํค๋ง ๋ชจ๋ธ' ๋์ ๋๋ถ์ ๋ช ๋ฐฑํ ์ค๋ฅ ๋ณด๊ณ ๊ฐ ์๋ ๊ฒ์ ๋งค์ฐ ๋ถํํ ์ผ์ ๋๋ค.
์์ฑ์ด Docker๋ฅผ ์ ์ดํ๊ธฐ ์ํ ๊ฒ์ด ๋ถ๋ช ํ ๋ ์ค๋ฅ๋ฅผ ์ผํค๋ ๊ฒ์ด ์ด๋ป๊ฒ ๊ธฐ๋ฅ์ด ๋ ์ ์๋์ง ์ ์ ์์ต๋๋ค.