!! Bitte beachten Sie, dass das Verhalten je nach Version völlig unterschiedlich ist!
Normalerweise lauscht Docker als Daemon und hört den Unix-Domain-Socket. Tatsächlich ist das Protokoll, das zu diesem Socket fließt, REST / HTTP, und Sie können es auch mit der Option -H an TCP binden, und es wird zu einem Webserver. Die Spezifikationen sind in "Docker Remote API" beschrieben. Und es gibt auch verschiedene Sprachclients.
Die Geschichte eines solchen Python-Clients docker-py.
Zuallererst normaler Gebrauch.
import docker
dc = docker.Client()
# docker ps
dc.containers()
# docker images
dc.images()
# docker run -ti ubuntu bash
c = dc.create_container("ubuntu", stdin_open=True, tty=True)
dc.start(c["Id"])
print "docker attach %s" % c["Id"]
Jedoch.
Seien Sie vorsichtig, da es einige schwerwiegende Fallstricke gibt, genau wie "Oh ... ich werde Ihnen sagen, was gerade passiert ist."
Der Assembly-Teil von ExposedPorts in / container / create
. Ist es eine Liste oder ein Tupel? Es gibt einige Stellen, an denen Sie möglicherweise nach einem Tupel gefragt werden, weil Sie der Meinung sind, dass die Liste korrekt ist. Wenn es sich nicht um die richtige Kombination handelt, wird außerdem nicht der richtige Wert erhalten. Außerdem ist die Falle, dass bei normaler Verwendung kein Fehler auftritt.
import traceback
import docker
dc = docker.Client()
tests = (
[22,], # OK
(22,), # NG
["22/tcp",], # NG
[(22, "tcp"),], # OK
[[22, "tcp"],] # NG
)
for ports in tests:
c = dc.create_container("ubuntu", stdin_open=True, tty=True, command="bash", ports=ports)
dc.start(c["Id"])
info = dc.inspect_container(c["Id"])
print ports, info["Config"]["ExposedPorts"]
try:
assert {'22/tcp': {}} == info["Config"]["ExposedPorts"]
except:
traceback.print_exc()
finally:
dc.stop(c["Id"])
Als nächstes folgt PortBindings in / container / (id) / start
. Ja ... ich frage mich. Was ist diese Inkonsistenz?
import traceback
import docker
dc = docker.Client()
tests = (
# automatic allocation
{22:None}, # OK
{"22/tcp": None}, # OK
# manual allocation
{22:10080}, # OK
{"22/tcp": 10080}, # OK
{22: ":10080"}, # NG
{22: dict(HostPort=10080, HostIp="0.0.0.0")}, # NG
{22: ["0.0.0.0", 10080]}, # NG
{22: ("0.0.0.0", 10080)} # OK
)
for port_bindings in tests:
c = dc.create_container("ubuntu", stdin_open=True, tty=True, command="bash", ports=[22,])
dc.start(c["Id"], port_bindings=port_bindings)
info = dc.inspect_container(c["Id"])
print port_bindings, info["HostConfig"]["PortBindings"]
try:
assert '22/tcp' in info["HostConfig"]["PortBindings"]
except:
traceback.print_exc()
finally:
dc.stop(c["Id"])
Recommended Posts