Installation
Add the bundle to your composer.json:
composer require docker-client/client-bundle
Register the bundle in config/bundles.php:
return [
// ...
Docker\ClientBundle\DockerClientBundle::class => ['all' => true],
];
Configuration
Define Docker connection settings in config/packages/docker_client.yaml:
docker_client:
host: 'unix:///var/run/docker.sock' # Default for local Docker
# host: 'tcp://127.0.0.1:2375' # Alternative for remote/TCP
version: 'auto' # or '1.41'
First Use Case: List Containers Inject the client in a service/controller:
use Docker\ClientBundle\Client\ClientInterface;
class ContainerService {
public function __construct(private ClientInterface $client) {}
public function listContainers(): array {
return $this->client->containers()->list();
}
}
Container Management
$container = $this->client->containers()->create([
'Image' => 'nginx:latest',
'Cmd' => ['nginx', '-g', 'daemon off;'],
'name' => 'my-nginx',
]);
$container->start();
$inspect = $this->client->containers()->inspect('my-nginx');
$logs = $this->client->containers()->logs('my-nginx');
Image Operations
$this->client->images()->pull('alpine:latest');
$this->client->images()->push('my-image', ['tag' => 'latest']);
Networks/Volumes
$network = $this->client->networks()->create([
'Name' => 'my-network',
'Driver' => 'bridge',
]);
$this->client->containers()->connect('my-container', $network['Id']);
Event Streaming
$events = $this->client->events()->subscribe();
foreach ($events as $event) {
// Handle event (e.g., container start/stop)
}
ClientInterface over the concrete Client for testability.execute() for non-blocking commands (e.g., docker exec).DockerException:
try {
$this->client->containers()->start('nonexistent');
} catch (DockerException $e) {
// Handle error (e.g., container not found)
}
Permission Issues
/var/run/docker.sock (common on shared hosting).
Fix: Add user to the docker group or adjust socket permissions:
sudo chmod 666 /var/run/docker.sock
tcp://, ensure the Docker daemon allows remote connections (/etc/docker/daemon.json):
{
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
}
Deprecated Methods
docker-client/client methods may have changed.Rate Limiting
use Symfony\Component\Process\Exception\ProcessFailedException;
try {
$this->client->containers()->start('container');
} catch (ProcessFailedException $e) {
if (str_contains($e->getMessage(), '429')) {
sleep(2); // Retry after delay
retry();
}
}
DOCKER_CLIENT_DEBUG environment variable to log raw API requests/responses.execute() method to debug low-level commands:
$output = $this->client->execute('container inspect my-container');
Custom Middleware Override the client factory to add middleware (e.g., auth headers):
# config/packages/docker_client.yaml
docker_client:
client_factory: App\Service\CustomDockerClientFactory
// src/Service/CustomDockerClientFactory.php
class CustomDockerClientFactory extends ClientFactory {
protected function createClient(): Client {
$client = parent::createClient();
$client->addMiddleware(new CustomAuthMiddleware());
return $client;
}
}
Event Subscribers Listen to Docker events via Symfony’s event dispatcher:
use Docker\ClientBundle\Event\DockerEvent;
class DockerEventSubscriber implements EventSubscriberInterface {
public static function getSubscribedEvents(): array {
return [
DockerEvent::CONTAINER_STARTED => 'onContainerStarted',
];
}
public function onContainerStarted(DockerEvent $event) {
// Handle event data
}
}
Configuration Overrides Dynamically override settings per environment:
# config/packages/dev/docker_client.yaml
docker_client:
host: 'tcp://docker-dev:2375'
How can I help you explore Laravel packages today?