Docker & why we should use it
Vicențiu Ciorbaru
Software Engineer @ MariaDB Foundation
*
*
© 2018 MariaDB Foundation
Agenda
© 2018 MariaDB Foundation
What is Docker
© 2018 MariaDB Foundation
Why Docker?
© 2018 MariaDB Foundation
How Docker Works
© 2018 MariaDB Foundation
What is a docker image
© 2018 MariaDB Foundation
What is a docker container
© 2018 MariaDB Foundation
What is a Dockerfile
© 2018 MariaDB Foundation
What is a Dockerfile
# Base image
FROM ubuntu:16.04
# Create user develop
RUN useradd -m -b /home --uid 1000 develop
# Install build dependencies
RUN apt-get update \
&& apt-get install -y \
git cmake gcc g++ \
libncurses5-dev \
libgnutls-dev \
bison \
&& rm -rf /var/lib/apt/lists/*
# Copy the repository
ADD ./server /home/develop/server
RUN chown -R develop /home/develop
USER develop
# Build the server
WORKDIR /home/develop/server
RUN cmake . -DCMAKE_BUILD_TYPE=Debug
RUN make -j13
# Run tests when container is run
WORKDIR /home/develop/server/mysql-test
CMD ./mtr --par=20 --suite=main --force
© 2018 MariaDB Foundation
How a docker image is constructed
# Base image
FROM ubuntu:16.04
# Create user develop
RUN useradd -m -b /home --uid 1000 develop
# Install build dependencies
RUN apt-get update \
&& apt-get install -y \
git cmake gcc g++ \
libncurses5-dev \
libgnutls-dev \
bison \
&& rm -rf /var/lib/apt/lists/*
ubuntu:16.04 (97 packages installed) ~ 112MB
© 2018 MariaDB Foundation
How a docker image is constructed
# Base image
FROM ubuntu:16.04
# Create user develop
RUN useradd -m -b /home --uid 1000 develop
# Install build dependencies
RUN apt-get update \
&& apt-get install -y \
git cmake gcc g++ \
libncurses5-dev \
libgnutls-dev \
bison \
&& rm -rf /var/lib/apt/lists/*
ubuntu:16.04 (97 packages installed) ~ 112MB
useradd
© 2018 MariaDB Foundation
How a docker image is constructed
# Base image
FROM ubuntu:16.04
# Create user develop
RUN useradd -m -b /home --uid 1000 develop
# Install build dependencies
RUN apt-get update \
&& apt-get install -y \
git cmake gcc g++ \
libncurses5-dev \
libgnutls-dev \
bison \
&& rm -rf /var/lib/apt/lists/*
ubuntu:16.04 (97 packages installed) ~ 112MB
useradd
dependencies
© 2018 MariaDB Foundation
How a docker image is constructed
# Copy the repository
ADD ./server /home/develop/server
RUN chown -R develop /home/develop
USER develop
# Build the server
WORKDIR /home/develop/server
RUN cmake . -DCMAKE_BUILD_TYPE=Debug
RUN make -j13
# Run tests when container is run
WORKDIR /home/develop/server/mysql-test
CMD ./mtr --par=20 --suite=main --force
ubuntu:16.04 (97 packages installed) ~ 112MB
useradd
dependencies
server code in /home/develop
© 2018 MariaDB Foundation
How a docker image is constructed
# Copy the repository
ADD ./server /home/develop/server
RUN chown -R develop /home/develop
USER develop
# Build the server
WORKDIR /home/develop/server
RUN cmake . -DCMAKE_BUILD_TYPE=Debug
RUN make -j13
# Run tests when container is run
WORKDIR /home/develop/server/mysql-test
CMD ./mtr --par=20 --suite=main --force
ubuntu:16.04 (97 packages installed) ~ 112MB
useradd
dependencies
server code in /home/develop
configured
© 2018 MariaDB Foundation
How a docker image is constructed
# Copy the repository
ADD ./server /home/develop/server
RUN chown -R develop /home/develop
USER develop
# Build the server
WORKDIR /home/develop/server
RUN cmake . -DCMAKE_BUILD_TYPE=Debug
RUN make -j13
# Run tests when container is run
WORKDIR /home/develop/server/mysql-test
CMD ./mtr --par=20 --suite=main --force
ubuntu:16.04 (97 packages installed) ~ 112MB
useradd
dependencies
server code in /home/develop
configured
compiled
© 2018 MariaDB Foundation
Installing Docker
$ sudo apt install docker.io
$ sudo systemctl enable docker.io
$ sudo systemctl start docker.io
$ docker ps # By default, only root can run docker commands
Got permission denied while trying to connect to the Docker daemon socket
$ sudo groupadd docker # May already exist
$ sudo usermod -a -G docker $USER
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
© 2018 MariaDB Foundation
Running MariaDB tests in Docker
$ mkdir ~/Workspace/MariaDB-docker
$ cd ~/Workspace/MariaDB-docker
$ vim Dockerfile # Use the dockerfile from previous slides
$ docker build . -t mariadb-test
$ docker run -i -t mariadb-test
© 2018 MariaDB Foundation
How to get reproducible builds
ubuntu:16.04 (97 packages installed) ~ 112MB
useradd
dependencies
server code in /home/develop
configured
compiled
Build Environment�
152M build-env.tgz
© 2018 MariaDB Foundation
How to get reproducible builds
ubuntu:16.04 (97 packages installed) ~ 112MB
useradd
dependencies
server code in /home/develop
configured
compiled
Test Environment
3.1GB test-env.tgz
:( Too big, code and binaries take too much space
© 2018 MariaDB Foundation
How to get reproducible builds
ubuntu:16.04 (97 packages installed) ~ 112MB
useradd
dependencies
server code in /home/develop
configured
compiled
Test Environment
3.1GB test-env.tgz
:( Too big, code and binaries take too much space
We need to remove the code from the image.
© 2018 MariaDB Foundation
Keep images small, use volumes
# Base image
FROM ubuntu:16.04
# Create user develop
RUN useradd -b /home --uid 1000 develop
# Install build dependencies
RUN apt-get update \
&& apt-get install -y \
git cmake gcc g++ \
libncurses5-dev \
libgnutls-dev \
bison \
&& rm -rf /var/lib/apt/lists/*
USER develop
ubuntu:16.04 (97 packages installed) ~ 112MB
useradd
dependencies
© 2018 MariaDB Foundation
Keep images small, use volumes
$ docker build . -t mariadb-build-env
$ docker run -i -t -v "$(pwd)"/server:/home/develop/server mariadb-build-env
ubuntu:16.04 (97 packages installed) ~ 112MB
useradd
dependencies
Specify a volume to mount
© 2018 MariaDB Foundation
Keep images small, use volumes
$ docker build . -t mariadb-build-env
$ docker run -i -t -v "$(pwd)"/server:/home/develop/server mariadb-build-env
ubuntu:16.04 (97 packages installed) ~ 112MB
useradd
dependencies
Absolute path in host
© 2018 MariaDB Foundation
Keep images small, use volumes
$ docker build . -t mariadb-build-env
$ docker run -i -t -v "$(pwd)"/server:/home/develop/server mariadb-build-env
ubuntu:16.04 (97 packages installed) ~ 112MB
useradd
dependencies
Absolute path in container
© 2018 MariaDB Foundation
Keep images small, use volumes
$ docker build . -t mariadb-build-env
$ docker run -i -t -v "$(pwd)"/server:/home/develop/server mariadb-build-env
develop@b624906b23a5:~$
ubuntu:16.04 (97 packages installed) ~ 112MB
useradd
dependencies
© 2018 MariaDB Foundation
Keep images small, use volumes
$ docker build . -t mariadb-build-env
$ docker run -i -t -v "$(pwd)"/server:/home/develop/server mariadb-build-env
develop@b624906b23a5:~$ ls
server
develop@b624906b23a5:~$ cd server
develop@b624906b23a5:~/server$ cmake .
-- Running cmake version 3.5.1
...
ubuntu:16.04 (97 packages installed) ~ 112MB
useradd
dependencies
© 2018 MariaDB Foundation
Conclusions
© 2018 MariaDB Foundation
Conclusions
© 2018 MariaDB Foundation
Thank You!
Contact me at:
Blogs:
mariadb.org/blog
vicentiu.ciorbaru.io
© 2016 MariaDB Foundation