15 docker tips in 5 minutes

39
! !" $%&'() *+,- +. " /+.01(- "#$%& '(#)%#*+ ,(- ./ 0123

Upload: john-q-smith-mcmmiv

Post on 12-Oct-2015

40 views

Category:

Documents


0 download

DESCRIPTION

15 Docker Tips in 5 Minutes

TRANSCRIPT

  • 15 Docker Tips in 5 Minutes Brian Morearty Nov 5, 2013

  • 1. Getting the id of the last-run container

    15 Docker Tips in 5 Minutes

    2

  • You could do this:

    But you have to keep assigning IDs. Try this instead:

    !$ ID=$(docker run ubuntu echo hello world)!hello world!$ docker commit $ID helloworld!fd08a884dc79!

    15 Docker Tips in 5 Minutes

    3

  • !$ alias dl='docker ps -l -q'!$ docker run ubuntu echo hello world!hello world!$ dl!1904cf045887!$ docker commit `dl` helloworld!fd08a884dc79!

    15 Docker Tips in 5 Minutes

    4

  • 2. Why you always want a Dockerle, even if you install everything in the shell

    15 Docker Tips in 5 Minutes

    5

  • $ docker run -i -t ubuntu bash!root@db0c3978abf8:/# apt-get install postgresql!Reading package lists... Done!Building dependency tree... Done!etc., etc., etc.!root@db0c3978abf8:/# exit!$ docker commit \! -run='{"Cmd":["postgres", "-too -many -opts"]}' \! `dl` postgres!5061b88e4cf0!

    15 Docker Tips in 5 Minutes

    6

  • Instead, make a wee liEle Dockerle that is FROM the image you made interacGvely.

    There you can set CMD, ENTRYPOINT, VOLUME, etc.

    15 Docker Tips in 5 Minutes

    7

  • 3. Su-su-sudo

    15 Docker Tips in 5 Minutes

    8

  • TOMATO TOMAHTO

    15 Docker Tips in 5 Minutes

    9

  • # Add the docker group.!$ sudo groupadd docker!!# Add self to the docker group. !$ sudo gpasswd -a myusername docker!!# Restart the docker daemon!$ sudo service docker restart!!# logout and in again.!$ exit!!

    15 Docker Tips in 5 Minutes

    10

  • 4. Take out the garbage

    15 Docker Tips in 5 Minutes

    11

  • !!$ docker rm $(docker ps -a -q)!

    Deletes all stopped containers. (Tries, but conveniently fails, to delete sGll-

    running containers.)

    15 Docker Tips in 5 Minutes

    12

  • 5. jq - the gangsta way to parse docker inspects output !

    15 Docker Tips in 5 Minutes

    13

  • !$ docker inspect `dl` | \! grep IPAddress | cut -d '"' -f 4!172.17.0.52!!$ docker inspect `dl` | \! jq -r '.[0].NetworkSettings.IPAddress'!172.17.0.52!!

    JSON is for JavaScript. 15 Docker Tips in 5 Minutes

    14

  • 6. What environment variables does an image have?

    15 Docker Tips in 5 Minutes

    15

  • !$ docker run ubuntu env!HOME=/!PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin!container=lxc!HOSTNAME=5e1560b7f757!

    This is nice when using docker run -link to connect containers. (Later slide.)

    15 Docker Tips in 5 Minutes

    16

  • 7. RUN vs. CMD instruction

    15 Docker Tips in 5 Minutes

    17

  • !FROM thelanddownunder!MAINTAINER crocdundee!!# docker build will execute these:!RUN apt-get update!RUN apt-get install softwares!!# docker run runs this cmd by default:!CMD ["softwares"]!

    A Dockerle. 15 Docker Tips in 5 Minutes

    18

  • 8. CMD vs. ENTRYPOINT instruction

    15 Docker Tips in 5 Minutes

    19

  • !$ cat Dockerfile!FROM ubuntu!CMD ["echo"]!!$ docker run \ imagename \ echo hello!hello!!

    15 Docker Tips in 5 Minutes

    20

    !$ cat Dockerfile!FROM ubuntu!ENTRYPOINT ["echo"]!!$ docker run \ imagename \ echo hello!echo hello!!

    Overrideable.

    Not overrideable.

  • 9. Does a Docker container have its own IP address?

    15 Docker Tips in 5 Minutes

    21

  • !$ ip -4 -o addr show eth0!2: eth0 inet 162.243.139.222/24!!$ docker run ubuntu \! ip -4 -o addr show eth0!149: eth0 inet 172.17.0.43/16!

    Yep. Its like a process with an IP address. 15 Docker Tips in 5 Minutes

    22

  • 10. Dockers architecture: thin CLI client, REST server daemon over UNIX socket

    15 Docker Tips in 5 Minutes

    23

  • !# Connect to the UNIX socket and make!# like an HTTP client.!$ nc -U //var/run/docker.sock!GET /images/json HTTP/1.1!!HTTP/1.1 200 OK!Content-Type: application/json!Date: Tue, 05 Nov 2013 23:18:09 GMT!Transfer-Encoding: chunked!!16aa![{"Repository":"postgres","Tag":.........!

    Orange is what I typed. 15 Docker Tips in 5 Minutes

    24

  • 11. Graph the dependencies among your images

    15 Docker Tips in 5 Minutes

    25

  • !# Generate an image dependency diagram!$ docker images -viz | \! dot -Tpng -o docker.png!!# To see it, run this on the host:!$ python -m SimpleHTTPServer!!# then browse to:!# http://machinename:8000/docker.png!

    15 Docker Tips in 5 Minutes

    26

  • 15 Docker Tips in 5 Minutes

    27

    And hope yours doesnt look like this.

  • 15 Docker Tips in 5 Minutes

    28

  • 12. Where does Docker store everything?

    15 Docker Tips in 5 Minutes

    29

  • !$ sudo su!# cd /var/lib/docker!# ls -F!containers/ graph/ repositories volumes/!

    Explore! graph means images. Filesystem layers are in graph/imageid/layer.

    15 Docker Tips in 5 Minutes

    30

  • 13. Docker source code: Go, Go, Go, Grabote.

    15 Docker Tips in 5 Minutes

    31

  • 15 Docker Tips in 5 Minutes

    32

  • 15 Docker Tips in 5 Minutes

    33

    commands.go The CLI.

    api.go The REST API router.

    server.go ImplementaGon of much of the the REST API.

    buildle.go The Dockerle parser.

  • 14. RUN some daemons, exit the container. What happens?

    15 Docker Tips in 5 Minutes

    34

  • $ cat Dockerfile!FROM ubuntu:12.04!MAINTAINER Brian Morearty!...!RUN pg_ctl start ...!!$ docker run -i -t postgresimage bash!root@08d363f57161:/# ps aux!# Doesnt show postgres daemon!

    Dont run a daemon in your Dockerle. 15 Docker Tips in 5 Minutes

    35

  • 15. Letting containers talk to each other

    15 Docker Tips in 5 Minutes

    36

  • 15 Docker Tips in 5 Minutes

    37

    I saved the best for last.

  • # Run a container. Give it a name.!$ docker run -d -name loldb loldbimage!!# Run another. Link it to the first,!# using an alias.!$ docker run -link /loldb:cheez \! otherimage env!CHEEZ_PORT=tcp://172.17.0.8:6379!CHEEZ_PORT_1337_TCP=tcp://172.17.0.8:6379!CHEEZ_PORT_1337_TCP_ADDR=172.17.0.12!CHEEZ_PORT_1337_TCP_PORT=6379!CHEEZ_PORT_1337_TCP_PROTO=tcp!!

    This sets up a bridge. 2nd container needs to know aliased name (CHEEZ) and port (1337).

    15 Docker Tips in 5 Minutes

    38

  • Extracted from my intro-level Hands on with Docker class. (In partnership with Docker, Inc.) Beta class this Monday, 6-9pm. handsonwith.com

    15 Docker Tips in 5 Minutes

    39