I built the system (openSUSE Tumbleweed, because then we can have yast2-docker) with /var/lib/docker on a separate partition:

hatter:~ # mount | grep docker
/dev/sda4 on /var/lib/docker type btrfs (rw,relatime,ssd,space_cache)

Add yourself to the group docker so that you can run docker as a normal user:

# usermod -aG docker roger

Enable the docker service:

hatter:~ # systemctl enable docker.service

Start the docker service

hatter:~ # systemctl start docker.service

Get the official opensuse image from the docker repositories:

roger@hatter:/home/roger $ docker pull opensuse
511136ea3c5a: Pull complete
a113d52c65c3: Pull complete
758c78b4040c: Pull complete
opensuse:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.

Status: Downloaded newer image for opensuse:latest
roger@hatter:/home/roger $ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
opensuse            latest              758c78b4040c        9 weeks ago         267 MB
roger@hatter: /home/roger $ ip addr show docker0
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
    inet 172.17.42.1/16 scope global docker0
      valid_lft forever preferred_lft forever
roger@hatter: /home/roger $ docker run opensuse cat /etc/os-release
NAME=openSUSE
VERSION="13.2 (Harlequin)"
VERSION_ID="13.2"
PRETTY_NAME="openSUSE 13.2 (Harlequin) (x86_64)"
ID=opensuse
ANSI_COLOR="0;32"
CPE_NAME="cpe:/o:opensuse:opensuse:13.2"
BUG_REPORT_URL="https://bugs.opensuse.org"
HOME_URL="https://opensuse.org/"
ID_LIKE="suse"

Run interactively (-i) with a pseudo-TTY (-t):

roger@hatter: /home/roger $ docker run -i -t opensuse:latest /bin/bash
:/ #
roger@hatter: /home/roger $ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
opensuse            latest              758c78b4040c        9 weeks ago         267 MB
roger@hatter: /home/roger $ docker run -i -t opensuse:latest /bin/bash
:/ #
:/ # zypper in mlocate
[...]

In another terminal:

roger@hatter: /home/roger $ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
63ff98af793e        opensuse:latest     "/bin/bash"         2 minutes ago       Up 2 minutes                            evil_thompson
roger@hatter: /home/roger $ docker commit 63ff98af793e opensuse:roger
6764a3e65e9839914021b9d1fc3fcc278e5b97e2c9f6b11098cf6b9c9f3eccf0
roger@hatter: /home/roger $ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
opensuse            roger               6764a3e65e98        35 seconds ago      314.9 MB
opensuse            latest              758c78b4040c        9 weeks ago         267 MB

mlocate is installed in the committed image:

roger@hatter: /home/roger $ docker run opensuse:latest rpm -q mlocate
package mlocate is not installed

roger@hatter: /home/roger $ docker run opensuse:roger rpm -q mlocate
mlocate-0.26-15.1.2.x86_64
roger@hatter: /home/roger $ docker run -t -i opensuse:latest /bin/bash
:/ #

In another terminal:

roger@hatter: /home/roger $ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
15d2e97c22fe        opensuse:latest     "/bin/bash"         32 seconds ago      Up 32 seconds                           lonely_lumiere
roger@hatter: /home/roger $ docker run -t -i opensuse:roger /bin/bash
:/ #

In another terminal:

roger@hatter: /home/roger $ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
b0d10cb9a788        opensuse:roger      "/bin/bash"         4 seconds ago       Up 4 seconds                            agitated_jones

Building from a Dockerfile

roger@hatter: /home/roger/build $ cat Dockerfile
FROM opensuse
RUN zypper --gpg-auto-import-keys --non-interactive install apache2
COPY testaddfile  /etc/testaddfile
roger@hatter: /home/roger/build $ ls
Dockerfile  testaddfile

By default docker build uses the file named Dockerfile in the current directory:

roger@hatter: /home/roger/build $ docker build -t apache .
Sending build context to Docker daemon 4.096 kB
Sending build context to Docker daemon
Step 0 : FROM opensuse
 ---> 758c78b4040c
 Step 1 : RUN zypper --gpg-auto-import-keys --non-interactive install apache2
  ---> Running in 10daed41799d
  Retrieving repository 'repo-non-oss' metadata [.

Automatically importing the following key:

  Repository:       repo-non-oss
  Key Name:         openSUSE Project Signing Key <opensuse@opensuse.org>
  Key Fingerprint:  22C07BA5 34178CD0 2EFE22AA B88B2FD4 3DBDC284
  Key Created:      Mon May  5 08:37:40 2014
  Key Expires:      Thu May  2 08:37:40 2024
  Rpm Name:         gpg-pubkey-3dbdc284-53674dd4


done]
Building repository 'repo-non-oss' cache [....done]
Retrieving repository 'repo-oss' metadata [...........done]
Building repository 'repo-oss' cache [....done]
Retrieving repository 'repo-update' metadata [......done]
Building repository 'repo-update' cache [....done]
Retrieving repository 'repo-update-non-oss' metadata [....done]
Building repository 'repo-update-non-oss' cache [....done]
Loading repository data...
Reading installed packages...
Resolving package dependencies...

The following 8 NEW packages are going to be installed:
  apache2 apache2-prefork apache2-utils libapr-util1 libapr1 libdb-4_8 liblua5_2 logrotate

The following recommended package was automatically selected:
  apache2-prefork

8 new packages to install.
Overall download size: 2.3 MiB. Already cached: 0 B  After the operation, additional 8.2 MiB will be used.
Continue? [y/n/? shows all options] (y): y
Retrieving package libapr1-1.5.1-4.1.3.x86_64 (1/8), 100.1 KiB (232.8 KiB unpacked)
Retrieving: libapr1-1.5.1-4.1.3.x86_64.rpm [.done (141.6 KiB/s)]
Retrieving package libdb-4_8-4.8.30-29.1.2.x86_64 (2/8), 667.7 KiB (  3.1 MiB unpacked)
Retrieving: libdb-4_8-4.8.30-29.1.2.x86_64.rpm [.done (1.0 MiB/s)]
Retrieving package liblua5_2-5.2.3-2.2.1.x86_64 (3/8),  85.8 KiB (203.7 KiB unpacked)
Retrieving: liblua5_2-5.2.3-2.2.1.x86_64.rpm [done]
Retrieving package logrotate-3.8.7-6.1.2.x86_64 (4/8),  58.6 KiB ( 99.6 KiB unpacked)
Retrieving: logrotate-3.8.7-6.1.2.x86_64.rpm [.done]
Retrieving package libapr-util1-1.5.3-2.1.4.x86_64 (5/8),  89.3 KiB (229.8 KiB unpacked)
Retrieving: libapr-util1-1.5.3-2.1.4.x86_64.rpm [done]
Retrieving package apache2-utils-2.4.10-16.1.x86_64 (6/8), 114.5 KiB (217.1 KiB unpacked)
Retrieving: apache2-utils-2.4.10-16.1.x86_64.rpm [.done]
Retrieving package apache2-2.4.10-16.1.x86_64 (7/8),   1.0 MiB (  3.6 MiB unpacked)
Retrieving: apache2-2.4.10-16.1.x86_64.rpm [..done (972.1 KiB/s)]
Retrieving package apache2-prefork-2.4.10-16.1.x86_64 (8/8), 241.8 KiB (595.9 KiB unpacked)
Retrieving: apache2-prefork-2.4.10-16.1.x86_64.rpm [.done (1.1 MiB/s)]
Checking for file conflicts: [.......done]
(1/8) Installing: libapr1-1.5.1-4.1.3 [.......done]
(2/8) Installing: libdb-4_8-4.8.30-29.1.2 [............done]
(3/8) Installing: liblua5_2-5.2.3-2.2.1 [......done]
(4/8) Installing: logrotate-3.8.7-6.1.2 [.......done]
(5/8) Installing: libapr-util1-1.5.3-2.1.4 [........done]
(6/8) Installing: apache2-utils-2.4.10-16.1 [.........done]
(7/8) Installing: apache2-2.4.10-16.1 [............done]
Additional rpm output:
/usr/sbin/suexec2: cannot verify root:root 0755 - not listed in /etc/permissions
Updating /etc/sysconfig/apache2...
looking for old 2.0 modules to be renamed...
!!ATTENTION! authz_default was removed from apache version 2.4 or later, CHECK YOUR CONFIGURATION!!!
Done.

(8/8) Installing: apache2-prefork-2.4.10-16.1 [..........done]
 ---> 7db9d92081e4
 Removing intermediate container 10daed41799d
 Step 2 : COPY testaddfile /etc/testaddfile
  ---> 383b913130ca
  Removing intermediate container 143f73a3fbc1
  Successfully built 383b913130ca
roger@hatter: /home/roger/build $ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
apache              latest              383b913130ca        About a minute ago   316.9 MB
opensuse            roger               6764a3e65e98        41 minutes ago       314.9 MB
opensuse            latest              758c78b4040c        9 weeks ago          267 MB
roger@hatter: /home/roger/build $ docker run apache cat /etc/testaddfile
FOO BAR
roger@hatter: /home/roger/build $ docker run -i -t apache /bin/bash
:/ # cat /etc/testaddfile
FOO BAR
:/ #
roger@hatter: /home/roger $ docker run -t -i apache /bin/bash
:/ # echo "Hello from docker" > /srv/www/htdocs/index.html
:/ #

Leave running and in another terminal commit:

roger@hatter: /home/roger $ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
907e169505b4        apache:latest       "/bin/bash"         24 seconds ago      Up 23 seconds                           clever_morse
roger@hatter: /home/roger $ docker commit 907e169505b4 apache
cad948563182f0537d0ba89497f5ae3392872bf3064ef99c422efc81bf4b4f18
roger@hatter: /home/roger $ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
907e169505b4        383b913130ca        "/bin/bash"         2 minutes ago       Up 2 minutes                            clever_morse

Try running apache in the foreground:

roger@hatter: /home/roger $ docker run -p 80:80 apache /usr/sbin/apache2ctl -D FOREGROUND
/usr/sbin/apache2ctl: line 64: which: command not found
/usr/sbin/apache2ctl: line 66: which: command not found
httpd2: Syntax error on line 185 of /etc/apache2/httpd.conf: Could not open configuration file /etc/apache2/sysconfig.d/include.conf: No such file or directory

We need to install the package which and touch the file /etc/apache2/sysconfig.d/include.conf (don’t know why this is not present).

roger@hatter: /home/roger $ docker run -i -t apache /bin/bash
:/ # touch /etc/apache2/sysconfig.d/include.conf
:/ # zypper in which
Loading repository data...
Reading installed packages...
Resolving package dependencies...

The following NEW package is going to be installed:
  which

1 new package to install.
Overall download size: 30.9 KiB. Already cached: 0 B  After the operation, additional 69.8 KiB will be used.
Continue? [y/n/? shows all options] (y):

Retrieving package which-2.20-4.1.2.x86_64                                (1/1),  30.9 KiB ( 69.8 KiB unpacked)
Retrieving: which-2.20-4.1.2.x86_64.rpm .....................................................[done (7.3 KiB/s)]
Checking for file conflicts: ............................................................................[done]
(1/1) Installing: which-2.20-4.1.2 ......................................................................[done]
:/ #

In other terminal:

roger@hatter: /home/roger $ docker commit a2a92114f07e apache
6d4f0dcf4b48464cd923c9a15687bea21486eb690c8daab83e48184ffeae0c01

Now run detached (-d), mapping port 80 to host’s port 80:

roger@hatter: /home/roger $ docker run -d -p 80:80 apache /usr/sbin/apache2ctl -D FOREGROUND
68a7dbd52106c1427987b8bd99c22509172b23ed7503b07fb2dd3c771adbd32b
roger@hatter: /home/roger $ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                NAMES
68a7dbd52106        apache:latest       "/usr/sbin/apache2ct   4 seconds ago       Up 3 seconds        0.0.0.0:80->80/tcp   kickass_tesla
roger@hatter: /home/roger $ curl http://localhost/index.html
Hello from docker