Docker Containerization
6/15/24About 3 min
Docker Containerization
Overview
Docker is an open-source containerization platform for packaging applications and their dependencies into containers for cross-platform deployment.
1. Installation and Configuration
1.1 Install Docker (Linux)
# Update system
sudo apt-get update
sudo apt-get upgrade -y
# Install dependencies
sudo apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
# Add Docker GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# Add Docker repository
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Install Docker
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
# Start Docker service
sudo systemctl start docker
sudo systemctl enable docker
# Verify installation
docker --version
docker run hello-world1.2 Basic Docker Commands
# View Docker info
docker info
# List images
docker images
# List containers
docker ps -a
# Pull image
docker pull nginx:latest
# Run container
docker run -d -p 80:80 nginx
# Enter container
docker exec -it container_id /bin/bash
# View container logs
docker logs container_id
# Stop container
docker stop container_id
# Remove container
docker rm container_id
# Remove image
docker rmi image_id2. Writing Dockerfiles
2.1 .NET Application Dockerfile
# Use official .NET SDK image as build stage
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env
WORKDIR /app
# Copy project files
COPY *.csproj ./
RUN dotnet restore
# Copy all code and build
COPY . ./
RUN dotnet publish -c Release -o out
# Use official .NET runtime image
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY --from=build-env /app/out .
# Expose ports
EXPOSE 80
EXPOSE 443
# Set environment variables
ENV ASPNETCORE_URLS=http://+:80
# Start application
ENTRYPOINT ["dotnet", "MyApp.dll"]2.2 Multi-Stage Build Optimization
# Build stage
FROM node:20 AS frontend-build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . ./
RUN npm run build
# Runtime stage
FROM nginx:alpine
COPY --from=frontend-build /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]2.3 Dockerfile Best Practices
| Technique | Description |
|---|---|
| Use multi-stage builds | Reduce image size |
| Layer caching | Place unchanged layers first |
| Use .dockerignore | Exclude unnecessary files |
| Use non-root user | Improve security |
| Set HEALTHCHECK | Monitor container health |
# .dockerignore
node_modules
npm-debug.log
.git
dist3. Docker Compose
3.1 docker-compose.yml Example
version: '3.8'
services:
web:
build: .
ports:
- "80:80"
depends_on:
- db
- redis
environment:
- ConnectionStrings__DefaultConnection=Server=db;Database=MyDb;User ID=sa;Password=Password123;
- Redis__ConnectionString=redis:6379
db:
image: mcr.microsoft.com/mssql/server:2022-latest
environment:
- SA_PASSWORD=Password123
- ACCEPT_EULA=Y
volumes:
- sql_data:/var/opt/mssql
redis:
image: redis:latest
volumes:
- redis_data:/data
ports:
- "6379:6379"
volumes:
sql_data:
redis_data:3.2 Common Commands
# Start services
docker-compose up -d
# View logs
docker-compose logs -f
# Stop services
docker-compose down
# Rebuild and start
docker-compose up -d --build
# View service status
docker-compose ps
# Enter container
docker-compose exec web /bin/bash4. Network Configuration
4.1 Create a Custom Network
# Create network
docker network create my-network
# List networks
docker network ls
# Connect container to network
docker network connect my-network container_name4.2 Docker Compose Networks
version: '3.8'
services:
web:
build: .
networks:
- frontend
- backend
api:
build: ./api
networks:
- backend
db:
image: mysql
networks:
- backend
networks:
frontend:
driver: bridge
backend:
driver: bridge5. Data Persistence
5.1 Using Volumes
# Create volume
docker volume create my-volume
# List volumes
docker volume ls
# Run container with volume mount
docker run -d -v my-volume:/app/data nginx5.2 Mount Host Directories
# Mount host directory to container
docker run -d -v /host/path:/container/path nginx
# Read-only mount
docker run -d -v /host/path:/container/path:ro nginx6. Docker Image Management
6.1 Build Images
# Build image
docker build -t my-app:1.0.0 .
# Pass build arguments
docker build --build-arg ENV=production -t my-app:1.0.0 .6.2 Push Images to Registry
# Log in to Docker Hub
docker login
# Tag image
docker tag my-app:1.0.0 username/my-app:1.0.0
# Push image
docker push username/my-app:1.0.06.3 Use a Private Registry
# Start private registry
docker run -d -p 5000:5000 --name registry registry:2
# Tag image
docker tag my-app:1.0.0 localhost:5000/my-app:1.0.0
# Push image
docker push localhost:5000/my-app:1.0.0
# Pull image
docker pull localhost:5000/my-app:1.0.07. Security Best Practices
7.1 Image Security
# Scan image for vulnerabilities
docker scan my-app:1.0.0
# Use non-root user
RUN useradd -m appuser
USER appuser
# Minimize image
FROM alpine:latest7.2 Container Security
# Limit container resources
docker run --memory=512m --cpus=2 nginx
# Read-only filesystem
docker run --read-only nginx
# Disable privileged mode
docker run --privileged=false nginx8. Monitoring and Logging
8.1 View Logs
# View container logs
docker logs container_id
# Follow logs in real time
docker logs -f container_id
# View last N lines of logs
docker logs --tail 100 container_id8.2 Container Monitoring
# View container resource usage
docker stats
# View container details
docker inspect container_id9. Docker Swarm Cluster
9.1 Initialize Swarm
# Initialize Swarm
docker swarm init
# Add worker node
docker swarm join --token token manager_ip:23779.2 Deploy Services
# docker-compose.yml
version: '3.8'
services:
web:
image: my-app:1.0.0
deploy:
replicas: 3
restart_policy:
condition: on-failure
resources:
limits:
memory: 512M
reservations:
memory: 256M
ports:
- "80:80"# Deploy service
docker stack deploy -c docker-compose.yml my-stack
# View services
docker stack services my-stack
# Scale service
docker service scale my-stack_web=5Summary
Docker containerization simplifies application deployment and operations, improving development efficiency and system reliability. Mastering Docker is an essential skill for modern DevOps engineers.
Author: Lei Tao
Date: June 15, 2024