42 lines
2.2 KiB
Markdown
42 lines
2.2 KiB
Markdown
![]() |
---
|
||
|
categories:
|
||
|
- DevOps
|
||
|
tags: [docker, containerization]
|
||
|
---
|
||
|
|
||
|
# Docker architecture
|
||
|
|
||
|
## Overview
|
||
|
|
||
|

|
||
|
|
||
|
- The Docker Client is a thin API for making [REST API](/Databases/REST/RESTful_APIs.md) to the Docker Server. Any CLI command beginning `docker...` is an API request to the server.
|
||
|
- The internal process name for the server is `dockerd`.
|
||
|
- On `docker run...`, `dockerd` calls `containerd`. This process starts the container runtimes and configures container-level storage and networking.
|
||
|
- This then spawns `container-shim` procecesses which takes any output from you container and puts it in a logfile. (A redirection of `stdout` and `stderr`) One shim is spawned for each container.
|
||
|
- The shim then launches a container runtime called `runc`. The `runc` performs all the complex configuration of cgroups and namespaces to create the container environment.
|
||
|
- `containerd` is purely a bootstrapper. Once it has fulfilled its function by initiating `runc`, the Docker instance is up and running and the kernel takes it from there. It is like a launch scaffold that can be discarded.
|
||
|
|
||
|
> If you are running Docker desktop on Mac or Windows, Docker creates a Linux virtual machine, since it cannot run natively on Windows or Mac. In these cases the the Docker Server runs inside this VM adding an additional layer of abstraction.
|
||
|
|
||
|
> Docker server also creates an internal virtual network and assigns IP addresses to the containers. (This can be used to get containers to communicate to each other over TCP/IP, since they are isolated by default.)
|
||
|
|
||
|
## Images
|
||
|
|
||
|
Containers are created from images stored in a registry (either the public Docker Hub or privately). `containerd` uses the image to tell `runc` how to construct and build the image.
|
||
|
|
||
|
```sh
|
||
|
docker run [image_name]
|
||
|
```
|
||
|
|
||
|
The images you have pulled from the registry are stored in a local registry on your machine.
|
||
|
|
||
|
When you run `docker run`, Docker will look first for the image in your local registry. If it cannot find it there, it will attempt to pull it from the remote registry.
|
||
|
|
||
|
This assumes you are using a third-party image. You can also create your own images by writing a Dockerfile:
|
||
|
|
||
|
```sh
|
||
|
docker build [docker_file]
|
||
|
docker run [resulting_image]
|
||
|
```
|