DockerïŒéçºããæ¬çªç°å¢ãŸã§
ã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããåã®ããã®å®å šãªDockerã¬ã€ããDockerfileãDocker Composeããã«ãã¹ããŒãžãã«ããæ¬çªç°å¢ãžã®ãããã€ãå®è·µçãªäŸã§è§£èª¬ããŸãã

Dockerã¯ã¢ããªã±ãŒã·ã§ã³ã®éçºããã¹ãããããã€ã®æ¹æ³ãæ ¹æ¬çã«å€é©ããŠããŸããã¢ããªã±ãŒã·ã§ã³ãšãã®äŸåé¢ä¿ãããŒã¿ãã«ãªã³ã³ããã«ã«ãã»ã«åããããšã§ãDockerã¯æåãªãèªåã®ãã·ã³ã§ã¯åãããšããåé¡ãæé€ãããã¹ãŠã®ç°å¢ã§ã®äžè²«æ§ãä¿èšŒããŸãããã®ã¬ã€ãã§ã¯ãæåã®Dockerfileããæ¬çªç°å¢ãžã®ãããã€ãŸã§ã®å®å šãªéã®ãã解説ããŸãã
Docker Desktop 5.xã¯ããã€ãã£ãcontainerdãµããŒããæé©åããããªãœãŒã¹ç®¡çãã·ãŒã ã¬ã¹ãªKubernetesçµ±åãªã©ãå€§å¹ ãªããã©ãŒãã³ã¹æ¹åããããããŠããŸãããã«ãã¢ãŒããã¯ãã£ã€ã¡ãŒãžïŒARM/x86ïŒã¯çŸåšæšæºçãªãã©ã¯ãã£ã¹ãšãªã£ãŠããŸãã
ã³ã³ããåã®åºç€
ã³ã³ããã¯ãã³ãŒããã©ã³ã¿ã€ã ãã·ã¹ãã ã©ã€ãã©ãªãèšå®ãããã±ãŒãžåãã軜éãªãœãããŠã§ã¢ãŠãããã§ããããŒããŠã§ã¢ãä»®æ³åããä»®æ³ãã·ã³ãšã¯ç°ãªããã³ã³ããã¯ãã¹ãã·ã¹ãã ã®ã«ãŒãã«ãå ±æãããããèµ·åãé«éã§ãªãœãŒã¹æ¶è²»ãå°ãªããªããŸãã
# terminal
# Docker installation on Ubuntu
sudo apt update
sudo apt install -y docker.io
# Add user to docker group (avoids sudo)
sudo usermod -aG docker $USER
# Verify installation
docker --version
# Docker version 26.1.0, build 1234567
# First container: downloads image and runs
docker run hello-worldãã®ã³ãã³ãã¯Docker Hubããhello-worldã€ã¡ãŒãžãããŠã³ããŒããã確èªã¡ãã»ãŒãžã衚瀺ããã³ã³ãããèµ·åããŸãã
# terminal
# List running containers
docker ps
# List all containers (including stopped)
docker ps -a
# List downloaded images
docker images
# Remove a container
docker rm <container_id>
# Remove an image
docker rmi <image_name>ãããã®åºæ¬ã³ãã³ãã§ã³ã³ãããšã€ã¡ãŒãžã®ã©ã€ããµã€ã¯ã«ã管çããŸãã
æåã®Dockerfileã®äœæ
Dockerfileã«ã¯Dockerã€ã¡ãŒãžãæ§ç¯ããããã®åœä»€ãå«ãŸããŠããŸããååœä»€ã¯æçµã€ã¡ãŒãžã«ã¬ã€ã€ãŒãäœæãããã£ãã·ã¥ãšåå©çšãå¯èœã«ããŸãã
# Dockerfile
# Base image: Node.js 22 on Alpine Linux (lightweight)
FROM node:22-alpine
# Set working directory in the container
WORKDIR /app
# Copy dependency files first (cache optimization)
COPY package*.json ./
# Install dependencies
RUN npm ci --only=production
# Copy source code
COPY . .
# Expose port (documentation)
EXPOSE 3000
# Startup command
CMD ["node", "server.js"]åœä»€ã®é åºã¯ãã£ãã·ã¥ã®æé©åã«ãšã£ãŠæ¥µããŠéèŠã§ãã倿Žé »åºŠã®äœããã¡ã€ã«ïŒpackage.jsonïŒã¯ãœãŒã¹ã³ãŒããããå ã«ã³ããŒããå¿ èŠããããŸãã
# terminal
# Build image with a tag
docker build -t my-app:1.0 .
# Run the container
docker run -d -p 3000:3000 --name my-app-container my-app:1.0
# Check logs
docker logs my-app-container
# Access container shell
docker exec -it my-app-container sh-dãã©ã°ã¯ã³ã³ãããããã¯ã°ã©ãŠã³ãã§å®è¡ãã-pã¯ã³ã³ããã®ããŒã3000ããã¹ãã®ããŒã3000ã«ãããã³ã°ããŸãã
Alpineã€ã¡ãŒãžã¯å€§å¹ ã«å°ãããªã£ãŠããŸãïŒDebianã®çŽ120MBã«å¯ŸããŠçŽ5MBïŒããã ããglibcã®ä»£ããã«musl libcã䜿çšããŠãããããäžéšã®ãã€ãã£ãäŸåé¢ä¿ã§éäºææ§ãçºçããå¯èœæ§ããããŸããåé¡ãçºçããå Žåã¯ãDebianããŒã¹ã®ã€ã¡ãŒãžïŒnode:22-slimïŒã®äœ¿çšãæšå¥šãããŸãã
æ¬çªç°å¢ã®ããã®ãã«ãã¹ããŒãžãã«ã
ãã«ãã¹ããŒãžãã«ãã¯ããã«ãç°å¢ãã©ã³ã¿ã€ã ç°å¢ããåé¢ããããšã§ãæé©åãããæ¬çªçšã€ã¡ãŒãžãäœæããŸããæçµã€ã¡ãŒãžã«ã¯å¿ èŠãªã¢ãŒãã£ãã¡ã¯ãã®ã¿ãå«ãŸããŸãã
# Dockerfile.production
# ============================================
# Stage 1: Build
# ============================================
FROM node:22-alpine AS builder
WORKDIR /app
# Copy and install dependencies (including devDependencies)
COPY package*.json ./
RUN npm ci
# Copy source code
COPY . .
# Build the application (TypeScript, bundling, etc.)
RUN npm run build
# ============================================
# Stage 2: Production
# ============================================
FROM node:22-alpine AS production
# Non-root user for security
RUN addgroup -g 1001 -S nodejs && \
adduser -S nodejs -u 1001
WORKDIR /app
# Copy only necessary files from builder stage
COPY /app/dist ./dist
COPY /app/node_modules ./node_modules
COPY /app/package.json ./
# Switch to non-root user
USER nodejs
# Environment variables
ENV NODE_ENV=production
ENV PORT=3000
EXPOSE 3000
# Startup command
CMD ["node", "dist/server.js"]ãã®ã¢ãããŒãã«ããããã«ãããŒã«ãdevDependenciesããœãŒã¹ãã¡ã€ã«ãé€å€ããæçµã€ã¡ãŒãžã®ãµã€ãºãå€§å¹ ã«åæžã§ããŸãã
# terminal
# Build with specific file
docker build -f Dockerfile.production -t my-app:production .
# Compare image sizes
docker images | grep my-app
# my-app production abc123 150MB
# my-app 1.0 def456 450MBãµã€ãºåæžã¯ãããžã§ã¯ãã«ãã£ãŠ60ã70%ã«éãããããã€æéã®æ¹åãšæ»æå¯Ÿè±¡é åã®çž®å°ã«ã€ãªãããŸãã
ããŒã«ã«ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ã®ããã®Docker Compose
Docker Composeã¯ãã«ãã³ã³ããã¢ããªã±ãŒã·ã§ã³ã®ç®¡çãç°¡çŽ åããŸããYAMLãã¡ã€ã«ã§ãã¹ãŠã®ãµãŒãã¹ãèšå®ãäŸåé¢ä¿ã宣èšããŸãã
# docker-compose.yml
version: "3.9"
services:
# Main application
app:
build:
context: .
dockerfile: Dockerfile
ports:
- "3000:3000"
environment:
- NODE_ENV=development
- DATABASE_URL=postgresql://postgres:secret@db:5432/myapp
- REDIS_URL=redis://cache:6379
volumes:
# Mount source code for hot-reload
- ./src:/app/src
- ./package.json:/app/package.json
depends_on:
db:
condition: service_healthy
cache:
condition: service_started
networks:
- app-network
# PostgreSQL database
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: secret
POSTGRES_DB: myapp
volumes:
# Data persistence
- postgres_data:/var/lib/postgresql/data
# Initialization script
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
ports:
- "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
networks:
- app-network
# Redis cache
cache:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
command: redis-server --appendonly yes
networks:
- app-network
# Named volumes for persistence
volumes:
postgres_data:
redis_data:
# Dedicated network for isolation
networks:
app-network:
driver: bridgeãµãŒãã¹ã¯Dockerã®å éšãããã¯ãŒã¯ãéããŠååïŒdbãcacheïŒã§éä¿¡ããŸãããã«ã¹ãã§ãã¯ã«ãããã¢ããªã±ãŒã·ã§ã³èµ·ååã«äŸåé¢ä¿ã®æºåãå®äºããŠããããšãä¿èšŒãããŸãã
# terminal
# Start all services
docker compose up -d
# View logs from all services
docker compose logs -f
# Logs from a specific service
docker compose logs -f app
# Stop and remove containers
docker compose down
# Removal including volumes (caution: data loss)
docker compose down -v
# Rebuild after Dockerfile changes
docker compose up -d --buildDevOpsã®é¢æ¥å¯Ÿçã¯ã§ããŠããŸããïŒ
ã€ã³ã¿ã©ã¯ãã£ããªã·ãã¥ã¬ãŒã¿ãŒãflashcardsãæè¡ãã¹ãã§ç·Žç¿ããŸãããã
ã·ãŒã¯ã¬ãããšç°å¢å€æ°ã®ç®¡ç
ã·ãŒã¯ã¬ããã®å®å šãªç®¡çã¯æ¬çªç°å¢ã«ãããŠæ¥µããŠéèŠã§ããDockerã¯ã³ã³ããã¹ãã«å¿ããŠããã€ãã®ã¢ãããŒããæäŸããŠããŸãã
# docker-compose.override.yml (development only)
version: "3.9"
services:
app:
env_file:
- .env.development
environment:
- DEBUG=trueæ¬çªç°å¢ã§ã¯ãDocker secretsãããé«ãã»ãã¥ãªãã£ãæäŸããŸãã
# docker-compose.production.yml
version: "3.9"
services:
app:
build:
context: .
dockerfile: Dockerfile.production
secrets:
- db_password
- api_key
environment:
- NODE_ENV=production
- DATABASE_PASSWORD_FILE=/run/secrets/db_password
- API_KEY_FILE=/run/secrets/api_key
secrets:
db_password:
file: ./secrets/db_password.txt
api_key:
file: ./secrets/api_key.txtã¢ããªã±ãŒã·ã§ã³ã³ãŒãã¯ããŠã³ãããããã¡ã€ã«ããã·ãŒã¯ã¬ãããèªã¿åããŸãã
const fs = require('fs');
const path = require('path');
// Utility function to read Docker secrets
function readSecret(secretName) {
const secretPath = `/run/secrets/${secretName}`;
// Check if secret file exists
if (fs.existsSync(secretPath)) {
return fs.readFileSync(secretPath, 'utf8').trim();
}
// Fallback to classic environment variables
const envVar = secretName.toUpperCase();
return process.env[envVar];
}
module.exports = {
databasePassword: readSecret('db_password'),
apiKey: readSecret('api_key'),
};ãã®ã¢ãããŒãã«ãããç°å¢å€æ°ãDockerã€ã¡ãŒãžã§ã·ãŒã¯ã¬ãããé²åºããããšãé²ããŸãã
Dockerã€ã¡ãŒãžã®æé©å
ããã€ãã®ãã¯ããã¯ã«ããã€ã¡ãŒãžãµã€ãºãåæžããããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãã
# Dockerfile.optimized
FROM node:22-alpine AS base
# Install necessary tools in a single layer
RUN apk add --no-cache \
dumb-init \
&& rm -rf /var/cache/apk/*
# ============================================
# Stage: Dependencies
# ============================================
FROM base AS deps
WORKDIR /app
# Copy only lock files for caching
COPY package.json package-lock.json ./
# Install with mounted npm cache (BuildKit)
RUN \
npm ci --only=production
# ============================================
# Stage: Builder
# ============================================
FROM base AS builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN \
npm ci
COPY . .
RUN npm run build
# ============================================
# Stage: Production
# ============================================
FROM base AS production
# Image metadata
LABEL maintainer="team@example.com"
LABEL version="1.0"
LABEL description="Production-ready Node.js application"
# Non-root user
RUN addgroup -g 1001 -S nodejs && \
adduser -S nodejs -u 1001
WORKDIR /app
# Copy production dependencies
COPY /app/node_modules ./node_modules
# Copy build output
COPY /app/dist ./dist
COPY /app/package.json ./
USER nodejs
ENV NODE_ENV=production
# dumb-init as PID 1 for signal handling
ENTRYPOINT ["dumb-init", "--"]
CMD ["node", "dist/server.js"]dumb-initã䜿çšããããšã§ãUnixã·ã°ãã«ã®æ£ããåŠçãä¿èšŒãããã³ã³ããã®ã°ã¬ãŒã¹ãã«ã·ã£ããããŠã³ãå¯èœã«ãªããŸãã
# terminal
# Enable BuildKit for advanced features
export DOCKER_BUILDKIT=1
# Build with cache and detailed output
docker build --progress=plain -t my-app:optimized .
# Analyze image layers
docker history my-app:optimized
# Detailed image inspection
docker inspect my-app:optimizedã€ã¡ãŒãžã¯TrivyãSnykãªã©ã®ããŒã«ã䜿çšããŠå®æçã«è匱æ§ã¹ãã£ã³ãè¡ãå¿ èŠããããŸããããŒã¹ã€ã¡ãŒãžã¯ã»ãã¥ãªãã£ããããå«ããããã«å®æçã«æŽæ°ããå¿ èŠããããŸãã
é«åºŠãªDockerãããã¯ãŒãã³ã°
Dockerã¯ç°ãªããŠãŒã¹ã±ãŒã¹ã«å¯Ÿå¿ããè€æ°ã®ãããã¯ãŒã¯ãã©ã€ããŒãæäŸããŠããŸãã
# docker-compose.networking.yml
version: "3.9"
services:
# Publicly accessible frontend
frontend:
build: ./frontend
ports:
- "80:80"
networks:
- frontend-network
- backend-network
# API accessible only from frontend
api:
build: ./api
networks:
- backend-network
- database-network
# No external ports exposed
# Isolated database
database:
image: postgres:16-alpine
networks:
- database-network
# Accessible only by API
networks:
frontend-network:
driver: bridge
backend-network:
driver: bridge
internal: true # No internet access
database-network:
driver: bridge
internal: trueãã®èšå®ã¯æå°æš©éã®ååã«åŸã£ãŠãµãŒãã¹ãåé¢ããŸããããŒã¿ããŒã¹ã¯APIããã®ã¿ã¢ã¯ã»ã¹å¯èœã§ãã
# terminal
# Inspect Docker networks
docker network ls
# Details of a specific network
docker network inspect app-network
# Create a custom network
docker network create --driver bridge --subnet 172.28.0.0/16 custom-network
# Connect a container to an existing network
docker network connect custom-network my-containerããªã¥ãŒã ãšããŒã¿ã®æ°žç¶å
Dockerããªã¥ãŒã ã¯ã³ã³ããã®ã©ã€ããµã€ã¯ã«ãè¶ ããŠããŒã¿ãä¿æããŸãã
# docker-compose.volumes.yml
version: "3.9"
services:
app:
image: my-app:latest
volumes:
# Named volume for persistent data
- app_data:/app/data
# Bind mount for development
- ./uploads:/app/uploads:rw
# Read-only mount for configuration
- ./config:/app/config:ro
backup:
image: alpine
volumes:
# Access same volume for backups
- app_data:/data:ro
- ./backups:/backups
command: |
sh -c "tar czf /backups/backup-$$(date +%Y%m%d).tar.gz /data"
volumes:
app_data:
driver: local
driver_opts:
type: none
device: /path/to/host/data
o: bindååä»ãããªã¥ãŒã ãšãã€ã³ãããŠã³ãã®åºå¥ã¯éèŠã§ããããªã¥ãŒã ã¯Dockerã管çãããã€ã³ãããŠã³ãã¯ãã¹ãã®ãã¡ã€ã«ã·ã¹ãã ãçŽæ¥äœ¿çšããŸãã
# terminal
# List volumes
docker volume ls
# Inspect a volume
docker volume inspect app_data
# Remove orphaned volumes
docker volume prune
# Backup a volume
docker run --rm -v app_data:/data -v $(pwd):/backup alpine \
tar czf /backup/volume-backup.tar.gz /dataæ¬çªç°å¢ãžã®ãããã€
å ç¢ãªãããã€ã¯ãŒã¯ãããŒã«ã¯ãã«ãããã¹ããã¬ãžã¹ããªãžã®ããã·ã¥ãå«ãŸããŸãã
# deploy.sh
#!/bin/bash
set -e
# Variables
REGISTRY="registry.example.com"
IMAGE_NAME="my-app"
VERSION=$(git describe --tags --always)
echo "Building version: $VERSION"
# Build production image
docker build \
-f Dockerfile.production \
-t $REGISTRY/$IMAGE_NAME:$VERSION \
-t $REGISTRY/$IMAGE_NAME:latest \
--build-arg BUILD_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") \
--build-arg VERSION=$VERSION \
.
# Security scan
echo "Running security scan..."
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy image $REGISTRY/$IMAGE_NAME:$VERSION
# Push to registry
echo "Pushing to registry..."
docker push $REGISTRY/$IMAGE_NAME:$VERSION
docker push $REGISTRY/$IMAGE_NAME:latest
echo "Deployment complete: $REGISTRY/$IMAGE_NAME:$VERSION"ãµãŒããŒãžã®ãããã€ã«ã¯ãå°çšã®æ¬çªçšcomposeãã¡ã€ã«ã§èšå®ã調æŽããŸãã
# docker-compose.prod.yml
version: "3.9"
services:
app:
image: registry.example.com/my-app:latest
restart: always
deploy:
replicas: 3
resources:
limits:
cpus: "0.5"
memory: 512M
reservations:
cpus: "0.25"
memory: 256M
update_config:
parallelism: 1
delay: 10s
failure_action: rollback
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"ãã®èšå®ã¯ä¿¡é Œæ§ã®é«ããããã€ã®ããã®ãªãœãŒã¹å²ãåœãŠãæŽæ°æŠç¥ããã«ã¹ãã§ãã¯ãå®çŸ©ããŸãã
# terminal
# Production deployment with Docker Compose
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
# Zero-downtime update (rolling update)
docker compose -f docker-compose.yml -f docker-compose.prod.yml pull
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --no-deps app
# Rollback if issues occur
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --no-deps \
--scale app=0 && \
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --no-deps appã³ã³ããã®ã¢ãã¿ãªã³ã°ãšãããã°
ã³ã³ããã®ã¢ãã¿ãªã³ã°ã¯æ¬çªç°å¢ã«ãããŠäžå¯æ¬ ã§ãã
# terminal
# Real-time statistics for all containers
docker stats
# Statistics for a specific container with custom format
docker stats my-app --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
# Inspect processes in a container
docker top my-app
# Real-time Docker events
docker events --filter container=my-app
# Copy files from/to a container
docker cp my-app:/app/logs/error.log ./error.log詳现ãªãããã°ã«ã¯ãããã€ãã®ãã¯ããã¯ãå©çšå¯èœã§ãã
# terminal
# Interactive shell in a running container
docker exec -it my-app sh
# Execute a single command
docker exec my-app cat /app/config/settings.json
# Start a container in debug mode
docker run -it --rm --entrypoint sh my-app:latest
# Inspect environment variables
docker exec my-app printenv
# Analyze logs with filters
docker logs my-app --since 1h --tail 100 | grep ERROR# docker-compose.monitoring.yml
version: "3.9"
services:
app:
# ... existing configuration
labels:
- "prometheus.scrape=true"
- "prometheus.port=3000"
- "prometheus.path=/metrics"
prometheus:
image: prom/prometheus:latest
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.retention.time=15d'
grafana:
image: grafana/grafana:latest
ports:
- "3001:3000"
volumes:
- grafana_data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=secret
volumes:
prometheus_data:
grafana_data:ãã®ã¢ãã¿ãªã³ã°ã¹ã¿ãã¯ã«ãããã³ã³ããã¡ããªã¯ã¹ã®åéãšå¯èŠåãå¯èœã«ãªããŸãã
ãŸãšã
Dockerã¯ãã¹ãŠã®ç°å¢ã§ã®äžè²«æ§ãä¿èšŒããããšã§éçºãµã€ã¯ã«ãå€é©ããŸããã³ã³ããåã¯ããŒã¿ããªãã£ãå颿§ãåçŸæ§ããããããŸãããããã¯çŸä»£ã®ã¢ããªã±ãŒã·ã§ã³ã«äžå¯æ¬ ãªç¹æ§ã§ãã
æ¬çªç°å¢ã®ããã®Dockerãã§ãã¯ãªã¹ã
- â æé©åãããã€ã¡ãŒãžã®ããã®ãã«ãã¹ããŒãžãã«ã
- â ã³ã³ããå ã§ã®érootãŠãŒã¶ãŒ
- â ãã¹ãŠã®ãµãŒãã¹ã«ãã«ã¹ãã§ãã¯ãèšå®
- â Docker secretsãŸãã¯å®å šãªç°å¢å€æ°ã«ããã·ãŒã¯ã¬ãã管ç
- â ãªãœãŒã¹å¶éïŒCPUãã¡ã¢ãªïŒã®å®çŸ©
- â éèŠãªããŒã¿ã®æ°žç¶åã®ããã®ããªã¥ãŒã
- â ãã¡ã€ã«ããŒããŒã·ã§ã³ä»ãã®éäžãã®ã³ã°
- â ãããã€åã®ã€ã¡ãŒãžã»ãã¥ãªãã£ã¹ãã£ã³
- â ããŠã³ã¿ã€ã ãªãã®æŽæ°æŠç¥
- â ãµãŒãã¹éã®åé¢ããããããã¯ãŒã¯
ä»ããç·Žç¿ãå§ããŸãããïŒ
颿¥ã·ãã¥ã¬ãŒã¿ãŒãšæè¡ãã¹ãã§ç¥èããã¹ãããŸãããã
Dockerã®ç¿åŸã¯ããã¹ãŠã®çŸä»£çãªéçºè ã«ãšã£ãŠåºæ¬çãªã¹ãã«ã§ããããŒã«ã«ç°å¢ããæ¬çªç°å¢ã®ãããã€ãŸã§ãDockerã¯ã¯ãŒã¯ãããŒãæšæºåããéçšãç°¡çŽ åããŸããããã§ç޹ä»ããæŠå¿µã¯ãKubernetesãšå€§èŠæš¡ãªã³ã³ãããªãŒã±ã¹ãã¬ãŒã·ã§ã³ãæ¢æ±ããããã®ç¢ºåºããåºç€ã圢æããŸãã
ã¿ã°
å ±æ
é¢é£èšäº

Kubernetes: æåã®ã¢ããªã±ãŒã·ã§ã³ããããã€ãã
Kubernetesäžã«ã¢ããªã±ãŒã·ã§ã³ããããã€ããããã®å®è·µçãªã¬ã€ãã§ããminikubeã®ã€ã³ã¹ããŒã«ãããDeploymentãServiceãConfigMapãŸã§å ·äœäŸãšãšãã«è§£èª¬ããŸãã

ArgoCD GitOps å®å šã¬ã€ã 2026幎çïŒKubernetes ç¶ç¶çãããã€ã¡ã³ããšæè¡é¢æ¥å¯Ÿç
ArgoCD 3.4 ãš GitOps ã«ãã Kubernetes ç¶ç¶çãããã€ã¡ã³ãã解説ãApplication CRDãSync Waveããã«ãã¯ã©ã¹ã¿ãŒç®¡çãFlux æ¯èŒã颿¥è³ªåãç¶²çŸ ã

Terraform颿¥å¯Ÿçå®å šã¬ã€ã2026ïŒInfrastructure as Codeã®å¿ é ç¥è
Terraform颿¥ã§é »åºãã質åãç¶²çŸ çã«è§£èª¬ããŸããã¹ããŒã管çãã¢ãžã¥ãŒã«èšèšãCI/CDãã€ãã©ã€ã³ãŸã§ãIaC颿¥ã®åæ Œã«å¿ èŠãªç¥èãå®è·µçãªã³ãŒãäŸãšãšãã«ç޹ä»ããŸãã