Docker OpenWRT Image

The goal of this document is to run openwrt images on docker, a container system based on LXC.

Download first the x86 image (there should an x64 image in trunk):

root@turmes /home/zoobab/docker [9]# wget http://downloads.openwrt.org/attitude_adjustment/12.09-rc2/x86/generic/openwrt-x86-generic-rootfs.tar.gz
--2014-02-13 00:27:19--  http://downloads.openwrt.org/attitude_adjustment/12.09-rc2/x86/generic/openwrt-x86-generic-rootfs.tar.gz
Resolving downloads.openwrt.org... 78.24.191.177
Connecting to downloads.openwrt.org|78.24.191.177|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2221396 (2.1M) [application/octet-stream]
Saving to: ‘openwrt-x86-generic-rootfs.tar.gz’

100%[==========================================================================================================================================================================>] 2,221,396   1.26MB/s   in 1.7s   

2014-02-13 00:27:21 (1.26 MB/s) - ‘openwrt-x86-generic-rootfs.tar.gz’ saved [2221396/2221396]

Then import the rootfs.tar.gz into docker via zcat:

root@turmes /home/zoobab/docker [10]# zcat openwrt-x86-generic-rootfs.tar.gz | docker import - openwrt-x86
5f284db5c31d
root@turmes /home/zoobab/docker [11]# docker images
REPOSITORY          TAG                 ID                  CREATED             SIZE
openwrt-x86         latest              5f284db5c31d        6 seconds ago       5.705 MB (virtual 5.705 MB)
busybox             latest              e9aa60c60128        10 months ago       6.825 MB (virtual 6.825 MB)

Run a simple cat inside the docker image:

root@turmes /home/zoobab/docker [14]# docker run -i openwrt-x86 cat /etc/banner
  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 ATTITUDE ADJUSTMENT (12.09, r36088)
 -----------------------------------------------------
  * 1/4 oz Vodka      Pour all ingredients into mixing
  * 1/4 oz Gin        tin with ice, strain into glass.
  * 1/4 oz Amaretto
  * 1/4 oz Triple sec
  * 1/4 oz Peach schnapps
  * 1/4 oz Sour mix
  * 1 splash Cranberry juice
 -----------------------------------------------------
root@turmes /home/zoobab/docker [15]# 

Now starting /sbin/init is more problematic:

root@turmes /home/zoobab/docker [15]# docker run -i openwrt-x86 /sbin/init
init started: BusyBox v1.19.4 (2013-03-06 20:07:44 UTC)
sysinit: date: can't set kernel time zone: Operation not permitted

sysinit: Loading defaults

sysinit: Loading synflood protection

sysinit: Adding custom chains

sysinit: Loading zones

sysinit: Loading forwardings

sysinit: Loading rules

sysinit: Loading redirects

sysinit: Loading includes

sysinit: Optimizing conntrack

sysinit: Loading interfaces

sysinit: dnsmasq: failed to seed the random number generator: No such file or directory

It seems the needed /dev entries are not present:

root@turmes /home/zoobab [7]# docker run -i openwrt-x86 busybox ls /dev
kmsg
ptmx
pts
shm

So let's create them in the tar.gz archive:

root@turmes /home/zoobab/docker [13]# mkdir -pv workdir
mkdir: created directory ‘workdir’
root@turmes /home/zoobab/docker [14]# l
total 4348
-rw-r--r-- 1 root root 2221396 Apr 11  2013 openwrt-x86-generic-rootfs.tar.gz
drwxr-xr-x 2 root root    4096 Feb 13 22:04 workdir
root@turmes /home/zoobab/docker [15]# tar -xzf openwrt-x86-generic-rootfs.tar.gz -C workdir/

Dev directory is empty:

root@turmes /home/zoobab/docker [17]# cd workdir/
root@turmes /home/zoobab/docker/workdir [18]# l
total 56
drwxr-xr-x  2 root root 4096 Mar 23  2013 bin
drwxr-xr-x  2 root root 4096 Mar 23  2013 dev
drwxr-xr-x 13 root root 4096 Mar 23  2013 etc
drwxr-xr-x 14 root root 4096 Mar 23  2013 lib
drwxr-xr-x  2 root root 4096 Mar 23  2013 mnt
drwxr-xr-x  2 root root 4096 Mar 23  2013 overlay
drwxr-xr-x  2 root root 4096 Mar 23  2013 proc
drwxr-xr-x  2 root root 4096 Mar 23  2013 rom
drwxr-xr-x  2 root root 4096 Mar 23  2013 root
drwxr-xr-x  2 root root 4096 Mar 23  2013 sbin
drwxr-xr-x  2 root root 4096 Mar 23  2013 sys
drwxrwxrwt  2 root root 4096 Mar 23  2013 tmp
drwxr-xr-x  6 root root 4096 Mar 23  2013 usr
lrwxrwxrwx  1 root root    4 Mar 23  2013 var -> /tmp
drwxr-xr-x  4 root root 4096 Mar 23  2013 www
root@turmes /home/zoobab/docker/workdir [19]# cd dev/
root@turmes /home/zoobab/docker/workdir/dev [20]# l
total 0
root@turmes /home/zoobab/docker/workdir/dev [21]# 

Let's create the entries:

root@turmes /home/zoobab/docker/workdir/dev [22]# mknod -m 622 console c 5 1
root@turmes /home/zoobab/docker/workdir/dev [23]# mknod -m 666 null c 1 3
root@turmes /home/zoobab/docker/workdir/dev [24]# mknod -m 666 zero c 1 5
root@turmes /home/zoobab/docker/workdir/dev [25]# mknod -m 666 tty c 5 0
root@turmes /home/zoobab/docker/workdir/dev [26]# mknod -m 444 random c 1 8
root@turmes /home/zoobab/docker/workdir/dev [27]# mknod -m 444 urandom c 1 9
root@turmes /home/zoobab/docker/workdir/dev [28]# ls -al
total 8
drwxr-xr-x  2 root root 4096 Feb 13 22:11 .
drwxr-xr-x 16 root root 4096 Mar 23  2013 ..
crw--w--w-  1 root root 5, 1 Feb 13 22:10 console
crw-rw-rw-  1 root root 1, 3 Feb 13 22:10 null
cr--r--r--  1 root root 1, 8 Feb 13 22:10 random
crw-rw-rw-  1 root root 5, 0 Feb 13 22:10 tty
cr--r--r--  1 root root 1, 9 Feb 13 22:11 urandom
crw-rw-rw-  1 root root 1, 5 Feb 13 22:10 zero

Now let's make a tar.gz:

root@turmes /home/zoobab/docker/workdir/dev [29]# cd ..
root@turmes /home/zoobab/docker/workdir [30]# tar -czf ../openwrt-x86-generic-rootfs+deventries.tar.gz .
root@turmes /home/zoobab/docker/workdir [31]# cd ..
root@turmes /home/zoobab/docker [44]# ls -al
total 4356
drwxr-xr-x  3 root   root      4096 Feb 13 22:16 .
drwx------ 36 zoobab zoobab    4096 Feb 13 21:20 ..
-rw-r--r--  1 root   root   2222094 Feb 13 22:16 openwrt-x86-generic-rootfs+deventries.tar.gz
-rw-r--r--  1 root   root   2221396 Apr 11  2013 openwrt-x86-generic-rootfs.tar.gz
drwxr-xr-x 16 root   root      4096 Mar 23  2013 workdir

Now we can import this to docker:

root@turmes /home/zoobab/docker [47]# zcat openwrt-x86-generic-rootfs+deventries.tar.gz | docker import - openwrt-x86-generic-rootfs+deventries
b9daeeb9a878
root@turmes /home/zoobab/docker [48]# docker images
REPOSITORY                               TAG                 ID                  CREATED             SIZE
openwrt-x86-generic-rootfs+deventries    latest              b9daeeb9a878        2 seconds ago       5.705 MB (virtual 5.705 MB)

Let's run a basic command:

root@turmes /home/zoobab [17]# docker run -i openwrt-x86-generic-rootfs+deventries ifconfig
eth0      Link encap:Ethernet  HWaddr F2:06:70:1D:D0:65  
          inet addr:172.17.0.30  Bcast:172.17.255.255  Mask:255.255.0.0
          inet6 addr: fe80::f006:70ff:fe1d:d065/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

root@turmes /home/zoobab [18]# docker run -i openwrt-x86-generic-rootfs+deventries /sbin/init
init started: BusyBox v1.19.4 (2013-03-06 20:07:44 UTC)
sysinit: date: can't set kernel time zone: Operation not permitted

sysinit: Loading defaults

sysinit: Loading synflood protection

sysinit: Adding custom chains

sysinit: Loading zones

sysinit: Loading forwardings

sysinit: Loading rules

sysinit: Loading redirects

sysinit: Loading includes

sysinit: Optimizing conntrack

sysinit: Loading interfaces


You can also run an interactive shell:

root@turmes /home/zoobab [20]# docker run -i -t openwrt-x86-generic-rootfs+deventries /bin/ash


BusyBox v1.19.4 (2013-03-06 20:07:44 UTC) built-in shell (ash)
Enter 'help' for a list of built-in commands.

/ # ps
  PID USER       VSZ STAT COMMAND
    1 root      1248 S    /bin/ash
    6 root      1248 R    ps
/ # 

There seems to be an issue with /var subdirs not created:

/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:51:6F:E7:12:0A  
          inet addr:172.17.0.44  Bcast:172.17.255.255  Mask:255.255.0.0
          inet6 addr: fe80::51:6fff:fee7:120a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:25 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:15551 (15.1 KiB)  TX bytes:648 (648.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

/ # opkg update
Collected errors:
 * opkg_conf_load: Could not create lock file /var/lock/opkg.lock: No such file or directory.
/ # mkdir -p /var/lock
/ # ls
bin      dev      etc      lib      mnt      overlay  proc     rom      root     sbin     sys      tmp      usr      var      www
/ # opkg update
Downloading http://downloads.openwrt.org/attitude_adjustment/12.09/x86/generic/packages/Packages.gz.
Updated list of available packages in /var/opkg-lists/attitude_adjustment.
/ # 

Let's change the root password and try to setup dropbear to connect over ssh:

/ # passwd
Changing password for root
New password: 
Bad password: too weak
Retype password: 
Password for root changed by root
/ # ps
  PID USER       VSZ STAT COMMAND
    1 root      1252 S    /bin/ash
   21 root      1248 R    ps
/ # /etc/init.d/dropbear restart
/ # ps
  PID USER       VSZ STAT COMMAND
    1 root      1260 S    /bin/ash
   44 root       960 S    /usr/sbin/dropbear -P /var/run/dropbear.1.pid -p 22
   45 root      1248 R    ps
/ #

Leave the console OPENED, and in another terminal, try to SSH to the IP address:

zoobab@turmes /home/zoobab [2]$ ssh root@172.17.0.45
root@172.17.0.45's password: 


BusyBox v1.19.4 (2013-03-06 20:07:44 UTC) built-in shell (ash)
Enter 'help' for a list of built-in commands.

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 ATTITUDE ADJUSTMENT (12.09, r36088)
 -----------------------------------------------------
  * 1/4 oz Vodka      Pour all ingredients into mixing
  * 1/4 oz Gin        tin with ice, strain into glass.
  * 1/4 oz Amaretto
  * 1/4 oz Triple sec
  * 1/4 oz Peach schnapps
  * 1/4 oz Sour mix
  * 1 splash Cranberry juice
 -----------------------------------------------------
root@17691dbb9d9a:~# 
</code<

Now let's install one package:

<code>
root@17691dbb9d9a:~# opkg update
Collected errors:
 * opkg_conf_load: Could not create lock file /var/lock/opkg.lock: No such file or directory.
root@17691dbb9d9a:~# mkdir /var/lock
root@17691dbb9d9a:~# opkg update
Downloading http://downloads.openwrt.org/attitude_adjustment/12.09/x86/generic/packages/Packages.gz.
Updated list of available packages in /var/opkg-lists/attitude_adjustment.
root@17691dbb9d9a:~# opkg install 
root@17691dbb9d9a:~# ps
  PID USER       VSZ STAT COMMAND
    1 root      1260 S    /bin/ash
   30 root       960 S    /usr/sbin/dropbear -P /var/run/dropbear.1.pid -p 22
   38 root      1032 S    /usr/sbin/dropbear -P /var/run/dropbear.1.pid -p 22
   39 root      1256 S    -ash
   48 root      1248 R    ps
root@17691dbb9d9a:~# opkg install lighttpd
Installing lighttpd (1.4.30-2) to root...
Downloading http://downloads.openwrt.org/attitude_adjustment/12.09/x86/generic/packages/lighttpd_1.4.30-2_x86.ipk.
Installing libopenssl (1.0.1e-1) to root...
Downloading http://downloads.openwrt.org/attitude_adjustment/12.09/x86/generic/packages/libopenssl_1.0.1e-1_x86.ipk.
Installing zlib (1.2.7-1) to root...
Downloading http://downloads.openwrt.org/attitude_adjustment/12.09/x86/generic/packages/zlib_1.2.7-1_x86.ipk.
Installing libpcre (8.11-2) to root...
Downloading http://downloads.openwrt.org/attitude_adjustment/12.09/x86/generic/packages/libpcre_8.11-2_x86.ipk.
Installing libpthread (0.9.33.2-1) to root...
Downloading http://downloads.openwrt.org/attitude_adjustment/12.09/x86/generic/packages/libpthread_0.9.33.2-1_x86.ipk.
Configuring libpthread.
Configuring libpcre.
Configuring zlib.
Configuring libopenssl.
Configuring lighttpd.
root@17691dbb9d9a:~#

I published a docker image:

docker pull  zoobab/openwrt-x86-attitude

Example to get a shell:

root@turmes /home/zoobab [4]# docker run -i -t zoobab/openwrt-x86-attitude /bin/ash


BusyBox v1.19.4 (2013-03-06 20:07:44 UTC) built-in shell (ash)
Enter 'help' for a list of built-in commands.

/ # ls
bin      dev      etc      lib      mnt      overlay  proc     rom      root     sbin     sys      tmp      usr      var      www
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr E6:7A:80:85:59:68  
          inet addr:172.17.0.46  Bcast:172.17.255.255  Mask:255.255.0.0
          inet6 addr: fe80::e47a:80ff:fe85:5968/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:12 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:7069 (6.9 KiB)  TX bytes:328 (328.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

/ # 

Todolist

  • Fix /sbin/init to get the openwrt banner and shell at the end?
  • Fix the /var entries
  • Change the build to generate some images with dev entries
  • Gte the LUCI web interface to work
  • publish more images with x64 and/or x32 arch
  • publish images with interesting profiles (lighttpd dirlist server, ftpd server, ircd server, tor server, etc…)

Back to top

doc/howto/docker_openwrt_image.txt · Last modified: 2014/02/14 16:41 by zoobab2