Why this Matters
Traditional monolithic architectures are hard to scale. As an application's code base grows, it becomes complex to update and maintain. Introducing new features, languages, frameworks, and technologies becomes very hard, limiting innovation and new ideas.
Within a microservices architecture, each application component runs as its own service and communicates with other services via a well-defined API. Microservices are built around business capabilities, and each service performs a single function. Microservices can be written using different frameworks and programming languages, and you can deploy them independently, as a single service, or as a group of services.
Introduction to the Build Process
In this introduction we'll cover an overview of Docker images, how docker uses layers to build images, and an introduction to the Dockerfile
used by "docker build" command to create images. (Note case is important here, the "D" is upper case, and the rest in lower case).
The Dockerfile contains all the instructions needed to build an image, and it must be
in the root of the project directory.
Building an image is done with the "docker build" command. Docker looks for a Dockerfile in the base of the directory.
Use the -t option to name your image. The image is only available if the build completes successfully.
Previously built layers will be reused. The -f flag can be used to specify a different Dockerfile.
Every container starts from an image. There are many images in the docker registry: hub.docker.com
to help developers get started.
Image Layers
Layers are Shared
Images are Shared
Base Images
What are the benefits of base images?
- Don't Repeat Yourself
- Containers should be ephemeral
- Using a base system allows for inheritance
- Base your images on official images to allow for reuse
Working with Files
Source paths are always relative to the Dockerfile project directory.
You cannot use source files outside the Dockerfile project directory.
Commands: WORKDIR, COPY, ADD. It is recommended to always use absolute paths with WORKDIR.
Example:
FROM debian:stretch
WORKDIR /data
Example:
FROM debian:stretch
COPY src dest
....you can also use JSON format:
COPY ["src", "dest"]
Example:
FROM debian:stretch
COPY test.txt /data/test.txt
Building Example
The destination directory or parent directories don't have to exit before COPY command.
WORKDIR. Paths that do not end "/" are treated as a regular file. Paths that end in "/"
is treated as a directory.
[root@ardeshir]:~/docker-demo
1> docker build -t dem0 .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM debian:stretch
stretch: Pulling from library/debian
219d2e45b4af: Pull complete
Digest: sha256:5fafd38cdee6c7e6b97356092b97389faa0aa069595f1c3cc3344428b5fd2339
Status: Downloaded newer image for debian:stretch
---> 72ef1cf971d1
Step 2/2 : COPY test.txt /data/test.txt
---> 7797f76796b5
Removing intermediate container 6da02b3061fa
Successfully built 7797f76796b5
Successfully tagged dem0:latest
[root@ardeshir]:~/docker-demo
0> docker run --rm -it dem0
root@a8de718353f0:/# cd /data
root@a8de718353f0:/data# ls -la
total 12
drwxr-xr-x 2 root root 4096 Oct 1 21:31 .
drwxr-xr-x 28 root root 4096 Oct 1 21:32 ..
-rw-r--r-- 1 root root 17 Oct 1 21:29 test.txt
root@a8de718353f0:/data# cat test.txt
I am a test file
ADD Command
The
ADD command works like
COPY with additional features. For example, it can fetch files from
the internet and copy them to the destination. If neither the source url or the destination end with a slash,
the file is downloaded and copied to the destination. If both the source url and the destination end with a slash, the
downloaded file is copied into the destination directory with that name.
ADD https://root/something/ /dest/ .... it would be placed in /dest/something.
ADD can unpack local tar files. The files can be compressed with gzip, bzip2, and xz. This feature does not
work for URLs, only local files.
Running Command
Running
Connecting
Docker cmdline examples:
0> docker container run -it --name=bb busybox:1.26
Unable to find image 'busybox:1.26' locally
1.26: Pulling from library/busybox
27144aa8f1b9: Pull complete
Digest: sha256:be3c11fdba7cfe299214e46edc642e09514dbb9bbefcd0d3836c05a1e0cd0642
Status: Downloaded newer image for busybox:1.26
/ # ps aux
PID USER TIME COMMAND
1 root 0:00 sh
5 root 0:00 ps aux
/ # ls -la
Mem: 2111880K used, 1741328K free, 5892K shrd, 267036K buff, 1390336K cached
CPU: 0.0% usr 0.0% sys 0.0% nic 100% idle 0.0% io 0.0% irq 0.0% sirq
Load average: 0.00 0.00 0.00 2/223 8
PID PPID USER STAT VSZ %VSZ CPU %CPU COMMAND
1 0 root S 1204 0.0 0 0.0 sh
8 1 root R 1196 0.0 0 0.0 top
/ # Crt-D (exit)
[root@ardeshir]:~
130> docker attach bb
You cannot attach to a stopped container, start it first
[root@ardeshir]:~
1> docker start bb
bb
[root@ardeshir]:~
0> docker attach bb
/ #
Show Docker Disk Usage: system df
[root@ardeshir]:~
1> docker system df
TYPE | TOTAL | ACTIVE | SIZE | RECLAIMABLE |
Images | 17 | 9 | 3.436GB | 2.515GB (73%) |
Containers | 16 | 5 | 177.5MB | 166MB (93%) |
Local Volumes | 5 | 3 | 74.92MB | 106.7kB (0%) |
Docker Reading List
Evolution of Containers - Docker, Solaris Zones, BSD Jails and more
https://aucouranton.com/2014/06/13/linux-containers-parallels-lxc-openvz-docker-and-more/
The Docker Story
https://www.forbes.com/sites/alexkonrad/2015/07/01/how-docker-escaped-near-death-to-become-softwares-next-big-thing/
What is Docker by Docker
https://www.docker.com/what-docker
Who is using Docker and How
https://www.docker.com/customers
Docker vs Vagrant
https://www.upguard.com/articles/docker-vs-vagrant