Docker CLI¶
ユーザ・ガイドのクイック・スタートで説明されているように Docker クライアントを準備したら、Docker CLI を使用できます。Docker 1.10.3 以上をサポートしています。
コンテナを管理するためのほとんどのコマンドがサポートされています。ただし、config.json
ファイルで指定されたテナントに属するコンテナに限定されています。たとえば、ps
は指定されたテナントに属するコンテナのみを一覧表示します。
これらの Docker cli コマンドをサポートしています :
- attach
- create (下記のフラグの制限を参照してください)
- diff
- cp
- exec
- inspect
- kill
- logs
- network connect
- network create
- network disconnect
- network inspect
- network ls
- network rm
- pause
- port
- ps
- pull
- rename (現在サポートされていませんが、作業中です)
- restart
- rm
- run (下記のフラグの制限を参照してください)
- search
- start
- stats
- stop
- top
- update
- unpause
- version
- volume create
- volume inspect
- volume ls
- volume rm
- wait (下記のフラグの制限を参照してください)
これらの Docker run フラグはサポートされていますが、いくつかの制限があります :
- a, attach
- d, detach
- e, env (親和性と制約に注意してください)
- entrypint
- expose
- hostname
- help
- i, interactive
- l, label
- m (デフォルトのテナント・クォータ以下である必要があります)
- memory-reservation (デフォルトのテナント・クォータ以下である必要があります)
- memory-swap (デフォルトのテナント・クォータ以下である必要があります)
- memory-swappiness ?
- name
- net
- oom-kill-disable ?
- P, publish-all
- p, --publish (外部ホストポートは使用できません)
- restart
- rm
- stop-signal
- t, tty
- v, volume (ローカルホスト・ディレクトリは許可されません)
- volumes-from
- w, workdir
Docker run と create のフラグはサポートしていません :
- add-hosts
- blkio-weight
- cpu-shares
- cap-add
- cap-drop
- cgroup-parent
- cidfile
- cpu-period
- cpu-quota
- cpuset-cpus
- cpuset-mems
- device
- disable-content-trust
- dns ?
- dns-opt ?
- dns-search ?
- env-file ?
- group-add
- ipc
- kernel-memory
- label-file
- log-driver
- log-opt
- lxc-conf
- mac-address
- net ?
- oom-kill-disable
- pid
- privileged
- read-only
- restart ?
- security-opt
- sig-proxy
- u, user
- ulimit
- uts
これらの Docker cli コマンドはサポートしていません :
- daemon
- buid
- commit
- cp
- events
- export
- history
- images
- import
- info
- load
- login
- logout
- push
- save
- tag
例¶
例では、docker-user-1 と docker-user-2 の2人のユーザが使用されています。それらは、それぞれの config.json
ファイルで示されるように、2つの異なるテナントに関連付けられています。
$ cat ~/docker-user-1/config.json
{
"HttpHeaders": {
"X-Auth-TenantId": "6885fcb1997446d0b1b2b01e96fc5224",
"X-Auth-Token": "c4c2452f56994ef8acb8fdf2c2349dcf"
}
}
$ cat ~/docker-user-2/config.json
{
"HttpHeaders": {
"X-Auth-TenantId": "3850dbe4aeb24e0aa4a13f294fa1b6c1",
"X-Auth-Token": "6ebe2d0927a44eeb87e951229a765c13"
}
}
例では、FDCS がマルチテナント分離とマルチテナント名スコープをサポートしているので、2人のユーザが FDCS クラスタ上の Docker リソースを管理するために Docker を利用していることを示しています。
ユーザ定義ネットワーク¶
FDCS は、ユーザ定義のオーバーレイ・ネットワークとその管理をサポートしています。同じオーバレイ・ネットワーク上のコンテナは互いに安全に通信できますが、異なるネットワーク上のコンテナはそれぞれから隔離されています。各ネットワークには独自の DNS があり、コンテナ名を使用して同じネットワーク上のコンテナ間で通信を行うことができます。コンテナは、FDCS クラスタ内の異なる Docker ホスト上で実行されている可能性があります。
ユーザ定義ネットワーク - ping¶
この例では、ユーザ定義のオーバーレイ・ネットワークの FDCS サポートを示します。同じネットワーク上のコンテナがコンテナ名を使用して相互に ping
できることを示していますが、異なるネットワーク上のコンテナはそれぞれから隔離されています。また、異なるテナントが互いにどのように隔離されているかを示していますが、依然としてネットワークとコンテナに同じ名前を使用できます。さらに、ユーザ定義のネットワーク上にあるコンテナへのパブリック・アクセスを可能にするホストポート・マッピングを示します。
docker-user-1 は isolated_nw というブリッジネットワークを作成して検査します。
$ docker --config ~/docker-user-1 network ls
NETWORK ID NAME DRIVER
$ docker --config ~/docker-user-1 network create --driver overlay isolated_nw
38b3928cea20e80e1309d240c2ff7185fdb4ae39962cb235d642ccaf01d9b420
$ docker --config ~/docker-user-1 network ls
NETWORK ID NAME DRIVER
38b3928cea20 isolated_nw overlay
$ docker --config ~/docker-user-1 network inspect isolated_nw
[
{
"Name": "isolated_nw",
"Id": "38b3928cea20e80e1309d240c2ff7185fdb4ae39962cb235d642ccaf01d9b420",
"Scope": "global",
"Driver": "overlay",
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "10.0.0.0/24",
"Gateway": "10.0.0.1/24"
}
]
},
"Containers": {},
"Options": {}
}
]
docker-user-1 は2つのコンテナ、container1 と container2 を実行し、それらを network_nw に接続します。その後、ネットワークを調べて、コンテナが実際に取り付けられていることを確認します。
$ docker --config ~/docker-user-1 run --net=isolated_nw -itd -p 80 --name=container1 busybox httpd -f -p 80
722ea834daf52c641f1606ad594dce5def56815c421c367fe28d5d3eb33aec2d
$ docker --config ~/docker-user-1 run --net=isolated_nw -itd -p 80 --name=container2 busybox httpd -f -p 80
7b17c249ac4bbc1211c9a048e0775b18cba5435858b3773086972806cf25cc36
$ docker --config ~/docker-user-1 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7b17c249ac4b busybox "httpd -f -p 80" 14 seconds ago Up 11 seconds 130.206.119.32:32770->80/tcp docker-host-3/container2
722ea834daf5 busybox "httpd -f -p 80" 43 seconds ago Up 40 seconds 130.206.119.28:32771->80/tcp docker-host-2/container1
$ docker --config ~/docker-user-1 network inspect isolated_nw
[
{
"Name": "isolated_nw",
"Id": "38b3928cea20e80e1309d240c2ff7185fdb4ae39962cb235d642ccaf01d9b420",
"Scope": "global",
"Driver": "overlay",
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "10.0.0.0/24",
"Gateway": "10.0.0.1/24"
}
]
},
"Containers": {
"722ea834daf52c641f1606ad594dce5def56815c421c367fe28d5d3eb33aec2d": {
"Name": "container1",
"EndpointID": "2b98b5212f15c39a370a4895956ca3c7d35e8223f241ce5b151cd04a9f428572",
"MacAddress": "02:42:0a:00:00:02",
"IPv4Address": "10.0.0.2/24",
"IPv6Address": ""
},
"7b17c249ac4bbc1211c9a048e0775b18cba5435858b3773086972806cf25cc36": {
"Name": "container2",
"EndpointID": "1e9bcc0c6261509a6a644cdc6df0e8b01adafbaac9d338ec6164137a590f8b77",
"MacAddress": "02:42:0a:00:00:03",
"IPv4Address": "10.0.0.3/24",
"IPv6Address": ""
}
},
"Options": {}
}
]
docker-user-1 は、ネットワーク検査で示されているように、コンテナ名または IP アドレスを使用して、2つのコンテナが互いに ping できることを示しています。
$ docker --config ~/docker-user-1 exec container1 ping -c 2 container2
PING container2 (10.0.0.3): 56 data bytes
64 bytes from 10.0.0.3: seq=0 ttl=64 time=24.344 ms
64 bytes from 10.0.0.3: seq=1 ttl=64 time=24.144 ms
--- container2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 24.144/24.244/24.344 ms
docker-user-1@rcc-hrl-kvg-558:~$ docker exec container2 ping -c 2 container1
PING container1 (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: seq=0 ttl=64 time=24.267 ms
64 bytes from 10.0.0.2: seq=1 ttl=64 time=24.412 ms
--- container1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 24.267/24.339/24.412 ms
docker-user-1@rcc-hrl-kvg-558:~$ docker exec container1 ping -c 2 10.0.0.3
PING 10.0.0.3 (10.0.0.3): 56 data bytes
64 bytes from 10.0.0.3: seq=0 ttl=64 time=24.166 ms
64 bytes from 10.0.0.3: seq=1 ttl=64 time=24.328 ms
--- 10.0.0.3 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 24.166/24.247/24.328 ms
docker-user-1@rcc-hrl-kvg-558:~$ docker exec container2 ping -c 2 10.0.0.2
PING 10.0.0.2 (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: seq=0 ttl=64 time=24.409 ms
64 bytes from 10.0.0.2: seq=1 ttl=64 time=24.280 ms
--- 10.0.0.2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 24.280/24.344/24.409 ms
docker-user-1 は、isolated_nw2 という別のブリッジ・ネットワークを作成して検査します。
$ docker --config ~/docker-user-1 network create --driver overlay isolated_nw2
ee829ebc5f528b0c4e726f27f6c77f24da165ec764bc5b5d42a1d561b6ca5a03
docker-user-1@rcc-hrl-kvg-558:~$ docker network ls
NETWORK ID NAME DRIVER
38b3928cea20 isolated_nw overlay
ee829ebc5f52 isolated_nw2 overlay
docker-user-1@rcc-hrl-kvg-558:~$ docker network inspect isolated_nw2
[
{
"Name": "isolated_nw2",
"Id": "ee829ebc5f528b0c4e726f27f6c77f24da165ec764bc5b5d42a1d561b6ca5a03",
"Scope": "global",
"Driver": "overlay",
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "10.0.1.0/24",
"Gateway": "10.0.1.1/24"
}
]
},
"Containers": {},
"Options": {}
}
]
docker-user-1 は、別のコンテナ container3 を作成し、それをネットワーク isolated_nw2 に接続します。
$ docker --config ~/docker-user-1 run --net=isolated_nw2 -itd -p 80 --name=container3 busybox httpd -f -p 80
3ff7da20a937272129b0a7159bcbf7092536d38866b39f4ea047878bcfba171b
docker-user-1@rcc-hrl-kvg-558:~$ docker network inspect isolated_nw2
[
{
"Name": "isolated_nw2",
"Id": "ee829ebc5f528b0c4e726f27f6c77f24da165ec764bc5b5d42a1d561b6ca5a03",
"Scope": "global",
"Driver": "overlay",
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "10.0.1.0/24",
"Gateway": "10.0.1.1/24"
}
]
},
"Containers": {
"3ff7da20a937272129b0a7159bcbf7092536d38866b39f4ea047878bcfba171b": {
"Name": "container3",
"EndpointID": "efee5206d8b50ba7421873bea9fabfb470a2a2bf115ba869e6feb5c838349a6a",
"MacAddress": "02:42:0a:00:01:02",
"IPv4Address": "10.0.1.2/24",
"IPv6Address": ""
}
},
"Options": {}
}
]
docker-user-1 は、実行中のコンテナ、container1、container2、および container3 を表示します。すべてのコンテナに、異なるホスト URL にマップされたポート 80 があることに注意してください。
$ docker --config ~/docker-user-1 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3ff7da20a937 busybox "httpd -f -p 80" 3 minutes ago Up 3 minutes 130.206.119.28:32772->80/tcp docker-host-2/container3
7b17c249ac4b busybox "httpd -f -p 80" 16 minutes ago Up 16 minutes 130.206.119.32:32770->80/tcp docker-host-3/container2
722ea834daf5 busybox "httpd -f -p 80" 17 minutes ago Up 16 minutes 130.206.119.28:32771->80/tcp docker-host-2/container1
docker-user-1 は、同じネットワーク上のコンテナが共有プライベート・ネットワークを介して互いに通信できることを示していますが、異なるネットワーク上のコンテナは互いに分離されています。 container1 は isolated_nw に常駐しているため、container1 は container2 に ping できますが、container1 は isolated_nw に存在しないため、container3 に ping できません。
$ docker --config ~/docker-user-1 exec container1 ping -c 2 container2
PING container2 (10.0.0.3): 56 data bytes
64 bytes from 10.0.0.3: seq=0 ttl=64 time=24.685 ms
64 bytes from 10.0.0.3: seq=1 ttl=64 time=24.176 ms
--- container2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 24.176/24.430/24.685 ms
$ docker --config ~/docker-user-1 --config ~/docker-user-1 exec container1 ping -c 2 container3
ping: bad address 'container3'
$ docker exec container1 --config ~/docker-user-1 ping -c 2 10.0.1.2
PING 10.0.1.2 (10.0.1.2): 56 data bytes
--- 10.0.1.2 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss
ここでは、FDCS が別のテナントによって作成されたネットワークを導入することによって、ネットワーク・テナントの分離と名前のスコープをサポートすることを示しました。
docker-user-2 は、すでに docker-user-1 が使用しているのと同じ名前、すなわち isolated_nw を割り当てるネットワークを作成します。しかし、FDCS は、2つのネットワークが互いに隔離されていることを保証します。
$ docker --config ~/docker-user-2 network ls
NETWORK ID NAME DRIVER
$ docker --config ~/docker-user-2 network create --driver overlay isolated_nw
9e2c8cb747622eb6993b8a2b6aa914074df7c64c7d24cb95681a8a3f2e3925eb
$ docker --config ~/docker-user-2 network inspect isolated_nw
[
{
"Name": "isolated_nw",
"Id": "9e2c8cb747622eb6993b8a2b6aa914074df7c64c7d24cb95681a8a3f2e3925eb",
"Scope": "global",
"Driver": "overlay",
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "10.0.2.0/24",
"Gateway": "10.0.2.1/24"
}
]
},
"Containers": {},
"Options": {}
}
]
docker-user-2 は、docker-user-1 で使用されている同じ名前を持つ2つのコンテナ (container1 と container3) を作成して実行し、それを isolated_nw に接続します。
$ docker --config ~/docker-user-2 run --net=isolated_nw -itd -p 80 --name=container1 busybox httpd -f -p 80
67a15cd9f94d8b39c9f8c0f255356657443dbed13c9177308bbdeec490fb6805
$ docker --config ~/docker-user-2 run --net=isolated_nw -itd -p 80 --name=container3 busybox httpd -f -p 80
55761092f6f9e93ea42e3fafc481772658d239ad6b23e73379f754d49ddab337
docker-user-2 と docker-user-1 は、private isolated_nw ネットワークを検査します。docker-user-2 の検査では、isolated_nw ネットワークに接続されている container1 とcontainer3 が表示されます。docker-user-1 の検査では、isolated_nw ネットワークに接続されている container1 と container2 が表示されます。
$ docker --config ~/docker-user-2 network inspect isolated_nw
[
{
"Name": "isolated_nw",
"Id": "9e2c8cb747622eb6993b8a2b6aa914074df7c64c7d24cb95681a8a3f2e3925eb",
"Scope": "global",
"Driver": "overlay",
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "10.0.2.0/24",
"Gateway": "10.0.2.1/24"
}
]
},
"Containers": {
"67a15cd9f94d8b39c9f8c0f255356657443dbed13c9177308bbdeec490fb6805": {
"Name": "container1",
"EndpointID": "8fd66d66668290f0459a6870b7bdab3ee39b6a3a02da2895c4a30f90416d9a5b",
"MacAddress": "02:42:0a:00:02:02",
"IPv4Address": "10.0.2.2/24",
"IPv6Address": ""
},
"ep-b80c1415d279e27d646dce898dfe35733448413a33675b9f1cfcb7b72f493f00": {
"Name": "container3",
"EndpointID": "b80c1415d279e27d646dce898dfe35733448413a33675b9f1cfcb7b72f493f00",
"MacAddress": "02:42:0a:00:02:03",
"IPv4Address": "10.0.2.3/24",
"IPv6Address": ""
}
},
"Options": {}
}
]
$ docker --config ~/docker-user-1 network inspect isolated_nw
[
{
"Name": "isolated_nw",
"Id": "38b3928cea20e80e1309d240c2ff7185fdb4ae39962cb235d642ccaf01d9b420",
"Scope": "global",
"Driver": "overlay",
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "10.0.0.0/24",
"Gateway": "10.0.0.1/24"
}
]
},
"Containers": {
"722ea834daf52c641f1606ad594dce5def56815c421c367fe28d5d3eb33aec2d": {
"Name": "container1",
"EndpointID": "2b98b5212f15c39a370a4895956ca3c7d35e8223f241ce5b151cd04a9f428572",
"MacAddress": "02:42:0a:00:00:02",
"IPv4Address": "10.0.0.2/24",
"IPv6Address": ""
},
"7b17c249ac4bbc1211c9a048e0775b18cba5435858b3773086972806cf25cc36": {
"Name": "container2",
"EndpointID": "1e9bcc0c6261509a6a644cdc6df0e8b01adafbaac9d338ec6164137a590f8b77",
"MacAddress": "02:42:0a:00:00:03",
"IPv4Address": "10.0.0.3/24",
"IPv6Address": ""
}
},
"Options": {}
}
]
docker-user-2 と docker-user-1 はネットワークを一覧表示します。docker-user-2 には1つのネットワーク isolated_nw があります。docker-user-1 には2つのネットワーク isolated_nw と isolated_nw2 があります。2つの isolated_nw ネットワークは異なるネットワークです。
$ docker --config ~/docker-user-2 network ls
NETWORK ID NAME DRIVER
9e2c8cb74762 isolated_nw overlay
$ docker --config ~/docker-user-1 network ls
NETWORK ID NAME DRIVER
b7b259090b4d isolated_nw overlay
ba3df08fd1be isolated_nw2 overlay
ここでは、異なるネットワークに属するネットワークが互いに分離されていることを示します。docker-user-2 の isolated_nw 上のコンテナは互いに ping でき、docker-user-1 の isolated_nw は互いに ping できます。しかし、docker-user-2 の isolated_nw と docker-user-1 の isolated_nw のコンテナは、互いに ping できません。
$ docker --config ~/docker-user-2 exec container1 ping -c 2 container3
PING container3 (10.0.2.3): 56 data bytes
64 bytes from 10.0.2.3: seq=0 ttl=64 time=24.824 ms
64 bytes from 10.0.2.3: seq=1 ttl=64 time=24.195 ms
--- container3 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 24.195/24.509/24.824 ms
$ docker --config ~/docker-user-2 exec container1 ping -c 2 10.0.2.3
PING 10.0.2.3 (10.0.2.3): 56 data bytes
64 bytes from 10.0.2.3: seq=0 ttl=64 time=24.571 ms
64 bytes from 10.0.2.3: seq=1 ttl=64 time=24.148 ms
--- 10.0.2.3 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 24.148/24.359/24.571 ms
$ docker --config ~/docker-user-1 exec container1 ping -c 2 container3
ping: bad address 'container3'
$ docker --config ~/docker-user-1 exec container1 ping -c 2 10.0.2.3
PING 10.0.2.3 (10.0.2.3): 56 data bytes
--- 10.0.2.3 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss
$ docker --config ~/docker-user-1 exec container1 ping -c 2 10.0.2.3
PING 10.0.2.3 (10.0.2.3): 56 data bytes
--- 10.0.2.3 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss
$ docker --config ~/docker-user-1 exec container1 ping -c 2 container2
PING container2 (10.0.0.3): 56 data bytes
64 bytes from 10.0.0.3: seq=0 ttl=64 time=24.400 ms
64 bytes from 10.0.0.3: seq=1 ttl=64 time=24.219 ms
--- container2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 24.219/24.309/24.400 ms
ここでは、ユーザ定義のマッピングでコンテナへのホストポート・マッピングを示します。これらのコンテナにパブリック・アクセスできることを示します。
$ user1_container1_URL=$(docker --config ~/docker-user-1 port container1 80)
$ user1_container2_URL=$(docker --config ~/docker-user-1 port container2 80)
$ user1_container3_URL=$(docker --config ~/docker-user-1 port container3 80)
$ user2_container1_URL=$(docker --config ~/docker-user-2 port container1 80)
$ user2_container3_URL=$(docker --config ~/docker-user-2 port container3 80)
$ echo $user1_container1_URL
9.148.24.231:32779
$ echo $user1_container2_URL
9.148.24.231:32780
$ echo $user1_container3_URL
9.148.24.230:32781
$ echo $user2_container1_URL
9.148.24.230:32784
$ echo $user2_container3_URL
9.148.24.230:32785
$ curl -s $user1_container1_URL > /dev/null && echo connected || echo Fail
connected
$ curl -s $user1_container2_URL > /dev/null && echo connected || echo Fail
connected
$ curl -s $user1_container3_URL > /dev/null && echo connected || echo Fail
connected
$ curl -s $user2_container1_URL > /dev/null && echo connected || echo Fail
connected
$ curl -s $user2_container3_URL > /dev/null && echo connected || echo Fail
connected
ユーザ定義の NFS ボリューム¶
FDCS は、ユーザ定義の NFS ボリュームとその管理をサポートしています。複数のコンテナが同じ期間に同じボリュームを使用できます。これは、2つのコンテナが共有データにアクセスする必要がある場合に便利です。たとえば、あるコンテナが書き込みを行い、もう一方のコンテナがデータを読み込むとします。ボリュームを参照するコンテナが削除されても、ユーザ定義のボリュームのデータは保持されます。さらに、FDCS は NFS マウントポイント上にユーザ定義ボリュームをマウントするので、ボリュームは FDCS クラスタ内のすべてのホストによって共有されます。したがって、異なるホスト上のコンテナは簡単にデータを共有できます。
この例では、docker_user_1 と docker_user_2 という2人のユーザが、ユーザ定義のボリュームを活用してデータを共有して保持する方法を示します。docker_user_1 の volumeA は、そのコンテナにしかアクセスできません。docker_user_2 の volumeA は、そのコンテナにしかアクセスできません。
docker_user-1 は volumeA を作成します。List volume は、FDCS クラスタ内のすべてのホスト上の同じボリュームを示します。これは、docker_user-1のコンテナがどこのFDCS クラスタ上で起動されても、volumeA にアクセスできることを意味します。
$ docker --config ~/docker-user-1 volume create -d nfs --name volumeA
volumeA
$ docker --config ~/docker-user-1 volume ls
DRIVER VOLUME NAME
nfs docker-host-1/volumeA
nfs docker-host-2/volumeA
docker_user-1 は2つのコンテナを作成します。一方はボリュームに書き込み、もう一方は以前にボリュームに書き込まれたデータを読み取ります。
$ docker --config ~/docker-user-1 run --rm -v volumeA:/data busybox sh -c "echo docker_user_1 hello > /data/file.txt"
$ docker --config ~/docker-user-1 run --rm -v volumeA:/data busybox sh -c "cat /data/file.txt"
docker_user_1 hello
docker_user-2 は、docker_user-1 によって作成されたボリュームにアクセスできません。
$ docker --config ~/docker-user-2 volume ls
DRIVER VOLUME NAME
$ docker --config ~/docker-user-2 run --rm -v volumeA:/data busybox sh -c "cat /data/file.txt"
cat: can't open '/data/file.txt': No such file or directory
docker_user-2 は、docker_user-1 で使用されているのと同じ名前を使用して別のボリュームを作成します。
$ docker --config ~/docker-user-2 volume create -d nfs --name volumeA
volumeA
$ docker --config ~/docker-user-2 volume ls
DRIVER VOLUME NAME
nfs docker-host-1/volumeA
nfs docker-host-2/volumeA
docker_user-2 は2つのコンテナを作成します。一方はボリュームに書き込み、もう一方は以前にボリュームに書き込まれたデータを読み取ります。
$ docker --config ~/docker-user-2 run --rm -v volumeA:/data busybox sh -c "echo docker_user_2 hello > /data/file.txt"
$ docker --config ~/docker-user-2 run --rm -v volumeA:/data busybox sh -c "cat /data/file.txt"
docker_user_2 hello
docker_user-1 は、以前にこのボリュームにあったデータを再度読み取ります。2つのボリュームのデータが異なることに注意してください。
$ docker --config ~/docker-user-1 run --rm -v volumeA:/data busybox sh -c "cat /data/file.txt"
docker_user_1 hello
docker_user-1 と docker_user-2 はボリュームを削除します。
$ docker --config ~/docker-user-1 volume rm volumeA
volumeA
$ docker --config ~/docker-user-2 volume rm volumeA
volumeA
$ docker --config ~/docker-user-1 volume ls
DRIVER VOLUME NAME
$ docker --config ~/docker-user-2 volume ls
DRIVER VOLUME NAME
$
Orion と mongodb¶
次の例では、FIWARE の Orion と mongodb で構成されたサービスを使用して、ユーザ定義のオーバーレイ・ネットワーク、ユーザー定義の NFS ボリューム、リンク、ボリュームからの FDCS のサポートを示しています。
Orion と mongodb : ユーザ定義のオーバーレイ・ネットワークと nfs ボリュームの使用¶
FIWARE Orion と mongodb コンテナは、ユーザが定義したオーバーレイ・ネットワークを介して接続されています。Mongdb のデータは、ユーザが定義した NFS ボリュームにマウントすることでそのまま維持されます。
これはフロントと呼ばれる使用定義のオーバーレイ・ネットワークを作成します。
$ docker network create --driver overlay front
f3cda3053dc649fd056ba9dcfe0b423f8cfd9fb8f2eaecd9ede1ccd6465d5317
docker-user-1@rcc-hrl-kvg-558:~$ docker network inspect front
[
{
"Name": "front",
"Id": "f3cda3053dc649fd056ba9dcfe0b423f8cfd9fb8f2eaecd9ede1ccd6465d5317",
"Scope": "global",
"Driver": "overlay",
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "10.0.0.0/24",
"Gateway": "10.0.0.1/24"
}
]
},
"Containers": {},
"Options": {}
}
]
ユーザは、定義済みの NFS ボリュームを作成します。
$ docker volume create -d nfs --name mongodata
mongodata
$ docker volume ls
DRIVER VOLUME NAME
nfs mongodata
nfs mongodata
ユーザは、mongo コンテナを作成し、フロント・ネットワークに接続し、mongo データ NFS ボリュームをマウントします。
$ docker run -d -v mongodata:/data/db --net front --name mongo mongo:3.2 --nojournal
1c487cd5236eca3a171a508aa232c749422690834fa54163d6443ef633056673
ユーザは、FIWARE Orion コンテナを作成し、フロント・ネットワークに接続します。
$ docker run -d -p 1026 --net front --name orion fiware/orion -dbhost mongo
a5155e4986385606863293f02dcad0432c8b4e3af413c210a4a03c2b16548557
ユーザはフロント・ネットワークを検査します。両方のコンテナがネットワークに接続されていることがわかります。
$ docker network inspect front
[
{
"Name": "front",
"Id": "f3cda3053dc649fd056ba9dcfe0b423f8cfd9fb8f2eaecd9ede1ccd6465d5317",
"Scope": "global",
"Driver": "overlay",
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "10.0.0.0/24",
"Gateway": "10.0.0.1/24"
}
]
},
"Containers": {
"1c487cd5236eca3a171a508aa232c749422690834fa54163d6443ef633056673": {
"Name": "mongo",
"EndpointID": "c114672826177a26486526cc19e4d54dc7e6a326155ce4ed0b3a1ef5ac203c0b",
"MacAddress": "02:42:0a:00:00:02",
"IPv4Address": "10.0.0.2/24",
"IPv6Address": ""
},
"a5155e4986385606863293f02dcad0432c8b4e3af413c210a4a03c2b16548557": {
"Name": "orion",
"EndpointID": "def63efe47844a630ff2e4c784c6b1462b65b38dcd4d648d7d907c2c9044b9fc",
"MacAddress": "02:42:0a:00:00:03",
"IPv4Address": "10.0.0.3/24",
"IPv6Address": ""
}
},
"Options": {}
}
]
ユーザは、コンテナが開始されたことを確認します。
docker-user-1@rcc-hrl-kvg-558:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a5155e498638 fiware/orion "/usr/bin/contextBrok" 2 minutes ago Up 2 minutes 130.206.119.32:32773->1026/tcp docker-host-3/orion
1c487cd5236e mongo:3.2 "/entrypoint.sh --noj" 2 minutes ago Up 2 minutes 27017/tcp docker-host-2/mongo
ユーザは、サービスが期待どおりに機能していることを確認します :
$ port=$(docker port orion 1026)
$ curl ${port}/version
{
"orion" : {
"version" : "0.28.0-next",
"uptime" : "0 d, 0 h, 1 m, 56 s",
"git_hash" : "8c2bfb296628f106bebe5988a48d12efda64dede",
"compile_time" : "Sat Mar 19 23:24:17 UTC 2016",
"compiled_by" : "root",
"compiled_in" : "838a42ae8431"
}
}
最初はデータベースは空です。
$ curl ${port}/v2/entities
[]
ユーザがデータベースにエントリを追加します。
$curl ${port}/v2/entities -s -S --header 'Content-Type: application/json' -X POST -d @- <<EOF
{
"id": "Room2",
"type": "Room",
"temperature": {
"value": 23,
"type": "Number"
},
"pressure": {
"value": 720,
"type": "Number"
}
}
EOF
$ curl ${port}/v2/entities
[{"id":"Room2","type":"Room","pressure":{"type":"Number","value":720,"metadata":{}},"temperature":{"type":"Number","value":23,"metadata":{}}}]
ここでは、NFS ボリュームの mongo データに関するデータが、Orion と mongo を削除してから再度起動することを示しています。
docker-user-1@rcc-hrl-kvg-558:~$ docker rm -fv orion
orion
docker-user-1@rcc-hrl-kvg-558:~$ docker rm -fv mongo
mongo
docker-user-1@rcc-hrl-kvg-558:~$ docker run -d -v mongodata:/data/db --net front --name mongo mongo:3.2 --nojournal
651c807290614313956d8d72c521684745ce66b52cee9622fc9154776f4d283b
docker-user-1@rcc-hrl-kvg-558:~$ docker run -d -p 1026 --net front --name orion fiware/orion -dbhost mongo
f343271767472660c1b2c9093986470d82429a7eabd4cd17e57f7fe43afe6c78
docker-user-1@rcc-hrl-kvg-558:~$ port=$(docker port orion 1026)
docker-user-1@rcc-hrl-kvg-558:~$ curl ${port}/v2/entities
[{"id":"Room2","type":"Room","pressure":{"type":"Number","value":720.000000},"temperature":{"type":"Number","value":23.000000}}]
Orion と mongo : リンクとボリュームからの参照を使用¶
この例では、--link
と --volume-from
というフラグを使用して、コンテナの参照を示すために、FIWARE の Orion と mongodb を使用します。
FDCS がリンクとボリュームをサポートしていることに注意することが重要ですが、ユーザ定義のオーバーレイ・ネットワークと NFS ボリュームを使用することが望ましいです。Docker は廃止されたリンクを持っています。NFS ボリュームは、FDCS クラスタ内のすべての Docker ホストによって共有されるため、NFS ボリュームは FDCS クラスタ内の任意のホスト上で実行される可能性があります。volume-from
フラグを持つ他のコンテナを参照するコンテナは、すべて同じ Docker ホスト上で実行する必要があります。
ユーザは、mongodb データ・ボリュームを作成します。
docker --config ~/docker-user-1 create -v /data/db --name mongodbdata mongo:3.2 /bin/echo "Data-only container for mongodb."
b9aa0d6cb3d0082f106248cc5afa7978b6ff7921b8a12a402bcf748e1b1ac503
ユーザは、mongodb を実行し、-volumes-from
を使用して、mongodbdata データ・ボリュームを参照します。
docker --config ~/docker-user-1 run -d --volumes-from mongodbdata --name mongodb mongo:3.2 --nojournal
d6ab99615391032e7ed6d9f1b834686d60caee32a933796d6253a9efb201ec15
ユーザは、--link
を使用して、mongodb コンテナを参照します。
docker --config ~/docker-user-1 run -d --link mongodb -p :1026 --name orion fiware/orion:latest -dbhost mongodb
52cab61c971806114f68019344734015c1ca7b7e072e1c1a6c51df037c95461d
Orion に割り当てられた、ホストポートを使用して Orion にアクセスします。
port=$(docker --config ~/docker-user-1 port orion 1026)
curl ${port}/version
{
"orion" : {
"version" : "0.28.0-next",
"uptime" : "0 d, 0 h, 4 m, 37 s",
"git_hash" : "8c2bfb296628f106bebe5988a48d12efda64dede",
"compile_time" : "Sat Mar 19 23:24:17 UTC 2016",
"compiled_by" : "root",
"compiled_in" : "838a42ae8431"
}
}
データベースが空であり、エンティティを含まないことを示しています。
curl ${port}/v2/entities
[]
温度と圧力の2つの属性を持つ Room2 という最初のエンティティを作成します。
curl ${port}/v2/entities -s -S --header 'Content-Type: application/json' -X POST -d @- <<EOF
{
"id": "Room2",
"type": "Room",
"temperature": {
"value": 23,
"type": "Number"
},
"pressure": {
"value": 720,
"type": "Number"
}
}
EOF
curl ${port}/v2/entities/Room2 -s -S --header 'Accept: application/json' | python -mjson.tool
curl ${port}/v2/entities/Room2 | python -mjson.tool
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 140 100 140 0 0 10150 0 --:--:-- --:--:-- --:--:-- 10769
{
"id": "Room2",
"pressure": {
"metadata": {},
"type": "Number",
"value": 720
},
"temperature": {
"metadata": {},
"type": "Number",
"value": 23
},
"type": "Room"
}
ここで、mongodb データ以外のすべてのコンテナを削除してから再度実行することで、mongodb データにデータが残っていることを示します。
docker --config ~/docker-user-1 rm -fv orion
docker --config ~/docker-user-1 rm -fv mongodb
docker --config ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1fdec401e212 mongo:3.2 "/entrypoint.sh /bin/" 41 minutes ago Created rcc-hrl-kvg-588/mongodbdata
ユーザは Orion と mongodb を再び立ち上げ、以前にデータベースに注入されたデータがまだそこにあることを示します。
`
$ docker run -d --volumes-from mongodbdata --name mongodb mongo:3.2 --nojournal
ebc4c11c273a010437cf6d5a02442c327e0e655658d2132b0cebf212750bae11
$ docker run -d --link mongodb -p :1026 --name orion fiware/orion:latest -dbhost mongodb
70ee33e22b44b948e4bfbc7ebd7a7d29abafd0f68a56376c91ca4161b98b435b
$ port=$(docker port orion 1026)
$ curl ${port}/v2/entities/Room2 | python -mjson.tool
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 140 100 140 0 0 15140 0 --:--:-- --:--:-- --:--:-- 15555
{
"id": "Room2",
"pressure": {
"metadata": {},
"type": "Number",
"value": 720
},
"temperature": {
"metadata": {},
"type": "Number",
"value": 23
},
"type": "Room"
}