Docker
Now that Docker is one of the hottest projects on earth, it means that people actually like it not just because of that.
That said, I like to use containers, service discoveries and all the new ideas and fields that have been created to switch jobs as examples.
In this article I'll briefly describe using the Docker-py module in Python to manipulate the Docker container, which uses my favorite programming tool, Ipython.
Installing Docker-py
First, you need docker-py. Note that in this case I will be using Ubuntu trusty version 14.04.
$ pip Install Docker-py
Ipyhton
I really like using Ipython to explore Python. It's like a high-level Python Shell, but it can do more.
$ sudo apt-get install ipythonsnip!$ ipythonpython 2.7.6 (default, Mar, 22:59:56) Type "copyright", "credits" or "L Icense "For more information. IPython 1.2.1--an enhanced Interactive Python.? Introduction and overview of IPython ' s features.%quickref, Quick reference.help, Python ' s own Help Sys Tem.object? Details about ' object ', use ' object? ' for extra details. In [1]:
Installing Docker
If Docker is not installed, first install Docker
$ sudo apt-get install Docker.io
And then put Docker.io up in a separate name Docker.
$ alias docker= ' Docker.io ' $ docker versionclient Version:0.9.1go version (client): Go1.2.1git commit (client): 3600720Ser Ver version:0.9.1git commit (server): 3600720Go version (server): Go1.2.1last stable version:0.11.1, please update Docke R
Docker should now have a socket open that we can use to connect.
$ ls/var/run/docker.sock/var/run/docker.sock
Pull Mirror
Let's download BusyBox image
$ docker Pull busyboxpulling repository busybox71e18d715071:download complete98b9fdab1cb6:download Complete1277aa3f93b3:download complete6e0a2595b580:download complete511136ea3c5a:download completeb6c0d171b362: Download complete8464f9ac64e8:download complete9798716626f6:download Completefc1343e2fca0:download Completef3c823ac7aa6:download Complete
Now we're ready to use the docker-py.
Using Docker-py
Now that we have docker-py, IPython, Docker, and busybox mirrors, we can build some containers.
If you are not familiar with Ipython, you can refer to this tutorial to learn (http://ipython.org/ipython-doc/stable/interactive/tutorial.html),
The Ipython is very powerful.
First, start a Ipython and import the Docker module.
$ Ipythonpython 2.7.6 (default, Mar, 22:59:56) Type "copyright", "credits" or "license" for more information. IPython 1.2.1--an enhanced Interactive Python.? Introduction and overview of IPython ' s features.%quickref, Quick reference.help, Python ' s own Help Sys Tem.object? Details about ' object ', use ' object? ' for extra details. In [1]: Import Docker
Then we build a connection to Docker
In [2]: c = Docker. Client (base_url= ' Unix://var/run/docker.sock ', ...: version= ' 1.9 ', ...: timeout=10)
Now we are connected to Docker.
Ipython Use the TAB key to complete the fill. If you enter "C." and then press the TAB key, Ipython displays all the methods and properties of the Docker connection object.
In [3]: c.c.adapters c.headers c.pullc.attach c.history c.pushc.attach_socket C.hooks C.putc.auth c.images C.remove_containerc.base_url C.import_ima GE c.remove_imagec.build c.info c.requestc.cert c.insert c.resolve_ Redirectsc.close C.inspect_container c.restartc.commit c.inspect_image C.searchc.cont Ainers c.kill c.sendc.cookies c.login c.startc.copy c.logs C.stopc.create_container c.max_redirects c.streamc.create_container_from_config C.mount c.t Agc.delete c.options c.topc.diff c.params c.trust_envc.events C.PA tch c.verifyc.export c.port c.versionc.get c.post c.waitc.get_ Adapter C.prepaRe_requestc.head c.proxies
Let's take a look at the c.images I enter a "?" After C. Ipython will provide detailed information about this object.
In [5]: C.images? Type: instancemethodstring Form:
>file: /usr/local/lib/python2.7/dist-packages /docker/client.pydefinition:c.images (self, name=none, Quiet=false, All=false, Viz=false) docstring:
Gets the busybox image.
In [6]: C.images (name= "BusyBox") Out[6]:[{u ' Created ': 1401402591, U ' Id ': U ' 71e18d715071d6ba89a041d1e696b3d201e82a7525fbd35e2763b8e066a3e4de ', U ' parentid ': U ' 8464f9ac64e87252a91be3fbb99cee20cda3188de5365bec7975881f389be343 ', U ' repotags ': [u ' busybox:buildroot-2013.08.1 '], U ' Size ': 0, U ' virtualsize ': 2489301}, {u ' Created ': 1401402590, U ' Id ': U ' 1277AA3F93B3DA774690BC4F0D8BF257FF372E23310B4A5D3803C180C0D64CD5 ', U ' parentid ': U ' f3c823ac7aa6ef78d83f19167d5e2592d2c7f208058bc70bf5629d4bb4ab996c ', U ' repotags ': [u ' busybox:ubuntu-14.04 '], U ' Size ': 0, U ' virtualsize ': 5609404}, {u ' Created ': 1401402589, U ' Id ': U ' 6e0a2595b5807b4f8c109f3c6c5c3d59c9873a5650b51a4480b61428427ab5d8 ', U ' parentid ': U ' fc1343e2fca04a455f803ba66d1865739e0243aca6c9d5fd55f4f73f1e28456e ', U ' repotags ': [u ' busybox:ubuntu-12.04 '], U ' Size ': 0, U ' virtualsize ': 5454693}, {u ' Created ': 1401402587, U ' Id ': U ' 98b9fdab1cb6e25411eea5c44241561326c336d3e0efae86e0239a1fe56fbfd4 ', U ' parentid ': U ' 9798716626f6ae4e6b7f28451c0a1a603dc534fe5d9dd3900150114f89386216 ', U ' repotags ': [u ' busybox:buildroot-2014.02 ', U ' busybox:latest '], U ' Size ': 0, U ' virtualsize ': 2433303}]
Create a container. Note that I add a command that can be run, with the "env" command.
In [8]: C.create_container (image= "BusyBox", command= "env") Out[8]:{u ' Id ': U ' 584459a09e6d4180757cb5c10ac354ca46a32bf8e122fa3fb71566108f330c87 ', U ' Warnings ': None}
Use ID to start this container
In [9]: C.start (container= "584459a09e6d4180757cb5c10ac354ca46a32bf8e122fa3fb71566108f330c87")
We can check the logs and we should be able to see the output of the "env" command we configured when the container was created.
In [All]: C.logs (container= "584459a09e6d4180757cb5c10ac354ca46a32bf8e122fa3fb71566108f330c87") Out[11]: ' HOME=/\ Npath=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nhostname=584459a09e6d\n '
If you use the Docker command line to run a container with the same command-line options, you should see similar information.
$ docker Run BusyBox envhome=/path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binhostname= Ce3ad38a52bf
As far as I know, docker-py does not have a run option, we can only create a container and then start it.
Here is a case:
in [+]: BusyBox = C.create_container (image= "BusyBox", command= "echo Hi") in []: BusyBox? Type: dictstring form:{u ' Id ': U ' 34ede853ee0e95887ea333523d559efae7dcbe6ae7147aa971c544133a72e254 ', U ' Warnings ': none}length: 2docstring:dict (), New empty dictionarydict (mapping), new dictionary initialized from a MAPP ing object ' s (key, value) Pairsdict (iterable), new dictionary initialized as if via: d = {} for K, V in I Terable: d[k] = vdict (**kwargs), new dictionary initialized with the name=value pairs in the keyword argument List. For Example:dict (one=1, two=2) in [+]: C.start (busybox.get ("id")) in []: C.logs (busybox.get ("id")) out[20]: ' hi\n '
If you have not used the busybox image, I suggest you use it. I also recommend Debain under the Jessie image, which is only 120MB, smaller than the Ubuntu image.
Summarize
Docker is an appealing new system that can be used to build interesting new technology applications, especially cloud-based services related. Using Ipython we explored how to use the
Docker-py module to create a Docker container. Now using Python, we can combine Docker and easily create a lot of new ideas.