!! Veuillez noter que le comportement est complètement différent selon la version!
Normalement, docker écoute en tant que démon, en écoutant le socket de domaine unix. En fait, le protocole qui circule dans cette socket est REST / HTTP, et vous pouvez le lier à tcp avec l'option -H
, et il devient un serveur Web. Les spécifications sont décrites dans "Docker Remote API". Et il existe également divers clients de langue.
L'histoire d'un tel client python docker-py.
Tout d'abord, une utilisation normale.
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"]
Pourtant.
Soyez prudent car il y a de sérieux pièges, comme "Oh ... je vais vous dire ce qui s'est passé maintenant."
La partie d'assemblage d'ExposedPorts dans / container / create
. Est-ce une liste ou un tuple? Il y a des endroits où l'on peut vous demander un tuple, pensant que la liste est correcte. De plus, si ce n'est pas la bonne combinaison, la valeur correcte ne sera pas obtenue. En outre, le piège qu'aucune erreur ne se produit lors de son utilisation normale.
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"])
Vient ensuite PortBindings dans / containers / (id) / start
. Ouais ... je me demande. Quelle est cette incohérence?
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