最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

從入門到精通詳解Docker容器化的實(shí)戰(zhàn)指南

 更新時(shí)間:2026年03月27日 09:17:57   作者:lbb 小魔仙  
在微服務(wù)時(shí)代,Docker已成為開發(fā)者的必備技能,本文將帶你從零開始,通過(guò)實(shí)戰(zhàn)案例掌握Docker的核心技術(shù),包括容器管理、鏡像構(gòu)建、Docker Compose編排等,附完整可運(yùn)行代碼

前言

你是否遇到過(guò)這樣的困擾:

  • “在我本地能跑,為什么部署到服務(wù)器就報(bào)錯(cuò)了?”
  • “項(xiàng)目依賴太多,環(huán)境配置太復(fù)雜”
  • “多個(gè)項(xiàng)目需要不同版本的Python/Node.js”

Docker的出現(xiàn)完美解決了這些問(wèn)題!它通過(guò)容器化技術(shù),將應(yīng)用程序及其依賴打包成一個(gè)輕量級(jí)、可移植的容器,實(shí)現(xiàn)"一次構(gòu)建,到處運(yùn)行"。

本文將從Docker的基礎(chǔ)概念講起,通過(guò)多個(gè)實(shí)戰(zhàn)案例帶你掌握容器化技術(shù),最終能夠獨(dú)立完成復(fù)雜應(yīng)用的Docker化部署。

一、Docker核心概念

1.1 什么是Docker

Docker是一個(gè)開源的容器化平臺(tái),它允許開發(fā)者將應(yīng)用及其依賴打包到一個(gè)輕量級(jí)、可移植的容器中。

核心優(yōu)勢(shì):

  • 環(huán)境一致性:開發(fā)、測(cè)試、生產(chǎn)環(huán)境完全一致
  • 快速部署:秒級(jí)啟動(dòng)應(yīng)用
  • 資源隔離:進(jìn)程、網(wǎng)絡(luò)、存儲(chǔ)隔離
  • 輕量級(jí):相比虛擬機(jī)占用更少資源

1.2 核心組件對(duì)比

組件說(shuō)明類比
鏡像(Image)只讀的模板,包含運(yùn)行應(yīng)用所需的一切類似于面向?qū)ο缶幊讨械?quot;類"
容器(Container)鏡像的運(yùn)行實(shí)例類似于"對(duì)象"
倉(cāng)庫(kù)(Registry)存儲(chǔ)和分發(fā)鏡像的地方類似于代碼倉(cāng)庫(kù)(如GitHub)
Dockerfile構(gòu)建鏡像的腳本類似于Makefile或CMakeLists.txt

1.3 Docker vs 虛擬機(jī)

┌─────────────────────────────────────────────────┐
│                 虛擬機(jī)架構(gòu)                        │
├─────────────────────────────────────────────────┤
│  應(yīng)用程序A    應(yīng)用程序B    應(yīng)用程序C               │
├─────────────────────────────────────────────────┤
│  Guest OS    Guest OS    Guest OS               │
├─────────────────────────────────────────────────┤
│              Hypervisor                         │
├─────────────────────────────────────────────────┤
│                 Host OS                         │
├─────────────────────────────────────────────────┤
│                 硬件                             │
└─────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────┐
│                 Docker架構(gòu)                       │
├─────────────────────────────────────────────────┤
│  應(yīng)用程序A    應(yīng)用程序B    應(yīng)用程序C               │
├─────────────────────────────────────────────────┤
│              Docker Engine                      │
├─────────────────────────────────────────────────┤
│                 Host OS                         │
├─────────────────────────────────────────────────┤
│                 硬件                             │
└─────────────────────────────────────────────────┘

性能對(duì)比:

  • 啟動(dòng)速度:虛擬機(jī)分鐘級(jí) vs Docker秒級(jí)
  • 磁盤占用:虛擬機(jī)GB級(jí) vs Docker MB級(jí)
  • 性能損耗:虛擬機(jī)10-20% vs Docker<5%

二、Docker安裝與配置

2.1 Windows安裝

# 1. 下載Docker Desktop
# 訪問(wèn) https://www.docker.com/products/docker-desktop/

# 2. 安裝后驗(yàn)證
docker --version
docker-compose --version

# 3. 啟動(dòng)Docker Desktop

2.2 Linux安裝

# Ubuntu/Debian
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# 將當(dāng)前用戶添加到docker組
sudo usermod -aG docker $USER

# 重新登錄或執(zhí)行
newgrp docker

# 驗(yàn)證安裝
docker --version
docker run hello-world

2.3 配置鏡像加速器

# 編輯Docker配置文件
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com"
  ]
}
EOF

# 重啟Docker服務(wù)
sudo systemctl daemon-reload
sudo systemctl restart docker

三、Docker基礎(chǔ)命令

3.1 鏡像操作

# 搜索鏡像
docker search nginx

# 拉取鏡像
docker pull nginx:latest
docker pull python:3.10-slim

# 查看本地鏡像
docker images
docker image ls

# 刪除鏡像
docker rmi nginx:latest
docker image prune -a  # 刪除未使用的鏡像

# 構(gòu)建鏡像
docker build -t myapp:1.0 .

3.2 容器操作

# 運(yùn)行容器
docker run -d --name mynginx -p 80:80 nginx

# 查看運(yùn)行中的容器
docker ps
docker container ls

# 查看所有容器(包括停止的)
docker ps -a

# 停止容器
docker stop mynginx

# 啟動(dòng)容器
docker start mynginx

# 重啟容器
docker restart mynginx

# 刪除容器
docker rm mynginx
docker container prune  # 刪除停止的容器

# 查看容器日志
docker logs mynginx
docker logs -f mynginx  # 實(shí)時(shí)查看

# 進(jìn)入容器
docker exec -it mynginx /bin/bash
docker exec -it mynginx sh

3.3 常用參數(shù)說(shuō)明

參數(shù)說(shuō)明示例
-d后臺(tái)運(yùn)行docker run -d nginx
-p端口映射-p 8080:80
-v掛載卷-v /data:/app/data
-e環(huán)境變量-e MYSQL_ROOT_PASSWORD=123456
--name容器名稱--name myapp
--restart重啟策略--restart=always

四、Dockerfile實(shí)戰(zhàn)

4.1 Dockerfile基礎(chǔ)語(yǔ)法

# FROM: 指定基礎(chǔ)鏡像
FROM python:3.10-slim

# LABEL: 添加元數(shù)據(jù)
LABEL maintainer="your-email@example.com"
LABEL version="1.0"

# WORKDIR: 設(shè)置工作目錄
WORKDIR /app

# COPY: 復(fù)制文件到容器
COPY requirements.txt .

# RUN: 執(zhí)行命令
RUN pip install --no-cache-dir -r requirements.txt

# COPY: 復(fù)制應(yīng)用代碼
COPY . .

# EXPOSE: 聲明暴露的端口
EXPOSE 8000

# ENV: 設(shè)置環(huán)境變量
ENV PYTHONUNBUFFERED=1

# CMD: 容器啟動(dòng)時(shí)執(zhí)行的命令
CMD ["python", "app.py"]

4.2 實(shí)戰(zhàn)案例1:Python Flask應(yīng)用

項(xiàng)目結(jié)構(gòu):

flask-app/
├── app.py
├── requirements.txt
├── Dockerfile
└── .dockerignore

app.py:

from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/')
def hello():
    return jsonify({
        "message": "Hello from Docker!",
        "status": "success"
    })
@app.route('/health')
def health():
    return jsonify({"status": "healthy"})
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)

requirements.txt:

flask==3.0.0
gunicorn==21.2.0

Dockerfile:

FROM python:3.10-slim
LABEL maintainer="your-email@example.com"
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:8000", "app:app"]

.dockerignore:

__pycache__
*.pyc
.git
.gitignore
venv

構(gòu)建和運(yùn)行:

# 構(gòu)建鏡像
docker build -t flask-app:1.0 .

# 運(yùn)行容器
docker run -d --name flask-app -p 8000:8000 flask-app:1.0

# 測(cè)試
curl http://localhost:8000

4.3 實(shí)戰(zhàn)案例2:Node.js應(yīng)用

項(xiàng)目結(jié)構(gòu):

node-app/
├── package.json
├── index.js
├── Dockerfile
└── .dockerignore

package.json:

{
  "name": "node-docker-app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "express": "^4.18.2"
  }
}

index.js:

const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;
app.get('/', (req, res) => {
    res.json({
        message: 'Hello from Node.js in Docker!',
        timestamp: new Date().toISOString()
    });
});
app.get('/api/users', (req, res) => {
    res.json([
        { id: 1, name: 'Alice' },
        { id: 2, name: 'Bob' }
    ]);
});
app.listen(PORT, () => {
    console.log(`Server running on port ${PORT}`);
});

Dockerfile(多階段構(gòu)建):

# 階段1: 構(gòu)建階段
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
# 階段2: 運(yùn)行階段
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package*.json ./
COPY --from=builder /app/index.js ./
EXPOSE 3000
CMD ["node", "index.js"]

構(gòu)建和運(yùn)行:

# 構(gòu)建鏡像
docker build -t node-app:1.0 .

# 運(yùn)行容器
docker run -d --name node-app -p 3000:3000 node-app:1.0

# 測(cè)試
curl http://localhost:3000

4.4 實(shí)戰(zhàn)案例3:Nginx靜態(tài)網(wǎng)站

項(xiàng)目結(jié)構(gòu):

nginx-site/
├── index.html
├── css/
│   └── style.css
├── js/
│   └── app.js
└── nginx.conf

index.html:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Docker Nginx Demo</title>
    <link rel="stylesheet" href="css/style.css" rel="external nofollow" >
</head>
<body>
    <div class="container">
        <h1>?? Welcome to Docker Nginx</h1>
        <p>This site is served by Nginx in a Docker container!</p>
        <button id="btn">Click Me</button>
    </div>
    <script src="js/app.js"></script>
</body>
</html>

nginx.conf:

events {
    worker_connections 1024;
}
http {
    server {
        listen 80;
        server_name localhost;
        root /usr/share/nginx/html;
        index index.html;
        location / {
            try_files $uri $uri/ /index.html;
        }
        location /api/ {
            proxy_pass http://backend:8000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

Dockerfile:

FROM nginx:alpine
LABEL maintainer="your-email@example.com"
COPY nginx.conf /etc/nginx/nginx.conf
COPY . /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

五、Docker Compose實(shí)戰(zhàn)

5.1 Docker Compose簡(jiǎn)介

Docker Compose是用于定義和運(yùn)行多容器Docker應(yīng)用程序的工具。通過(guò)YAML文件配置應(yīng)用的服務(wù),然后使用一個(gè)命令創(chuàng)建和啟動(dòng)所有服務(wù)。

5.2 docker-compose.yml基礎(chǔ)語(yǔ)法

version: '3.8'
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - app
  app:
    build: ./app
    ports:
      - "8000:8000"
    environment:
      - DATABASE_URL=postgres://user:pass@db:5432/mydb
    depends_on:
      - db
  db:
    image: postgres:15
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass
      - POSTGRES_DB=mydb
    volumes:
      - postgres_data:/var/lib/postgresql/data
volumes:
  postgres_data:

5.3 實(shí)戰(zhàn)案例:完整Web應(yīng)用棧

項(xiàng)目結(jié)構(gòu):

fullstack-app/
├── docker-compose.yml
├── frontend/
│   ├── Dockerfile
│   └── src/
├── backend/
│   ├── Dockerfile
│   ├── requirements.txt
│   └── app.py
└── db/
    └── init.sql

docker-compose.yml:

version: '3.8'
services:
  # 前端服務(wù)
  frontend:
    build:
      context: ./frontend
      dockerfile: Dockerfile
    ports:
      - "80:80"
    depends_on:
      - backend
    networks:
      - app-network
  # 后端服務(wù)
  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile
    ports:
      - "8000:8000"
    environment:
      - DATABASE_HOST=db
      - DATABASE_PORT=5432
      - DATABASE_NAME=appdb
      - DATABASE_USER=appuser
      - DATABASE_PASSWORD=apppass
    depends_on:
      - db
    networks:
      - app-network
    volumes:
      - ./backend:/app
  # 數(shù)據(jù)庫(kù)服務(wù)
  db:
    image: postgres:15-alpine
    environment:
      - POSTGRES_DB=appdb
      - POSTGRES_USER=appuser
      - POSTGRES_PASSWORD=apppass
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql
    ports:
      - "5432:5432"
    networks:
      - app-network
  # Redis緩存
  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    networks:
      - app-network
volumes:
  postgres_data:
networks:
  app-network:
    driver: bridge

backend/app.py:

from flask import Flask, jsonify
import psycopg2
from redis import Redis
import os
app = Flask(__name__)
def get_db_connection():
    conn = psycopg2.connect(
        host=os.getenv('DATABASE_HOST', 'db'),
        port=int(os.getenv('DATABASE_PORT', 5432)),
        database=os.getenv('DATABASE_NAME', 'appdb'),
        user=os.getenv('DATABASE_USER', 'appuser'),
        password=os.getenv('DATABASE_PASSWORD', 'apppass')
    )
    return conn
def get_redis():
    return Redis(
        host='redis',
        port=6379,
        decode_responses=True
    )
@app.route('/')
def index():
    return jsonify({
        "message": "Fullstack API",
        "services": {
            "database": "PostgreSQL",
            "cache": "Redis"
        }
    })
@app.route('/health')
def health():
    try:
        redis = get_redis()
        redis.ping()
        conn = get_db_connection()
        cursor = conn.cursor()
        cursor.execute('SELECT 1')
        cursor.close()
        conn.close()
        return jsonify({
            "status": "healthy",
            "database": "connected",
            "redis": "connected"
        })
    except Exception as e:
        return jsonify({
            "status": "unhealthy",
            "error": str(e)
        }), 500
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)

backend/Dockerfile:

FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "app.py"]

backend/requirements.txt:

flask==3.0.0
psycopg2-binary==2.9.9
redis==5.0.1

db/init.sql:

CREATE TABLE IF NOT EXISTS users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO users (name, email) VALUES
    ('Alice', 'alice@example.com'),
    ('Bob', 'bob@example.com');

啟動(dòng)應(yīng)用:

# 構(gòu)建并啟動(dòng)所有服務(wù)
docker-compose up -d

# 查看服務(wù)狀態(tài)
docker-compose ps

# 查看日志
docker-compose logs -f

# 停止服務(wù)
docker-compose down

# 停止并刪除卷
docker-compose down -v

六、數(shù)據(jù)持久化

6.1 數(shù)據(jù)卷(Volume)

# 創(chuàng)建數(shù)據(jù)卷
docker volume create mydata

# 查看數(shù)據(jù)卷
docker volume ls
docker volume inspect mydata

# 使用數(shù)據(jù)卷
docker run -d --name myapp -v mydata:/app/data nginx

# 刪除數(shù)據(jù)卷
docker volume rm mydata

6.2 綁定掛載(Bind Mount)

# 掛載本地目錄
docker run -d --name myapp \
    -v /host/path:/container/path \
    nginx

# 只讀掛載
docker run -d --name myapp \
    -v /host/path:/container/path:ro \
    nginx

6.3 實(shí)戰(zhàn)案例:MySQL數(shù)據(jù)持久化

version: '3.8'
services:
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: myapp
      MYSQL_USER: appuser
      MYSQL_PASSWORD: apppass
    volumes:
      # 數(shù)據(jù)持久化
      - mysql_data:/var/lib/mysql
      # 初始化腳本
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
      # 配置文件
      - ./my.cnf:/etc/mysql/conf.d/custom.cnf:ro
    ports:
      - "3306:3306"
volumes:
  mysql_data:

七、網(wǎng)絡(luò)管理

7.1 Docker網(wǎng)絡(luò)類型

網(wǎng)絡(luò)類型說(shuō)明使用場(chǎng)景
bridge默認(rèn)網(wǎng)絡(luò),容器間通過(guò)橋接通信單機(jī)多容器通信
host容器使用宿主機(jī)網(wǎng)絡(luò)需要高性能網(wǎng)絡(luò)
none無(wú)網(wǎng)絡(luò)完全隔離
overlay跨主機(jī)網(wǎng)絡(luò)Docker Swarm集群

7.2 創(chuàng)建自定義網(wǎng)絡(luò)

# 創(chuàng)建bridge網(wǎng)絡(luò)
docker network create mynetwork

# 查看網(wǎng)絡(luò)
docker network ls
docker network inspect mynetwork

# 連接容器到網(wǎng)絡(luò)
docker network connect mynetwork mycontainer

# 斷開網(wǎng)絡(luò)
docker network disconnect mynetwork mycontainer

# 刪除網(wǎng)絡(luò)
docker network rm mynetwork

7.3 實(shí)戰(zhàn)案例:多服務(wù)網(wǎng)絡(luò)通信

version: '3.8'
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    networks:
      - frontend
      - backend
  app:
    build: ./app
    networks:
      - backend
  db:
    image: postgres:15
    networks:
      - backend
networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge

八、Docker最佳實(shí)踐

8.1 鏡像優(yōu)化

1. 使用多階段構(gòu)建

# 構(gòu)建階段
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# 運(yùn)行階段
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html

2. 減少層數(shù)

# 不好的做法
RUN apt-get update
RUN apt-get install -y python3
RUN apt-get install -y pip

# 好的做法
RUN apt-get update && \
    apt-get install -y python3 pip && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

3. 使用.dockerignore

.git
.gitignore
node_modules
__pycache__
*.log
.env

8.2 安全最佳實(shí)踐

# 使用非root用戶
FROM python:3.10-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

# 創(chuàng)建非root用戶
RUN useradd -m appuser && \
    chown -R appuser:appuser /app

USER appuser

EXPOSE 8000

CMD ["python", "app.py"]

8.3 健康檢查

version: '3.8'
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    healthcheck:
      test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s
  app:
    build: ./app
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
      interval: 30s
      timeout: 10s
      retries: 3

8.4 日志管理

version: '3.8'
services:
  app:
    image: myapp:1.0
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

九、常見問(wèn)題與解決方案

Q1: 容器啟動(dòng)失敗怎么辦?

排查步驟:

# 查看容器日志
docker logs <container_id>

# 查看容器詳細(xì)信息
docker inspect <container_id>

# 進(jìn)入容器調(diào)試
docker exec -it <container_id> /bin/bash

# 查看容器狀態(tài)
docker ps -a

Q2: 如何清理Docker資源?

# 清理停止的容器
docker container prune

# 清理未使用的鏡像
docker image prune -a

# 清理未使用的卷
docker volume prune

# 清理未使用的網(wǎng)絡(luò)
docker network prune

# 清理所有未使用的資源
docker system prune -a --volumes

Q3: 如何在容器和宿主機(jī)之間復(fù)制文件?

# 從宿主機(jī)復(fù)制到容器
docker cp /host/file.txt container:/container/path/

# 從容器復(fù)制到宿主機(jī)
docker cp container:/container/file.txt /host/path/

Q4: 如何限制容器資源?

version: '3.8'
services:
  app:
    image: myapp:1.0
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 256M

十、完整實(shí)戰(zhàn)項(xiàng)目

10.1 項(xiàng)目概述

構(gòu)建一個(gè)完整的博客系統(tǒng),包含:

  • 前端:React應(yīng)用
  • 后端:Flask API
  • 數(shù)據(jù)庫(kù):PostgreSQL
  • 緩存:Redis
  • 反向代理:Nginx

10.2 項(xiàng)目結(jié)構(gòu)

blog-system/
├── docker-compose.yml
├── frontend/
│   ├── Dockerfile
│   └── src/
├── backend/
│   ├── Dockerfile
│   ├── requirements.txt
│   └── app.py
├── nginx/
│   └── nginx.conf
└── db/
    └── init.sql

10.3 docker-compose.yml

version: '3.8'
services:
  # 前端服務(wù)
  frontend:
    build:
      context: ./frontend
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    depends_on:
      - backend
    networks:
      - blog-network
  # 后端服務(wù)
  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile
    ports:
      - "8000:8000"
    environment:
      - DATABASE_HOST=db
      - DATABASE_PORT=5432
      - DATABASE_NAME=blogdb
      - DATABASE_USER=bloguser
      - DATABASE_PASSWORD=blogpass
      - REDIS_HOST=redis
      - REDIS_PORT=6379
    depends_on:
      - db
      - redis
    networks:
      - blog-network
    volumes:
      - ./backend:/app
  # Nginx反向代理
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - frontend
      - backend
    networks:
      - blog-network
  # PostgreSQL數(shù)據(jù)庫(kù)
  db:
    image: postgres:15-alpine
    environment:
      - POSTGRES_DB=blogdb
      - POSTGRES_USER=bloguser
      - POSTGRES_PASSWORD=blogpass
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql
    networks:
      - blog-network
  # Redis緩存
  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    networks:
      - blog-network
volumes:
  postgres_data:
networks:
  blog-network:
    driver: bridge

10.4 啟動(dòng)項(xiàng)目

# 克隆項(xiàng)目
git clone <repository-url>
cd blog-system

# 構(gòu)建并啟動(dòng)所有服務(wù)
docker-compose up -d --build

# 查看服務(wù)狀態(tài)
docker-compose ps

# 查看日志
docker-compose logs -f

# 訪問(wèn)應(yīng)用
# 前端: http://localhost:3000
# 后端: http://localhost:8000
# Nginx: http://localhost

十一、總結(jié)

本文從Docker的基礎(chǔ)概念出發(fā),通過(guò)多個(gè)實(shí)戰(zhàn)案例詳細(xì)介紹了容器化技術(shù)的應(yīng)用:

  • 核心概念:鏡像、容器、倉(cāng)庫(kù)的關(guān)系
  • 基礎(chǔ)操作:鏡像和容器的常用命令
  • Dockerfile:構(gòu)建自定義鏡像的方法
  • Docker Compose:多容器編排技術(shù)
  • 數(shù)據(jù)持久化:卷和掛載的使用
  • 網(wǎng)絡(luò)管理:容器間通信配置
  • 最佳實(shí)踐:鏡像優(yōu)化、安全配置、健康檢查
  • 完整項(xiàng)目:博客系統(tǒng)的完整實(shí)現(xiàn)

通過(guò)本文的學(xué)習(xí),你應(yīng)該能夠:

  • 獨(dú)立使用Docker容器化應(yīng)用
  • 編寫高效的Dockerfile
  • 使用Docker Compose編排多服務(wù)應(yīng)用
  • 實(shí)現(xiàn)數(shù)據(jù)持久化和網(wǎng)絡(luò)通信
  • 遵循Docker最佳實(shí)踐

記住:Docker的核心價(jià)值在于"一次構(gòu)建,到處運(yùn)行",掌握它將極大提升你的開發(fā)效率!

以上就是從入門到精通詳解Docker容器化的實(shí)戰(zhàn)指南的詳細(xì)內(nèi)容,更多關(guān)于Docker容器化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Linux系統(tǒng)通過(guò)Docker安裝SQL?Server數(shù)據(jù)庫(kù)

    Linux系統(tǒng)通過(guò)Docker安裝SQL?Server數(shù)據(jù)庫(kù)

    這篇文章介紹了Linux系統(tǒng)通過(guò)Docker安裝SQL?Server數(shù)據(jù)庫(kù)的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • Docker之Compose的安裝和使用過(guò)程

    Docker之Compose的安裝和使用過(guò)程

    DockerCompose是用于定義和運(yùn)行多容器應(yīng)用的工具,通過(guò)定義yml文件自動(dòng)創(chuàng)建或管理容器,簡(jiǎn)化了Docker操作,本文詳細(xì)介紹了DockerCompose的安裝步驟、版本差異以及基本命令,幫助用戶更好地理解和使用DockerCompose
    2026-04-04
  • 樹莓派系列之使用docker安裝青龍面板和改端口號(hào)的配置問(wèn)題

    樹莓派系列之使用docker安裝青龍面板和改端口號(hào)的配置問(wèn)題

    這篇文章主要介紹了樹莓派系列之使用docker安裝青龍面板和改端口號(hào)的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • docker?pull拉取鏡像報(bào)錯(cuò)問(wèn)題及解決

    docker?pull拉取鏡像報(bào)錯(cuò)問(wèn)題及解決

    這篇文章主要介紹了docker?pull拉取鏡像報(bào)錯(cuò)問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • 使用Docker搭建Picsur圖床服務(wù)的實(shí)現(xiàn)

    使用Docker搭建Picsur圖床服務(wù)的實(shí)現(xiàn)

    本文介紹如何在騰訊云輕量應(yīng)用服務(wù)器通過(guò)Docker部署Picsur圖床服務(wù),文中通過(guò)圖文示例步驟介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-07-07
  • DocKer 復(fù)制本地鏡像的步驟實(shí)現(xiàn)

    DocKer 復(fù)制本地鏡像的步驟實(shí)現(xiàn)

    本文主要介紹了DocKer 復(fù)制本地鏡像的步驟實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-12-12
  • 如何搭建docker虛擬機(jī)測(cè)試服

    如何搭建docker虛擬機(jī)測(cè)試服

    文章介紹如何搭建Docker虛擬機(jī)測(cè)試服,通過(guò)隔離環(huán)境、安裝CentOS鏡像并映射端口,配置安全組和域名轉(zhuǎn)發(fā),實(shí)現(xiàn)本地開發(fā)測(cè)試連接測(cè)試服數(shù)據(jù)庫(kù)和Redis,感興趣的朋友跟隨小編一起學(xué)習(xí)吧
    2025-08-08
  • Docker?Desktop?啟用?Kubernetes?失敗后處理方案

    Docker?Desktop?啟用?Kubernetes?失敗后處理方案

    ?在setting -> Kubernetes 中,選中 Enable Kubernetes 后,長(zhǎng)時(shí)間顯示 Starting ...? ,在Images中顯示幾個(gè)自動(dòng)下載的鏡像后,顯示 Start Kubernetes failed,這篇文章主要介紹了Docker?Desktop啟用Kubernetes失敗后處理方法,需要的朋友可以參考下
    2023-08-08
  • Docker容器中文亂碼(修改docker容器編碼格式)的解決方案

    Docker容器中文亂碼(修改docker容器編碼格式)的解決方案

    這篇文章主要介紹了Docker容器中文亂碼(修改docker容器編碼格式)的解決方案的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • Docker內(nèi)置網(wǎng)絡(luò)模式分析

    Docker內(nèi)置網(wǎng)絡(luò)模式分析

    這篇文章主要為大家介紹了Docker內(nèi)置網(wǎng)絡(luò)模式分析及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08

最新評(píng)論

富裕县| 施甸县| 阿拉尔市| 夏河县| 来安县| 江门市| 施秉县| 遵义市| 静宁县| 广南县| 大余县| 榆树市| 南投县| 兴义市| 武鸣县| 柘荣县| 松原市| 巩留县| 眉山市| 襄樊市| 石楼县| 永寿县| 南召县| 隆尧县| 沐川县| 那曲县| 上栗县| 仲巴县| 玉山县| 姚安县| 松原市| 瓦房店市| 静安区| 喜德县| 三穗县| 若羌县| 岱山县| 禄丰县| 湘潭市| 鲜城| 耒阳市|