243 lines
5.0 KiB
Markdown
243 lines
5.0 KiB
Markdown
|
|
# Docker Troubleshooting and Debugging
|
||
|
|
|
||
|
|
Even with careful planning and best practices, issues can arise when working with Docker. This chapter covers common problems you might encounter and provides strategies for effective troubleshooting and debugging.
|
||
|
|
|
||
|
|
## 1. Container Lifecycle Issues
|
||
|
|
|
||
|
|
### Container Won't Start
|
||
|
|
|
||
|
|
If a container fails to start, use these commands:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# View container logs
|
||
|
|
docker logs <container_id>
|
||
|
|
|
||
|
|
# Inspect container details
|
||
|
|
docker inspect <container_id>
|
||
|
|
|
||
|
|
# Check container status
|
||
|
|
docker ps -a
|
||
|
|
```
|
||
|
|
|
||
|
|
### Container Exits Immediately
|
||
|
|
|
||
|
|
For containers that exit right after starting:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Run the container in interactive mode
|
||
|
|
docker run -it --entrypoint /bin/sh <image_name>
|
||
|
|
|
||
|
|
# Check the ENTRYPOINT and CMD in the Dockerfile
|
||
|
|
docker inspect --format='{{.Config.Entrypoint}}' <image_name>
|
||
|
|
docker inspect --format='{{.Config.Cmd}}' <image_name>
|
||
|
|
```
|
||
|
|
|
||
|
|
## 2. Networking Issues
|
||
|
|
|
||
|
|
### Container Can't Connect to Network
|
||
|
|
|
||
|
|
To troubleshoot network connectivity:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Inspect network settings
|
||
|
|
docker network inspect <network_name>
|
||
|
|
|
||
|
|
# Check container's network settings
|
||
|
|
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_id>
|
||
|
|
|
||
|
|
# Use a network debugging container
|
||
|
|
docker run --net container:<container_id> nicolaka/netshoot
|
||
|
|
```
|
||
|
|
|
||
|
|
### Port Mapping Issues
|
||
|
|
|
||
|
|
If you can't access a container's exposed port:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Check port mappings
|
||
|
|
docker port <container_id>
|
||
|
|
|
||
|
|
# Verify host machine's firewall settings
|
||
|
|
sudo ufw status
|
||
|
|
|
||
|
|
# Test the port directly on the container
|
||
|
|
docker exec <container_id> nc -zv localhost <port>
|
||
|
|
```
|
||
|
|
|
||
|
|
## 3. Storage and Volume Issues
|
||
|
|
|
||
|
|
### Data Persistence Problems
|
||
|
|
|
||
|
|
For issues with data not persisting:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# List volumes
|
||
|
|
docker volume ls
|
||
|
|
|
||
|
|
# Inspect a volume
|
||
|
|
docker volume inspect <volume_name>
|
||
|
|
|
||
|
|
# Check volume mounts in a container
|
||
|
|
docker inspect --format='{{range .Mounts}}{{.Source}} -> {{.Destination}}{{"\n"}}{{end}}' <container_id>
|
||
|
|
```
|
||
|
|
|
||
|
|
### Disk Space Issues
|
||
|
|
|
||
|
|
If you're running out of disk space:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Check Docker disk usage
|
||
|
|
docker system df
|
||
|
|
|
||
|
|
# Remove unused data
|
||
|
|
docker system prune -a
|
||
|
|
|
||
|
|
# Identify large images
|
||
|
|
docker images --format "{{.Size}}\t{{.Repository}}:{{.Tag}}" | sort -h
|
||
|
|
```
|
||
|
|
|
||
|
|
## 4. Resource Constraints
|
||
|
|
|
||
|
|
### Container Using Too Much CPU or Memory
|
||
|
|
|
||
|
|
To identify and address resource usage issues:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Monitor resource usage
|
||
|
|
docker stats
|
||
|
|
|
||
|
|
# Set resource limits
|
||
|
|
docker run --memory=512m --cpus=0.5 <image_name>
|
||
|
|
|
||
|
|
# Update limits for a running container
|
||
|
|
docker update --cpus=0.75 <container_id>
|
||
|
|
```
|
||
|
|
|
||
|
|
## 5. Image-related Issues
|
||
|
|
|
||
|
|
### Image Pull Failures
|
||
|
|
|
||
|
|
If you can't pull an image:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Check Docker Hub status
|
||
|
|
curl -Is https://registry.hub.docker.com/v2/ | head -n 1
|
||
|
|
|
||
|
|
# Verify your Docker login
|
||
|
|
docker login
|
||
|
|
|
||
|
|
# Try pulling with verbose output
|
||
|
|
docker pull --verbose <image_name>
|
||
|
|
```
|
||
|
|
|
||
|
|
### Image Build Failures
|
||
|
|
|
||
|
|
For issues during image builds:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Build with verbose output
|
||
|
|
docker build --progress=plain -t <image_name> .
|
||
|
|
|
||
|
|
# Check for issues in the Dockerfile
|
||
|
|
docker build --no-cache -t <image_name> .
|
||
|
|
```
|
||
|
|
|
||
|
|
## 6. Docker Daemon Issues
|
||
|
|
|
||
|
|
### Docker Daemon Won't Start
|
||
|
|
|
||
|
|
If the Docker daemon fails to start:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Check Docker daemon status
|
||
|
|
sudo systemctl status docker
|
||
|
|
|
||
|
|
# View Docker daemon logs
|
||
|
|
sudo journalctl -u docker.service
|
||
|
|
|
||
|
|
# Restart Docker daemon
|
||
|
|
sudo systemctl restart docker
|
||
|
|
```
|
||
|
|
|
||
|
|
## 7. Debugging Techniques
|
||
|
|
|
||
|
|
### Interactive Debugging
|
||
|
|
|
||
|
|
To debug a running container interactively:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Start an interactive shell in a running container
|
||
|
|
docker exec -it <container_id> /bin/bash
|
||
|
|
|
||
|
|
# Run a new container with a shell for debugging
|
||
|
|
docker run -it --entrypoint /bin/bash <image_name>
|
||
|
|
```
|
||
|
|
|
||
|
|
### Using Docker Events
|
||
|
|
|
||
|
|
Monitor Docker events for troubleshooting:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
docker events
|
||
|
|
```
|
||
|
|
|
||
|
|
### Logging
|
||
|
|
|
||
|
|
Configure and view container logs:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# View container logs
|
||
|
|
docker logs <container_id>
|
||
|
|
|
||
|
|
# Follow log output
|
||
|
|
docker logs -f <container_id>
|
||
|
|
|
||
|
|
# Adjust logging driver
|
||
|
|
docker run --log-driver json-file --log-opt max-size=10m <image_name>
|
||
|
|
```
|
||
|
|
|
||
|
|
## 8. Performance Debugging
|
||
|
|
|
||
|
|
### Identifying Performance Bottlenecks
|
||
|
|
|
||
|
|
Use these commands to identify performance issues:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Monitor container resource usage
|
||
|
|
docker stats
|
||
|
|
|
||
|
|
# Profile container processes
|
||
|
|
docker top <container_id>
|
||
|
|
|
||
|
|
# Use cAdvisor for more detailed metrics
|
||
|
|
docker run \
|
||
|
|
--volume=/:/rootfs:ro \
|
||
|
|
--volume=/var/run:/var/run:ro \
|
||
|
|
--volume=/sys:/sys:ro \
|
||
|
|
--volume=/var/lib/docker/:/var/lib/docker:ro \
|
||
|
|
--volume=/dev/disk/:/dev/disk:ro \
|
||
|
|
--publish=8080:8080 \
|
||
|
|
--detach=true \
|
||
|
|
--name=cadvisor \
|
||
|
|
google/cadvisor:latest
|
||
|
|
```
|
||
|
|
|
||
|
|
## 9. Docker Compose Troubleshooting
|
||
|
|
|
||
|
|
For issues with Docker Compose:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# View logs for all services
|
||
|
|
docker-compose logs
|
||
|
|
|
||
|
|
# Rebuild and recreate containers
|
||
|
|
docker-compose up -d --build
|
||
|
|
|
||
|
|
# Check the configuration
|
||
|
|
docker-compose config
|
||
|
|
```
|
||
|
|
|
||
|
|
## Conclusion
|
||
|
|
|
||
|
|
Effective troubleshooting and debugging are essential skills for working with Docker. By understanding these techniques and tools, you can quickly identify and resolve issues in your Docker environment. Remember to always check the official Docker documentation and community forums for the most up-to-date information and solutions to common problems.
|