Docker.io Howto

Aus Cactus Howto
Wechseln zu: Navigation, Suche

Documentation

Basics

A running instance of an image is called container. You can make changes to a container (e.g. delete a file), but these changes will not affect the image. However, you can create a new image from a running container (and all it changes) using docker commit <container-id> <image-name>.

Create Docker account

This step is optional and only needed if you want to publicly upload images.

sudo docker login

Setup

sample docker running under Ubuntu 14.04.1:

itsecorg@pbuilder:~$ sudo aptitude install docker.io


Proxy setup

  • First, create a systemd drop-in directory for the docker service:
sudo mkdir /etc/systemd/system/docker.service.d
  • Now create a file called /etc/systemd/system/docker.service.d/http-proxy.conf that adds the HTTP_PROXY environment variable:
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/"
  • If you have internal Docker registries that you need to contact without proxying you can specify them via the NO_PROXY environment variable:
Environment="HTTP_PROXY=http://proxy.example.com:80/"
Environment="NO_PROXY=localhost,127.0.0.0/8,docker-registry.somecorporation.com"
  • Flush changes:
sudo systemctl daemon-reload
  • Verify that the configuration has been loaded:
sudo systemctl show --property Environment docker
Environment=HTTP_PROXY=http://proxy.example.com:80/
  • Restart Docker:
sudo systemctl restart docker

Remove all images and containers

tim@pbuilder:~/dock1$ cat remove_all.sh
#!/bin/bash
# Delete all containers
docker rm $(docker ps -a -q)
# Delete all images
docker rmi $(docker images -q)
tim@pbuilder:~/dock1$

Image and Container Handling

Search images

sudo docker search --filter=stars=50 "ubuntu"
NAME                                     DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
ubuntu                                   Official Ubuntu base image                      934       [OK]
itsecorg@pbuilder:~$

Install / list / remove images

itsecorg@pbuilder:~$ sudo docker pull ubuntu:14.04.1
itsecorg@pbuilder:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              14.04.1             5506de2b643b        3 weeks ago         199.3 MB
itsecorg@pbuilder:~$

Remove

Remove Container

itsecorg@pbuilder:~$ sudo docker rm busybox

Remove Image(s)

itsecorg@pbuilder:~$ sudo docker rmi 0b310e6bf058 c5881f11ded9  463ff6be4238 195eb90b5349 3db9c44f4520

Show containers

itsecorg@pbuilder:~$ sudo docker ps -a --no-trunc=true
itsecorg@pbuilder:~$ sudo docker ps -a --no-trunc=false
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                           PORTS               NAMES
09a4d97bdc2b        ubuntu:14.04.1      sudo http_proxy=http   About an hour ago   Exited (0) About an hour ago                         loving_hypatia
b4360f35202b        ubuntu:14.04.1      sudo http_proxy=http   About an hour ago   Exited (0) About an hour ago                         cocky_perlman
8d1fbf98c719        ubuntu:14.04.1      sudo http_proxy=http   About an hour ago   Exited (0) About an hour ago                         backstabbing_newton

Create new image from container

Syntax:

sudo docker commit <container-id> <image-name>

Example:

sudo docker commit b4360f35202b ubuntu-new

Example vanilla postgres

Image for testing

... contains http and postgres client (ubuntu client):

tim@ubuntu:~/docker$ cat ubu_client/Dockerfile
FROM ubuntu:14.04.1
MAINTAINER itsecorg@cactus.de
RUN DEBIAN_FRONTEND=noninteractive apt-get update && \
  apt-get install -y sharutils wget curl postgresql-client && \
  apt-get clean && rm -rf /var/lib/apt/lists/*
tim@ubuntu:~/docker$

Building image

tim@ubuntu:~/docker/isodb$ cat Dockerfile.isodb.vanilla (apache Dockerfile: Dockerfile.isoweb)

tim@ubuntu:~/docker/isodb$ sudo docker build -t isodb:0.1 .
Sending build context to Docker daemon 513.5 kB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu:14.04.1
 ---> 04c5d3b7b065
Step 1 : MAINTAINER itsecorg@cactus.de

<snip>

Running image in container

Running in foreground

tim@ubuntu:~/docker/isodb$ sudo docker run --rm -P --name isodb_test isodb:0.1
2014-12-20 13:00:21 UTC LOG:  database system was interrupted; last known up at 2014-12-20 12:58:24 UTC
2014-12-20 13:00:21 UTC LOG:  database system was not properly shut down; automatic recovery in progress
2014-12-20 13:00:21 UTC LOG:  redo starts at 0/1782F70
2014-12-20 13:00:21 UTC LOG:  record with zero length at 0/1782FB0
2014-12-20 13:00:21 UTC LOG:  redo done at 0/1782F70
2014-12-20 13:00:21 UTC LOG:  last completed transaction was at log time 2014-12-20 12:58:24.396264+00
2014-12-20 13:00:21 UTC LOG:  database system is ready to accept connections
2014-12-20 13:00:21 UTC LOG:  autovacuum launcher started

Running in background

tim@ubuntu:~/docker/isodb$ sudo docker run -d -P --name isodb0.9 --hostname=psql_server isodb:0.9
293fc3635360376d010072455b5b2bad6e5232b1e7aed1ff45a2857155ad4fbd
tim@ubuntu:~/docker/isodb$

Connecting to container

Connecting from host system

in new window, find out listening port:

tim@ubuntu:~/docker/isodb$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                     NAMES
1858243dede0        isodb:0.3           /usr/lib/postgresql/   27 seconds ago      Up 26 seconds       0.0.0.0:49153->5432/tcp   isodb0.9            
tim@ubuntu:~/docker/isodb$ psql -h localhost -p 49153 -d isodb -U itsecorg --password

Connecting from other container via link

Containers can be linked to another container's ports directly using -link remote_name:local_alias in the client's docker run. This will set a number of environment variables that can then be used to connect:

tim@ubuntu:~/docker/isodb$ sudo docker run --rm -t -i --hostname=psql_client --link isodb0.9:ubu1 isodb:0.9 bash
postgres@psql_client:/$ psql -h $UBU1_PORT_5432_TCP_ADDR -p $UBU1_PORT_5432_TCP_PORT -d isodb -U itsecorg --password
Password for user itsecorg: 
psql (9.3.5)
SSL connection (cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256)
Type "help" for help.

isodb=> select * from error limit 3;
          error_id           | error_lvl |           error_txt_ger           |           error_txt_eng            
-----------------------------+-----------+-----------------------------------+------------------------------------
 MSG_NUMBER_CHANGES_RULE_CHG |         4 | Anzahl geaenderte Regeln          | number of rules changed
 MSG_NUMBER_CHANGES_SVC_CHG  |         4 | Anzahl geaenderte Dienste         | number of network services changed
 MSG_NUMBER_CHANGES_OBJ_CHG  |         4 | Anzahl geaenderte Netzwerkobjekte | number of network objects changed
(3 rows)

isodb=>

Running and linking second container

Building webserver:

tim@ubuntu:~/docker/isoweb$ sudo docker build -t isoweb:0.1 .

Running webserver in container:

tim@ubuntu:~/docker/isoweb$ sudo docker run --rm -P --name isoweb_test isoweb:0.1
[Sun Dec 21 12:49:43.697580 2014] [core:warn] [pid 1] AH00111: Config variable ${APACHE_RUN_DIR} is not defined
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.127. Set the 'ServerName' directive  globally to suppress this message

Starting up ubuntu client container and linking to webserver:

tim@ubuntu:~/docker/ubu_client$ sudo docker run --rm -t -i --hostname=ubuclient1 --link isoweb_test:ubu1 ubu_client bash
root@ubuclient1:/# wget --no-check-certificate  https://$UBU1_PORT_443_TCP_ADDR:$UBU1_PORT_443_PORT
--2014-12-21 12:45:32--  https://172.17.0.119/
Connecting to 172.17.0.119:443... connected.
WARNING: cannot verify 172.17.0.119's certificate, issued by '/C=DE/O=Cactus eSecurity/L=Frankfurt/CN=09a2b0b24e0e /emailAddress=itsecorg@cactus.de':
 Self-signed certificate encountered.
   WARNING: certificate common name '09a2b0b24e0e' doesn't match requested host name '172.17.0.119'.
HTTP request sent, awaiting response... 500 Internal Server Error
2014-12-21 12:45:32 ERROR 500: Internal Server Error.

root@ubuclient1:/#

Using phusion/baseimage

tim@pbuilder:~/phusion$ sudo docker search -s 100 "phusion"
NAME                DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
phusion/baseimage   A special image that is configured for cor...   451

tim@ubuntu:~$ sudo docker pull phusion/baseimage:0.9.15
tim@ubuntu:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              14.04.1             04c5d3b7b065        4 days ago          192.7 MB
phusion/baseimage   0.9.15              cf39b476aeec        11 weeks ago        289.4 MB
tim@ubuntu:~$ 

...
# run container with ssh listening on port 2222/tcp and a shell in parallel
tim@pbuilder:~/phusion$ sudo docker run --rm -t -p 192.168.100.96:2222:22 -i phusion/baseimage:0.9.15


...
*** Runit started as PID 95
*** Running bash -l...
root@b2a9f8dfff35:/# 

# run container with ssh listening on port 2222/tcp
tim@pbuilder:~/phusion$ sudo docker run --rm -t -p 2222:22 -i phusion/baseimage:0.9.15
...
*** Runit started as PID 95



tim@pbuilder:~/phusion$ sudo docker run --name="isodb" -h iso-db phusion/baseimage:0.9.15
*** Running /etc/my_init.d/00_regen_ssh_host_keys.sh...
No SSH host key available. Generating one...
Creating SSH2 RSA key; this may take some time ...
Creating SSH2 DSA key; this may take some time ...
Creating SSH2 ECDSA key; this may take some time ...
Creating SSH2 ED25519 key; this may take some time ...
invoke-rc.d: policy-rc.d denied execution of restart.
*** Running /etc/rc.local...
*** Booting runit daemon...
*** Runit started as PID 95

tim@pbuilder:~$ pwd
/home/tim
tim@pbuilder:~$ cat phusion/Dockerfile
# Use phusion/baseimage as base image. To make your builds
# reproducible, make sure you lock down to a specific version, not
# to `latest`! See
# https://github.com/phusion/baseimage-docker/blob/master/Changelog.md
# for a list of version numbers.
FROM phusion/baseimage:0.9.15

# Set correct environment variables.
ENV HOME /root

# Regenerate SSH host keys. baseimage-docker does not contain any, so you
# have to do that yourself. You may also comment out this instruction; the
# init system will auto-generate one during boot.
RUN /etc/my_init.d/00_regen_ssh_host_keys.sh

# Use baseimage-docker's init system.
CMD ["/sbin/my_init"]

# ...put your own build instructions here...
RUN mkdir -p $HOME/.ssh
COPY id_rsa.pub $HOME/.ssh/
RUN cat $HOME/.ssh/id_rsa.pub >>$HOME/.ssh/authorized_keys && rm $HOME/.ssh/id_rsa.pub
RUN chmod 600 $HOME/.ssh/authorized_keys

# Clean up APT when done.
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

tim@pbuilder:~$


tim@pbuilder:~$ sudo docker build -t itsecorg/base phusion/
Sending build context to Docker daemon 4.608 kB
Sending build context to Docker daemon
Step 0 : FROM phusion/baseimage:0.9.15
 ---> cf39b476aeec
Step 1 : ENV HOME /root
 ---> Using cache
 ---> a6321e755610
Step 2 : RUN /etc/my_init.d/00_regen_ssh_host_keys.sh
 ---> Using cache
 ---> 37d8605f992d
Step 3 : CMD ["/sbin/my_init"]
 ---> Using cache
 ---> e6f97e12568c
Step 4 : RUN mkdir -p $HOME/.ssh
 ---> Using cache
 ---> dce7809f4362
Step 5 : COPY id_rsa.pub $HOME/.ssh/
 ---> Using cache
 ---> 3dfba0cc70c0
Step 6 : RUN cat $HOME/.ssh/id_rsa.pub >>$HOME/.ssh/authorized_keys && rm $HOME/.ssh/id_rsa.pub
 ---> Using cache
 ---> e235cefc1126
Step 7 : RUN chmod 600 $HOME/.ssh/authorized_keys
 ---> Using cache
 ---> 15c305685afe
Step 8 : RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
 ---> Using cache
 ---> 1fc643e36a1d
Successfully built 1fc643e36a1d
tim@pbuilder:~$

tim@pbuilder:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
itsecorg/base       latest              1fc643e36a1d        28 minutes ago      292.2 MB


tim@pbuilder:~$ sudo docker run itsecorg/base -p 2222:22
2014/11/21 12:45:32 exec: "-p": executable file not found in $PATH
tim@pbuilder:~$ sudo docker run  -p 2222:22 itsecorg/base
*** Running /etc/my_init.d/00_regen_ssh_host_keys.sh...
*** Running /etc/rc.local...
*** Booting runit daemon...
*** Runit started as PID 12


tim@pbuilder:~$ sudo netstat -tulpen
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      0          9228        819/sshd
tcp6       0      0 :::2222                 :::*                    LISTEN      0          1513329     11865/docker.io
tcp6       0      0 :::22                   :::*                    LISTEN      0          9230        819/sshd
tim@pbuilder:~$

tim@pbuilder:~$ sudo docker ps -a
CONTAINER ID        IMAGE                      COMMAND                CREATED              STATUS                          PORTS               NAMES
d8ae08a0c160        3dfba0cc70c0               /bin/sh -c 'cat $HOM   About a minute ago   Exited (1) About a minute ago                       desperate_almeida
e1aefedbc11c        phusion/baseimage:0.9.15   /sbin/my_init          About an hour ago    Up About an hour                                    isodb
tim@pbuilder:~$ sudo docker rm e1aefedbc11c
Error response from daemon: Impossible to remove a running container, please stop it first or use -f
2014/11/21 13:22:36 Error: failed to remove one or more containers
tim@pbuilder:~$ sudo docker stop e1aefedbc11c
e1aefedbc11c
tim@pbuilder:~$ sudo docker rm e1aefedbc11c
e1aefedbc11c
tim@pbuilder:~$

Changing config files

Replacing settings:

RUN sed -i.orig \
-e "s/^memory_limit\s*=.*/memory_limit = 200M/" \
-e "s/^max_execution_time\s*=.*/max_execution_time = 900/" \
-e "s/^default_charset\s*=.*/default_charset = \"utf\-8\"/" \
-e "s|^include_path\s*=.*|include_path = \"/usr/share/php:/usr/share/lib/php:/usr/share/itsecorg/web/include:/usr/share/itsecorg/etc:/usr/share/itsecorg/web/htdocs/inctxt:/usr/share/itsecorg/web/htdocs/hilfe\"|" \
-e "s|^doc_root\s*=.*|doc_root = /usr/share/itsecorg/web|" \
-e "s/^sql\.safe_mode\s*=.*/sql.safe_mode = On/" \
-e "s/^expose_php\s*=.*/expose_php = Off/" \
-e "s/^display_errors\s*=.*/display_errors = Off/" \
-e "s/^display_startup_errors\s*=.*/display_startup_errors = Off/" \
-e "s/^error_log\s*=.*/error_log = syslog/" \
-e "s/^log_errors_max_len\s*=.*/log_errors_max_len = 0/" \
-e "s/^pgsql\.log_notice\s*=.*/pgsql.log_notice = 1/" \
-e "s|^session\.save_path\s*=.*|session.save_path = /var/itsecorg/session|" \
-e "s/^session\.gc_maxlifetime\s*=.*/session\.gc_maxlifetime = 14400/" \
/etc/php5/apache2/php.ini /etc/php5/cli/php.ini

RUN sed -i.orig \
-e "s|^host\s*all\s*all\s*127.0.0.1/32\s*md5|# &|" \
-e "s|^host\s*all\s*all\s*::1/128\s*md5|# &|" \
/etc/postgresql/main/9.3/pg_hba.conf

Adding settings:

RUN cat <<EOT >> /etc/postgresql/main/9.3/pg_hba.conf
host    all         dbadmin             127.0.0.1/32          md5
host    all         itsecorg            127.0.0.1/32          md5
host    all         +dbbackupusers      127.0.0.1/32          trust
host    all         +configimporters    127.0.0.1/32          trust
host    all         confexporter        127.0.0.1/32          trust
host    all         +secuadmins         127.0.0.1/32          md5
host    all         +reporters          127.0.0.1/32          md5
host    all             all             127.0.0.1/32            md5
host    all             all             ::1/128                 md5
EOT