298 lines
5.7 KiB
Markdown
298 lines
5.7 KiB
Markdown
# 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/
|