File size: 7,000 Bytes
292d92c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
# 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