paulgorman.org/technical

Docker (and Project Atomic and CoreOS)

(Updated March 2016)

See newer notes at https://paulgorman.org/technical/docker.txt.

Docker

Docker is a container system that traditionally provides single-process, non-persistent containers (though data persistence is possible with Docker Volumes). Docker has become popular for packaging and distributing software, particularly microservice components.

Docker has a Docker Server with containers as clients. The server and client are provided by the same binary. Optionally, a third component, the Docker Registry, stores Docker images and metadata.

A note about how file systems normally work in Docker: a normal Docker container has a read-only file system based on the Docker image from which it was created. Above this, the container has a read-write layer that stores differences from the read-only original image layer. However, when the container is destroyed, the changes in the read-write layer are discarded; future spin-ups of the Docker image start fresh with the original read-only layer. Docker calls this the Union file system.

Docker is part of the Debian package system (docker.io), but we want a more current version from Docker’s repository.

# apt-key adv \
--keyserver hkp://p80.pool.sks-keyservers.net:80 \
--recv-keys 58118E89F3A912897C070ADBF76221572C52609D

Create /etc/apt/sources.list.d/docker.list, and add one of these:

deb https://apt.dockerproject.org/repo debian-jessie main
deb https://apt.dockerproject.org/repo debian-stretch main

(Note that apt-cacher-ng has a problem with this. Use https as an alternative. https://github.com/docker/docker/issues/9592)

 # apt-get install apt-transport-https
 # apt-get update
 # apt-get purge 'lxc-docker*' 'docker.io*'
 # apt-get install docker-engine
 % docker --help

List docker containers:

# docker ps -a
# docker images -a

Dockerfiles

A Dockerfile specifies how to build a container.

FROM fedora:23

MAINTAINER Paul Gorman

RUN dnf update && dnf install asterisk && dnf clean all

ADD ./sip.conf /etc/asterisk/
ADD ./extensions.conf /etc/asterisk/

EXPOSE 5060-5061/tcp
EXPOSE 10000-20000/udp

CMD ["/usr/sbin/asterisk"]

Assuming ‘Dockerfile’ is in our current directory, build the container with:

% docker build --tag "my_base_container" ./

Example

# docker pull fedora
# docker run -it fedora /bin/bash
[root@2ab31fa5597a /]# dnf update
[root@2ab31fa5597a /]# dnf install asterisk

Project Atomic

Project Atomic is a light-weight Red Hat-based Docker supervisor OS.

http://www.projectatomic.io/

CentOS has Atomic Host builds available as ISO for bare-metal install, Amazon AMI image, and QCOW2 image for KVM.

cloud-init

Before spinning up our first Atomic host, we need cloud-init in place to handle early initialization of the instance. cloud-init does things like:

https://docs.docker.com/engine/reference/commandline/volume_create/