| # Check and Setup Docker |
|
|
| You are helping the user check if Docker is configured and set it up if needed. |
|
|
| ## Your tasks: |
|
|
| 1. **Check if Docker is already installed:** |
| - Check Docker: `docker --version` |
| - Check Docker Compose: `docker-compose --version` or `docker compose version` |
| - Check Docker service: `systemctl status docker` |
|
|
| 2. **If Docker is installed, verify configuration:** |
| - Check Docker info: `docker info` |
| - Check user can run Docker: `docker ps` |
| - If permission denied, user needs to be added to docker group |
| - Check Docker storage driver and location |
| - Check Docker network configuration |
|
|
| 3. **If Docker is NOT installed, proceed with installation:** |
|
|
| **Remove old versions:** |
| ```bash |
| sudo apt-get remove docker docker-engine docker.io containerd runc |
| ``` |
|
|
| **Update and install prerequisites:** |
| ```bash |
| sudo apt-get update |
| sudo apt-get install ca-certificates curl gnupg lsb-release |
| ``` |
|
|
| **Add Docker's official GPG key:** |
| ```bash |
| sudo mkdir -p /etc/apt/keyrings |
| curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg |
| ``` |
|
|
| **Set up repository:** |
| ```bash |
| echo \ |
| "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ |
| $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null |
| ``` |
|
|
| **Install Docker Engine:** |
| ```bash |
| sudo apt-get update |
| sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin |
| ``` |
|
|
| 4. **Post-installation setup:** |
|
|
| **Enable Docker service:** |
| ```bash |
| sudo systemctl enable docker |
| sudo systemctl start docker |
| ``` |
|
|
| **Add user to docker group:** |
| ```bash |
| sudo usermod -aG docker $USER |
| ``` |
| Then log out and back in, or run: `newgrp docker` |
|
|
| 5. **Verify Docker installation:** |
| ```bash |
| docker --version |
| docker run hello-world |
| docker ps |
| docker images |
| ``` |
|
|
| 6. **Install Docker Compose (if not included):** |
| Modern Docker includes Compose v2 as a plugin. |
| Check: `docker compose version` |
|
|
| If needed, install standalone: |
| ```bash |
| sudo apt-get install docker-compose-plugin |
| ``` |
|
|
| 7. **Configure Docker daemon (optional):** |
| Edit `/etc/docker/daemon.json`: |
|
|
| ```json |
| { |
| "log-driver": "json-file", |
| "log-opts": { |
| "max-size": "10m", |
| "max-file": "3" |
| }, |
| "storage-driver": "overlay2", |
| "dns": ["8.8.8.8", "8.8.4.4"] |
| } |
| ``` |
|
|
| Then restart: `sudo systemctl restart docker` |
|
|
| 8. **Check Docker storage location:** |
| ```bash |
| docker info | grep "Docker Root Dir" |
| sudo du -sh /var/lib/docker |
| ``` |
|
|
| If storage is on a small partition, consider changing location. |
|
|
| 9. **Configure storage location (if needed):** |
| In `/etc/docker/daemon.json`: |
| ```json |
| { |
| "data-root": "/new/path/to/docker" |
| } |
| ``` |
|
|
| Then: |
| ```bash |
| sudo systemctl stop docker |
| sudo mv /var/lib/docker /new/path/to/docker |
| sudo systemctl start docker |
| ``` |
|
|
| 10. **Set up Docker networking:** |
| Check networks: |
| ```bash |
| docker network ls |
| ``` |
| |
| Create custom networks if needed: |
| ```bash |
| docker network create my-network |
| ``` |
| |
| 11. **Configure resource limits (optional):** |
| For laptops/desktops, may want to limit resources: |
| In `/etc/docker/daemon.json`: |
| ```json |
| { |
| "default-ulimits": { |
| "nofile": { |
| "Name": "nofile", |
| "Hard": 64000, |
| "Soft": 64000 |
| } |
| } |
| } |
| ``` |
| |
| 12. **Set up Docker Hub authentication (optional):** |
| ```bash |
| docker login |
| ``` |
| |
| 13. **Test Docker functionality:** |
| Run various test commands: |
| ```bash |
| docker run hello-world |
| docker run -it ubuntu bash |
| docker ps -a |
| docker images |
| docker system info |
| ``` |
| |
| 14. **Install useful Docker tools (optional):** |
| Ask user if they want: |
| - **Portainer** (Docker management UI) |
| - **ctop** (Container monitoring) |
| - **lazydocker** (Terminal UI for Docker) |
| |
| ```bash |
| # ctop |
| sudo wget -O /usr/local/bin/ctop https://github.com/bcicen/ctop/releases/download/v0.7.7/ctop-0.7.7-linux-amd64 |
| sudo chmod +x /usr/local/bin/ctop |
| ``` |
| |
| 15. **Configure Docker logging:** |
| Check current logging: |
| ```bash |
| docker info | grep "Logging Driver" |
| ``` |
| |
| Configure in `/etc/docker/daemon.json`: |
| ```json |
| { |
| "log-driver": "json-file", |
| "log-opts": { |
| "max-size": "10m", |
| "max-file": "5", |
| "labels": "production" |
| } |
| } |
| ``` |
| |
| 16. **Set up Docker cleanup:** |
| Suggest adding to crontab: |
| ```bash |
| # Clean up unused containers, images, networks weekly |
| 0 3 * * 0 docker system prune -af --volumes |
| ``` |
| |
| Or show manual cleanup: |
| ```bash |
| docker system prune -a |
| docker volume prune |
| docker network prune |
| ``` |
| |
| 17. **Check for common issues:** |
| - Docker daemon not running: `sudo systemctl start docker` |
| - Permission denied: `sudo usermod -aG docker $USER` and re-login |
| - Storage full: `docker system df` and cleanup |
| - Network issues: Check DNS in daemon.json |
| - Firewall blocking: Check ufw/iptables |
|
|
| 18. **Provide best practices:** |
| - Don't run containers as root when possible |
| - Use Docker Compose for multi-container apps |
| - Tag images properly |
| - Clean up regularly with `docker system prune` |
| - Use .dockerignore files |
| - Monitor disk usage: `docker system df` |
| - Use specific image tags, not `latest` |
| - Scan images for vulnerabilities: `docker scan <image>` |
| - Keep Docker updated |
| - Use multi-stage builds to reduce image size |
| - Limit container resources in production |
|
|
| 19. **Show basic Docker commands:** |
| - `docker run <image>` - Run a container |
| - `docker ps` - List running containers |
| - `docker ps -a` - List all containers |
| - `docker images` - List images |
| - `docker pull <image>` - Pull an image |
| - `docker build -t <name> .` - Build an image |
| - `docker exec -it <container> bash` - Enter container |
| - `docker logs <container>` - View logs |
| - `docker stop <container>` - Stop container |
| - `docker rm <container>` - Remove container |
| - `docker rmi <image>` - Remove image |
| - `docker compose up` - Start compose stack |
| - `docker system prune` - Clean up |
|
|
| 20. **Report findings:** |
| Summarize: |
| - Docker installation status |
| - Version information |
| - User permissions status |
| - Storage configuration |
| - Service status |
| - Any issues found |
| |
| ## Important notes: |
| - User must log out and back in after being added to docker group |
| - Docker can use significant disk space - monitor it |
| - Don't run untrusted images |
| - Docker Desktop is different from Docker Engine (we're installing Engine) |
| - Rootless Docker is available for better security but more complex |
| - Docker Compose v2 is now a plugin (`docker compose` not `docker-compose`) |
| - Keep Docker updated for security patches |
|
|