Hong Zheng

Docker practice

Hong Zheng / 2017-08-23

Basic commands

Run a container from an image
docker run -it my_image
The -it instructs Docker to allocate a pseudo-TTY connected to the container’s stdin; creating an interactive bash shell in the container.

Quit from a container with interactive bash shell
exit or
ctrl+p followed by ctrl+q

Stop a container
docker stop my_container

Remove a container (only stopped containers can be removed)
docker rm my_container

Stop and remove all containers
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

Remove images
docker rmi my_image

List all exited containers
docker ps -aq -f status=exited

Remove stopped containers
docker ps -aq -f status=exited --no-trunc | xargs docker rm

Remove dangling/untagged images
docker images -q --filter dangling=true | xargs docker rmi

Remove containers created by a specific image
docker ps -a | grep 'my_image' | awk '{print $1}' | xargs docker rm

Using existing images from docker hub

Take one data processing tool, catmandu, for example.

Pull image from docker hub:
docker pull librecat/catmandu

Start a container from the image, and mount a local directory onto /home/catmandu/Home directory inside the container:
docker run -v /home/yourdirectory:/home/catmandu/Home -it librecat/catmandu
The local directory should be writable for all users, which means, the permission triads look like “drwxrwxrwx”. To change the permission of the directory, use chmod 777 /home/yourdirectory

If you have a file named “test.json” in /home/yourdirectory/, and would like to convert it to CSV format, once inside the container, you should be able to find the same file under /home/catmandu/Home/. Then:

catmandu convert JSON to CSV < /home/catmandu/Home/test.json > /home/catmandu/Home/test.csv

The converted file “test.csv” would appear in /home/yourdirectory/ as well.

Customize dockerfile

Some example Dockerfile of commonly-used tools in bioinformatics:


Take the Dockerfile of samtools/bcftools/htslib for example:

FROM ubuntu:16.04
MAINTAINER Hong Zheng <zhengh42@stanford.edu>

# Install dependencies
RUN apt-get update && apt-get install -y \
  curl \
  build-essential \
  libncurses-dev \
  zlib1g-dev \
  libz-dev \
  libbz2-dev \

# Set up
ENV SAMTOOLS_URL=https://github.com/samtools/samtools/releases/download/
ENV BCFTOOLS_URL=https://github.com/samtools/bcftools/releases/download/
ENV HTSLIB_URL=https://github.com/samtools/htslib/releases/download/

# Download; untar & decompress; remove tr.bz2 file; compile & install samtools; remove unnecessary files
RUN curl -SLo ${DEST_DIR}/samtools-${SAMTOOLS_RELEASE}.tar.bz2 ${SAMTOOLS_URL}/${SAMTOOLS_RELEASE}/samtools-${SAMTOOLS_RELEASE}.tar.bz2 && \
  tar -xf ${DEST_DIR}/samtools-${SAMTOOLS_RELEASE}.tar.bz2 -C ${DEST_DIR} && \
  rm ${DEST_DIR}/samtools-${SAMTOOLS_RELEASE}.tar.bz2 && \
  cd ${DEST_DIR}/samtools-${SAMTOOLS_RELEASE} && \
  ./configure && \
  make && \
  make install && \
  rm -rf ${DEST_DIR}/samtools-${SAMTOOLS_RELEASE} && \
  curl -SLo ${DEST_DIR}/bcftools-${BCFTOOLS_RELEASE}.tar.bz2 ${BCFTOOLS_URL}/${BCFTOOLS_RELEASE}/bcftools-${BCFTOOLS_RELEASE}.tar.bz2 && \
  tar -xf ${DEST_DIR}/bcftools-${BCFTOOLS_RELEASE}.tar.bz2 -C ${DEST_DIR} && \
  rm ${DEST_DIR}/bcftools-${BCFTOOLS_RELEASE}.tar.bz2 && \
  cd ${DEST_DIR}/bcftools-${BCFTOOLS_RELEASE} && \
  ./configure && \
  make && \
  make install && \
  rm -rf ${DEST_DIR}/bcftools-${HTSLIB_RELEASE} && \
  curl -SLo ${DEST_DIR}/htslib-${HTSLIB_RELEASE}.tar.bz2 ${HTSLIB_URL}/${HTSLIB_RELEASE}/htslib-${HTSLIB_RELEASE}.tar.bz2 && \
  tar -xf ${DEST_DIR}/htslib-${HTSLIB_RELEASE}.tar.bz2 -C ${DEST_DIR} && \
  rm ${DEST_DIR}/htslib-${HTSLIB_RELEASE}.tar.bz2 && \
  cd ${DEST_DIR}/htslib-${HTSLIB_RELEASE} && \
  ./configure && \
  make && \
  make install && \
  rm -rf ${DEST_DIR}/htslib-${HTSLIB_RELEASE}

CMD ["/bin/bash"]

Build new image from the Dockerfile:
docker build -f samtools/1.5all/Dockerfile -t zhengh42/samtools:1.5all samtools/1.5all

After that, an image named “zhengh42/samtools” would appear if we run docker images.

How to use this samtools from this image?

docker run -v /home/yourdirectory:/mnt zhengh42/samtools:1.5all samtools view /mnt/yourfiles

/home/yourdirectory stores your files, and it is mounted into /mnt inside docker containers.