# docker <command> [options]Josip Maslać, Javantura, 02/2017
Josip Maslać
(java) developer
average GNU/Linux user
cofounder and owner of
open-source project that automates the deployment of applications inside software containers

virtual machines
transportable


lightweight & fast
image
(image) registry
container
image ⇒ template for a container
OOP analogy: classes & objects
# docker <command> [options]$ docker pull ubuntu # docker hub (hub.docker.com)$ docker images # list all images
REPOSITORY TAG IMAGE ID CREATED SIZE
nabava/solr latest a53291b74a7c 5 weeks ago 1.03 GB
nabava/mysql latest b3a5e0cb42b3 5 weeks ago 718.5 MB
nabava/java latest 05608501f34b 5 weeks ago 808.2 MB
ubuntu latest 104bec311bcd 3 weeks ago 128.9 MB$ docker images | grep ubuntu
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 104bec311bcd 3 weeks ago 128.9 MB
ubuntu 16.04 104bec311bcd 3 weeks ago 128.9 MB
ubuntu 14.04.5 ac192759f936 3 months ago 187.9 MB# docker run [options] <image> [command]$ docker run ubuntu:16.04 echo "hello"
hello
$$ docker ps # list running containers
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4802ebe8de68 nabava/haproxy "bash /run.sh" 4 weeks ago Up 3 hours haproxy
03f60e3ba466 nabava/solr "/bin/bash /run.sh" 5 weeks ago Up 4 hours solr
3a4c3321be1f nabava/mysql "/bin/bash run.sh" 5 weeks ago Up 4 hours 0.0.0.0:23306->3306/tcp mysql$ docker ps -a # list all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
208651c624d5 ubuntu:16.04 "echo hello" 10 minutes ago Exited (0) 10 minutes ago naughty_lovelace
4802ebe8de68 nabava/haproxy "bash /run.sh" 4 weeks ago Up 3 hours haproxy
03f60e3ba466 nabava/solr "/bin/bash /run.sh" 5 weeks ago Up 4 hours solr
3a4c3321be1f nabava/mysql "/bin/bash run.sh" 5 weeks ago Up 4 hours 0.0.0.0:23306->3306/tcp mysqlcontainer is alive if: ps ax | wc -l > 0
Dockerfile
FROM ubuntu:16.04
MAINTAINER Josip Maslac <josip.maslac@nabava.net>
RUN apt-get update
RUN apt-get -y apache2
RUN apt-get -y libapache2-mod-php
ADD configuration /etc/myconfiguration
CMD ["/usr/sbin/apache2", "-DFOREGROUND"]$ docker build -t <image_name> .$ docker push <image_name>
container volumes
# -v <host_folder>:<container_folder>$ docker run -v /home/developer/mysql-data:/var/lib/mysql mysqlour situation

ideal: have the same setup in dev environment
./dev_env.sh developer_private_key# dev_env.sh - something like:
docker login our.private.registry
docker run mysql
docker run some_service
docker run some_other_service
docker run webappin a non java world
docker run -v /home/developer/app:/srv/www/htdocs php-webappuse (host) text editor for /home/developer/app
Java world:
Application containers (tomcat)
where your compiled (java) apps are running
IDEs (Eclipse)
tightly integrated with app containers
managing (start/stop, configure) && debugging
connect remotely to tomcat

other stuff in our tomcat container (html2pdf, custom fonts etc.)
development environment <> production
eclipse image
on top of tomcat image

$ docker run eclipseX Windows System (X11)
basic framework for a GUI environment
client-server
localhost (unix socket)
network
X server
sends graphics resources and keyboard/mouse events to X clients

key part: /tmp/.X11-unix
# Dockerfile:
FROM nabava/tomcat-nabava
MAINTAINER Josip Maslac <josip.maslac@nabava.net>
RUN apt-get update
# download/install eclipse
...$ docker run -it -v /tmp/.X11-unix:/tmp/.X11-unix eclipse /bin/bash
root@208651c624d5:/# /eclipse/eclipse
Failed to connect to Mir: Failed to connect to server socket: No such file or directory
Unable to init server: Could not connect: Connection refused
Eclipse: Cannot open display:
...
root@208651c624d5:/# exit$DISPLAY env variable
$ docker run -it -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix eclipse /bin/bash
root@208651c624d5:/# /eclipse/eclipse
Failed to connect to Mir: Failed to connect to server socket: No such file or directory
Unable to init server: Could not connect: Connection refused
Eclipse: Cannot open display:
...
root@208651c624d5:/# exitxhost +local:docker # enable local docker containers to access X serverxhost +local:docker
-v /tmp/.X11-unix:/tmp/.X11-unix
-e DISPLAY=$DISPLAY
install graphic libraries
depending on the application(s) we want to run
process owner
$ docker run -it ubuntu whoami
rootfile ownership & permissions
docker run -it -v /home/user/workspace:/workspace ... eclipse# on the host
$ ls -ls /home/user
...
drwxr-xr-x 5 root root 4096 Sij 3 12:28 workspace
...DEV_GROUP_ID=$( id -g ) # get current user group ID
DEV_USER_ID=$( id -u ) # get current user ID
docker run -e DEV_GROUP_ID -e DEV_USER_ID ... eclipse...
CMD ["/bin/bash","/run.sh"]groupadd -g $DEV_GROUP_ID users
useradd -g $DEV_GROUP_ID -u $DEV_USER_ID developer
...
chown -R developer:users /workspace
...
exec gosu developer /eclipse/./eclipse -data /home/developer/workspacepasting
text - yes
files - no go
no "external" tools available
other then those installed in image/container
you cannot get "out of" a container
(to using X11 unix socket)
ssh + X11 forwarding (-X switch)
VNC
full desktop installed inside container
doable!
Xming X Server for Windows
running ssh daemon inside a container
exposed on some port
putty to that container
("X11 forwarding" checked)
start you GUI app

minimum dev. environment setup time
dev = production
not 100% but close enough
learned someting new
and now talking about it