Currently Browsing: Docker

Docker swarm communication error fix: Storage Driver update

After adding a new worker node to a swarm, it had issues communicating with other services/containers on the overlay network — this worked fine when adding previous nodes (both manager and worker). It turned out that this newest node was installed with a new image that defaulted the storage driver to overlay2 where the previously installed nodes were using aufs. All the nodes are on Ubuntu 16.04.

You can check for support with the grep aufs /proc/filesystems command. If you don’t see any results, you may need to install sudo apt-get install linux-image-extra-`uname -r` (or other updates). If you do have aufs support and Docker defaults to overlay2, you can spec the storage driver in /etc/docker/daemon.json via:

{
  "storage-driver": "aufs"
}

and restart Docker (via systemctl restart docker.service or similar). Note that any images or containers created with the old storage driver will not be accessible to the new one so you should delete/prune/etc what you won’t need and stop & remove all running containers prior to restarting.

Docker: fix terminal width issue

Sometimes the terminal size reverts to the 80×24 default size, particularly when using Docker-in-Docker. To fix, pass the terminal specs when calling `docker run` or `docker exec`:

docker run --rm -it -e COLUMNS=$COLUMNS -e LINES=$LINES -e TERM=$TERM -it ubuntu:16.04

(see issue here)

Install amqp-ext PHP extension to Apache in Docker

I wanted to add RabbitMQ support to my PHP app and prefer to use the PECL amqp package:

This extension can communicate with any AMQP spec 0-9-1 compatible server, such as RabbitMQ, OpenAMQP and Qpid, giving you the ability to create and delete exchanges and queues, as well as publish to any exchange and consume from any queue.

Using pecl install won’t install all the dependencies. There are various options to how to solve this including fetching from Git repos, however this is the one that worked for me and seemed the most straight-forward (ymmv). See below for code used in a Dockerfile with base image FROM php:7.1.14-apache which uses debian:jessie, so the native commands should work in similar Debian/Ubuntu linux distros.

RUN curl http://in.archive.ubuntu.com/ubuntu/ubuntu/pool/universe/libr/librabbitmq/librabbitmq4_0.8.0-1_amd64.deb -o librabbitmq4_0.8.0-1_amd64.deb
RUN curl http://in.archive.ubuntu.com/ubuntu/ubuntu/pool/universe/libr/librabbitmq/librabbitmq-dev_0.8.0-1_amd64.deb -o librabbitmq-dev_0.8.0-1_amd64.deb
RUN dpkg -i librabbitmq4_0.8.0-1_amd64.deb
RUN dpkg -i librabbitmq-dev_0.8.0-1_amd64.deb
RUN pecl install amqp-1.9.3 && docker-php-ext-enable amqp

Note if you do use this in a Dockerfile, you can combine some of the statements to optimize layers. You also may need to update the lib version if it’s updated or if you change the PECL version to install.

Docker: get hash from image name

Particularly if you are using a static image name like “latest” or “develop”, it is useful to be able to know and verify the exact version via the sha256 hash. To get the value you can use:

docker inspect --format='{{index .RepoDigests 0}}' repo/image-name:tag

To use this in a CI/CD workflow for Docker Swarm, you can do something like this:

SHA=$(docker inspect --format='{{index .RepoDigests 0}}' repo/image-name:tag)
docker service update --image $SHA --detach=true --with-registry-auth service-name

Remove Docker images with no tag

Sometimes, particularly on a development environment, you can end up with a lot of Docker images with no tags, which aren’t much practical use. To get rid of them you can do:

docker rmi $(docker images | grep none | awk '{ print $3 }')

Ones in use or with child images will not be deleted and result in output warning, but the rest will be removed so you can deal with the remaining ones as needed.

« Previous Entries