Create Snappy Ubuntu as a Docker Image
Snappy ubuntu core is the latest member of ubuntu family that specifically designed to run on Linux containers. To put it simple it's a stripped down ubuntu with some advanced features such as transactional upgrades/rollback to bring more stability, security with AppArmor and new snappy package manager instead of apt-get.
I wanted to run snappy ubuntu on a docker container, however I couldn't find the base snappy image on the docker hub to pull. So I decided to make and push it myself to docker hub.
First we need to download the Snappy image. It can be downloaded from https://developer.ubuntu.com/en/snappy/start/#try-x86
# wget http://releases.ubuntu.com/15.04/ubuntu-15.04-snappy-amd64-generic.img.xz
It comes as a XZ compressed IMG filesystem dumped image. we will unzx it:
# unzx ubuntu-15.04-snappy-amd64-generic.img.xz
For ISO images we simply can loop mount and access them:
# mkdir /mnt/iso
# mount -o loop image.iso /mnt/iso
And proceed to read the mounted directory as tar and create the docker image from STDIN:
# tar -C /mnt/iso -c . | docker import - yourrepo/yourimage:anytag
However, for IMG dump images it's a bit hassle-y:
1. Load the nbd kernel module with max_parts option if you are in a debian-based machine:
# modprobe nbd max_parts=16
2. Mount the image to /dev/nbd0 with qemu:
# qemu-nbd -c /dev/nbd0 ubuntu-15.04-snappy-amd64-generic.img
3. Ask kernel to re-read the partition table:
# partprobe /dev/nbd0
We can see the filsystem within this image via fdisk:
# fdisk -l /dev/nbd0
Disk /dev/nbd0: 3,6 GiB, 3899999744 bytes, 7617187 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 374F5ED9-98FE-47B5-B430-A8983D7CB41B
Device Start End Sectors Size Type
/dev/nbd0p1 8192 16383 8192 4M BIOS boot
/dev/nbd0p2 16384 278527 262144 128M EFI System
/dev/nbd0p3 278528 2375679 2097152 1G Linux filesystem
/dev/nbd0p4 2375680 4472831 2097152 1G Linux filesystem
/dev/nbd0p5 4472832 7614463 3141632 1,5G Linux filesystem
Our desired contents are located in nbd0p3, so we will mount it:
# mount /dev/nbd0p3 /mnt/snappy/
There we are! We have all that is required to create our docker image:
To check the newly created image, let's list the local docker images:
Cool! Let's run it and access to our docker container:
It's up and running alongside with other docker containers:
I wanted to run snappy ubuntu on a docker container, however I couldn't find the base snappy image on the docker hub to pull. So I decided to make and push it myself to docker hub.
First we need to download the Snappy image. It can be downloaded from https://developer.ubuntu.com/en/snappy/start/#try-x86
# wget http://releases.ubuntu.com/15.04/ubuntu-15.04-snappy-amd64-generic.img.xz
It comes as a XZ compressed IMG filesystem dumped image. we will unzx it:
# unzx ubuntu-15.04-snappy-amd64-generic.img.xz
For ISO images we simply can loop mount and access them:
# mkdir /mnt/iso
# mount -o loop image.iso /mnt/iso
And proceed to read the mounted directory as tar and create the docker image from STDIN:
# tar -C /mnt/iso -c . | docker import - yourrepo/yourimage:anytag
However, for IMG dump images it's a bit hassle-y:
1. Load the nbd kernel module with max_parts option if you are in a debian-based machine:
# modprobe nbd max_parts=16
2. Mount the image to /dev/nbd0 with qemu:
# qemu-nbd -c /dev/nbd0 ubuntu-15.04-snappy-amd64-generic.img
3. Ask kernel to re-read the partition table:
# partprobe /dev/nbd0
We can see the filsystem within this image via fdisk:
# fdisk -l /dev/nbd0
Disk /dev/nbd0: 3,6 GiB, 3899999744 bytes, 7617187 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 374F5ED9-98FE-47B5-B430-A8983D7CB41B
Device Start End Sectors Size Type
/dev/nbd0p1 8192 16383 8192 4M BIOS boot
/dev/nbd0p2 16384 278527 262144 128M EFI System
/dev/nbd0p3 278528 2375679 2097152 1G Linux filesystem
/dev/nbd0p4 2375680 4472831 2097152 1G Linux filesystem
/dev/nbd0p5 4472832 7614463 3141632 1,5G Linux filesystem
Our desired contents are located in nbd0p3, so we will mount it:
# mount /dev/nbd0p3 /mnt/snappy/
There we are! We have all that is required to create our docker image:
# tar -C /mnt/snappy/ -c . | docker import - arvinep/ubuntu:snappy
To check the newly created image, let's list the local docker images:
# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
arvinep/ubuntu-snappy snappy 2e796faa9adc 9 minutes ago 604.8 MB
ubuntu latest d55e68e6cc9c 26 hours ago 187.9 MB
Cool! Let's run it and access to our docker container:
# docker run -it arvinep/ubuntu:snappy /bin/bash
It's up and running alongside with other docker containers:
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
25d60fa0238d arvinep/ubuntu:snappy "/bin/bash" About a minute ago Up About a minute sleepy_banach
1cff710b5604 ubuntu:latest "/bin/bash" 2 hours ago Up 2 hours angry_davinci
afe31fbcbf7d ubuntu:latest "/bin/bash" 2 hours ago Up 2 hours serene_lovelace
74a46b4b203f ubuntu:latest "/bin/bash" 2 hours ago Up 2 hours tender_bartik
25d60fa0238d arvinep/ubuntu:snappy "/bin/bash" About a minute ago Up About a minute sleepy_banach
1cff710b5604 ubuntu:latest "/bin/bash" 2 hours ago Up 2 hours angry_davinci
afe31fbcbf7d ubuntu:latest "/bin/bash" 2 hours ago Up 2 hours serene_lovelace
74a46b4b203f ubuntu:latest "/bin/bash" 2 hours ago Up 2 hours tender_bartik
I have pushed the snappy ubuntu to docker hub so you can pull and enjoy it:
# docker run -it arvinep/ubuntu-snappy /bin/bash
It does not appear too complicated when it comes to creating a new snappy Ubuntu as a docker image. It seems to be quite clear.
ReplyDelete