You are on page 1of 39

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

You could do this:


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

But you have to keep assigning IDs.


Try this instead:
15 Docker Tips in 5 Minutes

!
$ 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

2. Why you always want a Dockerle, even


if you install everything in the shell

15 Docker Tips in 5 Minutes

$ 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

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

3. Su-su-sudo

15 Docker Tips in 5 Minutes

TOMATO


TOMAHTO

15 Docker Tips in 5 Minutes

10

#
$
!
#
$
!
#
$
!
#
$
!

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

11

4. Take out the garbage

15 Docker Tips in 5 Minutes

12

!
!
$ 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

13

5. jq - the gangsta way to parse


docker inspects output !

15 Docker Tips in 5 Minutes

14

!
$ 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

15

6. What environment variables does


an image have?

15 Docker Tips in 5 Minutes

16

!
$ 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

17

7. RUN vs. CMD instruction

15 Docker Tips in 5 Minutes

18

!
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

19

8. CMD vs. ENTRYPOINT instruction

15 Docker Tips in 5 Minutes

20

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

Overrideable.
15 Docker Tips in 5 Minutes

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

Not overrideable.

21

9. Does a Docker container have its


own IP address?

15 Docker Tips in 5 Minutes

22

!
$ 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

23

10. Dockers architecture: thin CLI client,


REST server daemon over UNIX socket

15 Docker Tips in 5 Minutes

24

!
# 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

25

11. Graph the dependencies among


your images

15 Docker Tips in 5 Minutes

26

!
# 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

27

And hope yours doesnt look like this.

15 Docker Tips in 5 Minutes

28

15 Docker Tips in 5 Minutes

29

12. Where does Docker store


everything?

15 Docker Tips in 5 Minutes

30

!
$ 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

31

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


Grabote.

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.
15 Docker Tips in 5 Minutes

34

14. RUN some daemons, exit the


container. What happens?

15 Docker Tips in 5 Minutes

35

$ 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

36

15. Letting containers talk to each


other

15 Docker Tips in 5 Minutes

37

I saved the best for


last.

15 Docker Tips in 5 Minutes

38

#
$
!
#
#
$

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

39

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

You might also like