Initial commit
This commit is contained in:
297
skills/devops/references/docker-basics.md
Normal file
297
skills/devops/references/docker-basics.md
Normal file
@@ -0,0 +1,297 @@
|
||||
# Docker Basics
|
||||
|
||||
Core concepts and workflows for Docker containerization.
|
||||
|
||||
## Core Concepts
|
||||
|
||||
**Containers:** Lightweight, isolated processes bundling apps with dependencies. Ephemeral by default.
|
||||
|
||||
**Images:** Read-only blueprints for containers. Layered filesystem for reusability.
|
||||
|
||||
**Volumes:** Persistent storage surviving container deletion.
|
||||
|
||||
**Networks:** Enable container communication.
|
||||
|
||||
## Dockerfile Best Practices
|
||||
|
||||
### Essential Instructions
|
||||
```dockerfile
|
||||
FROM node:20-alpine # Base image (use specific versions)
|
||||
WORKDIR /app # Working directory
|
||||
COPY package*.json ./ # Copy dependency files first
|
||||
RUN npm install --production # Execute build commands
|
||||
COPY . . # Copy application code
|
||||
ENV NODE_ENV=production # Environment variables
|
||||
EXPOSE 3000 # Document exposed ports
|
||||
USER node # Run as non-root (security)
|
||||
CMD ["node", "server.js"] # Default command
|
||||
```
|
||||
|
||||
### Multi-Stage Builds (Production)
|
||||
```dockerfile
|
||||
# Stage 1: Build
|
||||
FROM node:20-alpine AS build
|
||||
WORKDIR /app
|
||||
COPY package*.json ./
|
||||
RUN npm install
|
||||
COPY . .
|
||||
RUN npm run build
|
||||
|
||||
# Stage 2: Production
|
||||
FROM node:20-alpine AS production
|
||||
WORKDIR /app
|
||||
COPY --from=build /app/dist ./dist
|
||||
COPY --from=build /app/node_modules ./node_modules
|
||||
USER node
|
||||
EXPOSE 3000
|
||||
CMD ["node", "dist/server.js"]
|
||||
```
|
||||
|
||||
Benefits: Smaller images, improved security, no build tools in production.
|
||||
|
||||
### .dockerignore
|
||||
```
|
||||
node_modules
|
||||
.git
|
||||
.env
|
||||
*.log
|
||||
.DS_Store
|
||||
README.md
|
||||
docker-compose.yml
|
||||
dist
|
||||
coverage
|
||||
```
|
||||
|
||||
## Building Images
|
||||
|
||||
```bash
|
||||
# Build with tag
|
||||
docker build -t myapp:1.0 .
|
||||
|
||||
# Build targeting specific stage
|
||||
docker build -t myapp:dev --target build .
|
||||
|
||||
# Build for multiple platforms
|
||||
docker buildx build --platform linux/amd64,linux/arm64 -t myapp:1.0 .
|
||||
|
||||
# View layers
|
||||
docker image history myapp:1.0
|
||||
```
|
||||
|
||||
## Running Containers
|
||||
|
||||
```bash
|
||||
# Basic run
|
||||
docker run myapp:1.0
|
||||
|
||||
# Background (detached)
|
||||
docker run -d --name myapp myapp:1.0
|
||||
|
||||
# Port mapping (host:container)
|
||||
docker run -p 8080:3000 myapp:1.0
|
||||
|
||||
# Environment variables
|
||||
docker run -e NODE_ENV=production myapp:1.0
|
||||
|
||||
# Volume mount (named volume)
|
||||
docker run -v mydata:/app/data myapp:1.0
|
||||
|
||||
# Bind mount (development)
|
||||
docker run -v $(pwd)/src:/app/src myapp:1.0
|
||||
|
||||
# Resource limits
|
||||
docker run --memory 512m --cpus 0.5 myapp:1.0
|
||||
|
||||
# Interactive terminal
|
||||
docker run -it myapp:1.0 /bin/sh
|
||||
```
|
||||
|
||||
## Container Management
|
||||
|
||||
```bash
|
||||
# List containers
|
||||
docker ps
|
||||
docker ps -a
|
||||
|
||||
# Logs
|
||||
docker logs myapp
|
||||
docker logs -f myapp # Follow
|
||||
docker logs --tail 100 myapp # Last 100 lines
|
||||
|
||||
# Execute command
|
||||
docker exec myapp ls /app
|
||||
docker exec -it myapp /bin/sh # Interactive shell
|
||||
|
||||
# Stop/start
|
||||
docker stop myapp
|
||||
docker start myapp
|
||||
|
||||
# Remove
|
||||
docker rm myapp
|
||||
docker rm -f myapp # Force remove running
|
||||
|
||||
# Inspect
|
||||
docker inspect myapp
|
||||
|
||||
# Monitor resources
|
||||
docker stats myapp
|
||||
|
||||
# Copy files
|
||||
docker cp myapp:/app/logs ./logs
|
||||
```
|
||||
|
||||
## Volume Management
|
||||
|
||||
```bash
|
||||
# Create volume
|
||||
docker volume create mydata
|
||||
|
||||
# List volumes
|
||||
docker volume ls
|
||||
|
||||
# Remove volume
|
||||
docker volume rm mydata
|
||||
|
||||
# Remove unused volumes
|
||||
docker volume prune
|
||||
```
|
||||
|
||||
## Network Management
|
||||
|
||||
```bash
|
||||
# Create network
|
||||
docker network create my-network
|
||||
|
||||
# List networks
|
||||
docker network ls
|
||||
|
||||
# Connect container
|
||||
docker network connect my-network myapp
|
||||
|
||||
# Disconnect
|
||||
docker network disconnect my-network myapp
|
||||
```
|
||||
|
||||
## Language-Specific Dockerfiles
|
||||
|
||||
### Node.js
|
||||
```dockerfile
|
||||
FROM node:20-alpine AS build
|
||||
WORKDIR /app
|
||||
COPY package*.json ./
|
||||
RUN npm ci --only=production
|
||||
COPY . .
|
||||
RUN npm run build
|
||||
|
||||
FROM node:20-alpine
|
||||
WORKDIR /app
|
||||
COPY --from=build /app/dist ./dist
|
||||
COPY --from=build /app/node_modules ./node_modules
|
||||
USER node
|
||||
CMD ["node", "dist/server.js"]
|
||||
```
|
||||
|
||||
### Python
|
||||
```dockerfile
|
||||
FROM python:3.11-slim AS build
|
||||
WORKDIR /app
|
||||
COPY requirements.txt .
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
FROM python:3.11-slim
|
||||
WORKDIR /app
|
||||
COPY --from=build /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
|
||||
COPY . .
|
||||
RUN adduser --disabled-password appuser
|
||||
USER appuser
|
||||
CMD ["python", "app.py"]
|
||||
```
|
||||
|
||||
### Go
|
||||
```dockerfile
|
||||
FROM golang:1.21-alpine AS build
|
||||
WORKDIR /app
|
||||
COPY go.mod go.sum ./
|
||||
RUN go mod download
|
||||
COPY . .
|
||||
RUN CGO_ENABLED=0 go build -o main .
|
||||
|
||||
FROM scratch
|
||||
COPY --from=build /app/main /main
|
||||
CMD ["/main"]
|
||||
```
|
||||
|
||||
## Security Hardening
|
||||
|
||||
```dockerfile
|
||||
# Use specific versions
|
||||
FROM node:20.11.0-alpine3.19
|
||||
|
||||
# Create non-root user
|
||||
RUN addgroup -g 1001 -S nodejs && \
|
||||
adduser -S nodejs -u 1001
|
||||
|
||||
# Set ownership
|
||||
COPY --chown=nodejs:nodejs . .
|
||||
|
||||
# Switch to non-root
|
||||
USER nodejs
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Container exits immediately
|
||||
```bash
|
||||
docker logs myapp
|
||||
docker run -it myapp /bin/sh
|
||||
docker run -it --entrypoint /bin/sh myapp
|
||||
```
|
||||
|
||||
### Cannot connect
|
||||
```bash
|
||||
docker ps
|
||||
docker port myapp
|
||||
docker network inspect bridge
|
||||
docker inspect myapp | grep IPAddress
|
||||
```
|
||||
|
||||
### Out of disk space
|
||||
```bash
|
||||
docker system df
|
||||
docker system prune -a
|
||||
docker volume prune
|
||||
```
|
||||
|
||||
### Build cache issues
|
||||
```bash
|
||||
docker build --no-cache -t myapp .
|
||||
docker builder prune
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
- Use specific image versions, not `latest`
|
||||
- Run as non-root user
|
||||
- Multi-stage builds to minimize size
|
||||
- Implement health checks
|
||||
- Set resource limits
|
||||
- Keep images under 500MB
|
||||
- Scan for vulnerabilities: `docker scout cves myapp:1.0`
|
||||
|
||||
## Quick Reference
|
||||
|
||||
| Task | Command |
|
||||
|------|---------|
|
||||
| Build | `docker build -t myapp:1.0 .` |
|
||||
| Run | `docker run -d -p 8080:3000 myapp:1.0` |
|
||||
| Logs | `docker logs -f myapp` |
|
||||
| Shell | `docker exec -it myapp /bin/sh` |
|
||||
| Stop | `docker stop myapp` |
|
||||
| Remove | `docker rm myapp` |
|
||||
| Clean | `docker system prune -a` |
|
||||
|
||||
## Resources
|
||||
|
||||
- Docs: https://docs.docker.com
|
||||
- Best Practices: https://docs.docker.com/develop/dev-best-practices/
|
||||
- Dockerfile Reference: https://docs.docker.com/engine/reference/builder/
|
||||
Reference in New Issue
Block a user