docker doc : updated setup doc
This commit is contained in:
@@ -0,0 +1,274 @@
|
|||||||
|
# Docker SDK for Python – Setup and First Steps
|
||||||
|
|
||||||
|
This document introduces the **Docker SDK for Python (`docker` library)** and explains how to connect to the Docker Engine, inspect its status, and authenticate with a registry. The goal is not just to show code, but to clearly explain **what each part does, why it exists, and when you would use it**.
|
||||||
|
|
||||||
|
This guide assumes you already understand basic Docker concepts (images, containers, daemon) and are approaching this from a DevOps perspective.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Installing the Docker SDK for Python
|
||||||
|
|
||||||
|
Before Python can communicate with Docker, we need to install the official SDK.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install docker
|
||||||
|
```
|
||||||
|
|
||||||
|
### What this does
|
||||||
|
|
||||||
|
* Installs the **docker** Python package (often called *docker-py*).
|
||||||
|
* This package acts as a **client wrapper** around Docker’s REST API.
|
||||||
|
* All interactions ultimately talk to the Docker daemon (`dockerd`) over a socket or TCP connection.
|
||||||
|
|
||||||
|
Important note:
|
||||||
|
|
||||||
|
* Installing the library alone is not enough.
|
||||||
|
* Docker **must already be installed and running** on the system.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Connecting to Docker Using Environment Configuration
|
||||||
|
|
||||||
|
The simplest and most common way to create a Docker client is by using environment-based configuration.
|
||||||
|
|
||||||
|
```python
|
||||||
|
import docker
|
||||||
|
|
||||||
|
client = docker.from_env()
|
||||||
|
version = client.version()
|
||||||
|
ping_docker = client.ping()
|
||||||
|
|
||||||
|
print(version, ping_docker)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step-by-step explanation
|
||||||
|
|
||||||
|
#### `import docker`
|
||||||
|
|
||||||
|
* Imports the Docker SDK.
|
||||||
|
* This module exposes high-level objects for interacting with Docker resources.
|
||||||
|
|
||||||
|
#### `docker.from_env()`
|
||||||
|
|
||||||
|
* Automatically creates a `DockerClient` instance.
|
||||||
|
* Reads Docker connection details from environment variables such as:
|
||||||
|
|
||||||
|
* `DOCKER_HOST`
|
||||||
|
* `DOCKER_TLS_VERIFY`
|
||||||
|
* `DOCKER_CERT_PATH`
|
||||||
|
* On Linux, this usually resolves to:
|
||||||
|
|
||||||
|
* `unix:///var/run/docker.sock`
|
||||||
|
|
||||||
|
This is why `from_env()` is preferred:
|
||||||
|
|
||||||
|
* Works across Linux, macOS, Windows, and CI systems
|
||||||
|
* Requires no hardcoded connection strings
|
||||||
|
|
||||||
|
#### `client.version()`
|
||||||
|
|
||||||
|
* Calls the Docker Engine `/version` API endpoint.
|
||||||
|
* Returns detailed metadata such as:
|
||||||
|
|
||||||
|
* Docker Engine version
|
||||||
|
* API version
|
||||||
|
* Go version
|
||||||
|
* OS and architecture
|
||||||
|
|
||||||
|
This is commonly used for:
|
||||||
|
|
||||||
|
* Debugging
|
||||||
|
* Compatibility checks
|
||||||
|
* Logging runtime environment details
|
||||||
|
|
||||||
|
#### `client.ping()`
|
||||||
|
|
||||||
|
* Sends a lightweight request to the Docker daemon.
|
||||||
|
* Returns `True` if Docker is reachable and responsive.
|
||||||
|
|
||||||
|
This is a **health check**, often used in:
|
||||||
|
|
||||||
|
* Startup validation
|
||||||
|
* Monitoring scripts
|
||||||
|
* CI/CD pipelines
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. What Does “from_env” Actually Mean?
|
||||||
|
|
||||||
|
Using `from_env()` tells the SDK:
|
||||||
|
|
||||||
|
> “Figure out how to connect to Docker using the same configuration the Docker CLI uses.”
|
||||||
|
|
||||||
|
Behind the scenes, it:
|
||||||
|
|
||||||
|
* Detects whether Docker is local or remote
|
||||||
|
* Determines socket vs TCP
|
||||||
|
* Applies TLS settings if required
|
||||||
|
|
||||||
|
### When should you use it?
|
||||||
|
|
||||||
|
* Local development
|
||||||
|
* Kubernetes nodes
|
||||||
|
* CI runners
|
||||||
|
* Most production automation
|
||||||
|
|
||||||
|
### When not to use it?
|
||||||
|
|
||||||
|
* When you need explicit control over connection parameters
|
||||||
|
* When connecting to a **remote Docker daemon** with custom networking
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Creating a Docker Client Explicitly
|
||||||
|
|
||||||
|
Instead of relying on environment detection, you can create a client manually.
|
||||||
|
|
||||||
|
```python
|
||||||
|
import docker
|
||||||
|
|
||||||
|
client = docker.DockerClient(base_url='unix://var/run/docker.sock')
|
||||||
|
version = client.version()
|
||||||
|
ping_docker = client.ping()
|
||||||
|
|
||||||
|
print(version, ping_docker)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Explanation
|
||||||
|
|
||||||
|
#### `docker.DockerClient(...)`
|
||||||
|
|
||||||
|
* Directly instantiates a Docker client object.
|
||||||
|
* Requires you to specify how to reach the Docker daemon.
|
||||||
|
|
||||||
|
#### `base_url='unix://var/run/docker.sock'`
|
||||||
|
|
||||||
|
* Points to the Unix socket used by Docker on Linux systems.
|
||||||
|
* This socket is owned by root and the `docker` group.
|
||||||
|
|
||||||
|
Important implications:
|
||||||
|
|
||||||
|
* Your Python process must have permission to access the socket
|
||||||
|
* Usually means running as root or a user in the `docker` group
|
||||||
|
|
||||||
|
### When this approach is useful
|
||||||
|
|
||||||
|
* Controlled environments
|
||||||
|
* Educational examples
|
||||||
|
* Explicit infrastructure scripts
|
||||||
|
|
||||||
|
### Why it is less common
|
||||||
|
|
||||||
|
* Not portable across OSes
|
||||||
|
* Hardcodes infrastructure assumptions
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Inspecting Docker and Authenticating
|
||||||
|
|
||||||
|
Once connected, the client can retrieve detailed system information and authenticate with registries.
|
||||||
|
|
||||||
|
```python
|
||||||
|
import docker
|
||||||
|
|
||||||
|
client = docker.DockerClient(base_url='unix://var/run/docker.sock')
|
||||||
|
version = client.version()
|
||||||
|
ping_docker = client.ping()
|
||||||
|
information = client.info()
|
||||||
|
|
||||||
|
client.login(
|
||||||
|
username='user',
|
||||||
|
password='password',
|
||||||
|
registry='registry_link'
|
||||||
|
)
|
||||||
|
|
||||||
|
print(information, ping_docker)
|
||||||
|
```
|
||||||
|
|
||||||
|
### `client.info()`
|
||||||
|
|
||||||
|
* Calls the Docker `/info` endpoint.
|
||||||
|
* Returns a comprehensive snapshot of the Docker host, including:
|
||||||
|
|
||||||
|
* Number of containers (running/stopped)
|
||||||
|
* Number of images
|
||||||
|
* Storage driver
|
||||||
|
* Cgroup and kernel features
|
||||||
|
* Security options (AppArmor, seccomp)
|
||||||
|
|
||||||
|
This is extremely valuable for:
|
||||||
|
|
||||||
|
* Capacity planning
|
||||||
|
* Debugging runtime issues
|
||||||
|
* Auditing host configuration
|
||||||
|
|
||||||
|
### `client.login(...)`
|
||||||
|
|
||||||
|
* Authenticates Docker with a container registry.
|
||||||
|
* Stores credentials in Docker’s credential store.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
|
||||||
|
* `username`: registry account username
|
||||||
|
* `password`: registry password or access token
|
||||||
|
* `registry`: registry URL (e.g. Docker Hub or private registry)
|
||||||
|
|
||||||
|
Common use cases:
|
||||||
|
|
||||||
|
* Pulling private images
|
||||||
|
* Pushing images in CI/CD pipelines
|
||||||
|
* Automating registry interactions
|
||||||
|
|
||||||
|
Security note:
|
||||||
|
|
||||||
|
* Avoid hardcoding credentials in source code
|
||||||
|
* Prefer environment variables or secret managers
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. High-Level vs Low-Level API (Important Concept)
|
||||||
|
|
||||||
|
What you are using here is the **high-level Docker client**.
|
||||||
|
|
||||||
|
Characteristics:
|
||||||
|
|
||||||
|
* Pythonic object model
|
||||||
|
* Resource-oriented (containers, images, networks)
|
||||||
|
* Easier to read and maintain
|
||||||
|
|
||||||
|
The SDK also exposes a **low-level API**:
|
||||||
|
|
||||||
|
* Direct access to Docker REST endpoints
|
||||||
|
* More control, less abstraction
|
||||||
|
|
||||||
|
As a DevOps engineer, you will typically:
|
||||||
|
|
||||||
|
* Use high-level API for automation
|
||||||
|
* Drop to low-level API for advanced edge cases
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Summary
|
||||||
|
|
||||||
|
In this setup phase, you learned how to:
|
||||||
|
|
||||||
|
* Install the Docker SDK for Python
|
||||||
|
* Connect to Docker using environment-based configuration
|
||||||
|
* Explicitly define Docker connection settings
|
||||||
|
* Verify Docker availability
|
||||||
|
* Retrieve system-level Docker information
|
||||||
|
* Authenticate with container registries
|
||||||
|
|
||||||
|
This foundation is critical before moving on to:
|
||||||
|
|
||||||
|
* Managing containers
|
||||||
|
* Building images
|
||||||
|
* Working with volumes and networks
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## References
|
||||||
|
|
||||||
|
Official Docker SDK for Python documentation:
|
||||||
|
|
||||||
|
* [https://docker-py.readthedocs.io/](https://docker-py.readthedocs.io/)
|
||||||
|
|||||||
Reference in New Issue
Block a user