Docker实战:从安装到多容器编排指南

一、Docker环境准备

1. 安装Docker

Ubuntu/Debian系统:

bash 复制代码
# 更新包索引
sudo apt update

# 安装依赖
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# 添加Docker仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

# 安装Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io

# 验证安装
sudo docker --version

CentOS/RHEL系统:

bash 复制代码
# 移除旧版本
sudo yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

# 安装依赖
sudo yum install -y yum-utils

# 添加Docker仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装Docker
sudo yum install -y docker-ce docker-ce-cli containerd.io

# 启动Docker
sudo systemctl start docker
sudo systemctl enable docker

2. Docker配置优化

bash 复制代码
# 将当前用户加入docker组(避免每次sudo)
sudo usermod -aG docker $USER
# 需要重新登录生效

# 配置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"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  },
  "storage-driver": "overlay2"
}
EOF

# 重启Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

二、创建自定义Docker镜像

1. 编写Dockerfile

dockerfile 复制代码
# 基于官方镜像
FROM ubuntu:22.04

# 设置环境变量
ENV LANG=C.UTF-8 \
    DEBIAN_FRONTEND=noninteractive \
    TZ=Asia/Shanghai

# 设置时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 更新并安装基础软件
RUN apt update && apt install -y \
    curl \
    wget \
    vim \
    git \
    net-tools \
    iputils-ping \
    python3 \
    python3-pip \
    nginx \
    supervisor \
    && apt clean \
    && rm -rf /var/lib/apt/lists/*

# 创建工作目录
WORKDIR /app

# 复制应用文件
COPY requirements.txt .
COPY app.py .

# 安装Python依赖
RUN pip3 install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

# 复制配置文件
COPY nginx.conf /etc/nginx/nginx.conf
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

# 暴露端口
EXPOSE 80 443

# 设置启动命令
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]

2. 创建应用文件

requirements.txt:

复制代码
flask==2.3.3
gunicorn==21.2.0
redis==4.6.0

app.py:

python 复制代码
from flask import Flask
import socket

app = Flask(__name__)

@app.route('/')
def hello():
    hostname = socket.gethostname()
    return f"Hello from Docker Container: {hostname}"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

3. 构建镜像

bash 复制代码
# 构建镜像
docker build -t my-app:latest .

# 查看镜像
docker images

三、容器操作与管理

1. 运行容器

bash 复制代码
# 基本运行
docker run -d --name my-app -p 8080:80 my-app:latest

# 带数据卷
docker run -d \
  --name my-app \
  -p 8080:80 \
  -v /host/path:/container/path \
  -e ENV_VAR=value \
  my-app:latest

# 限制资源
docker run -d \
  --name my-app \
  --memory="512m" \
  --cpus="1.0" \
  --restart=always \
  my-app:latest

2. 容器管理命令

bash 复制代码
# 查看容器
docker ps          # 运行中的容器
docker ps -a       # 所有容器

# 容器操作
docker start my-app     # 启动
docker stop my-app      # 停止
docker restart my-app   # 重启
docker rm my-app        # 删除
docker rm -f my-app     # 强制删除

# 进入容器
docker exec -it my-app /bin/bash
docker exec -it my-app sh

# 查看日志
docker logs my-app
docker logs -f my-app   # 实时查看
docker logs --tail 50 my-app

# 查看资源使用
docker stats my-app

四、Docker Compose多容器编排

1. 创建docker-compose.yml

yaml 复制代码
version: '3.8'

services:
  web:
    image: nginx:alpine
    container_name: web-server
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./html:/usr/share/nginx/html
      - ./logs:/var/log/nginx
    networks:
      - app-network
    restart: unless-stopped

  app:
    build: .
    container_name: app-backend
    ports:
      - "5000:5000"
    volumes:
      - ./app:/app
      - ./data:/data
    environment:
      - DB_HOST=database
      - REDIS_HOST=redis
    depends_on:
      - database
      - redis
    networks:
      - app-network
    restart: unless-stopped

  database:
    image: postgres:15
    container_name: postgres-db
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: mydb
    volumes:
      - postgres-data:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    ports:
      - "5432:5432"
    networks:
      - app-network
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    container_name: redis-cache
    command: redis-server --appendonly yes
    volumes:
      - redis-data:/data
    ports:
      - "6379:6379"
    networks:
      - app-network
    restart: unless-stopped

volumes:
  postgres-data:
  redis-data:

networks:
  app-network:
    driver: bridge

2. Compose命令

bash 复制代码
# 安装Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# 使用Compose
docker-compose up -d        # 启动所有服务
docker-compose down         # 停止并删除
docker-compose ps           # 查看服务状态
docker-compose logs         # 查看日志
docker-compose build        # 重新构建
docker-compose exec app bash  # 进入服务容器

五、Docker镜像优化最佳实践

1. 多阶段构建示例

dockerfile 复制代码
# 构建阶段
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build

# 运行阶段
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

2. 优化建议

dockerfile 复制代码
# 1. 使用官方基础镜像
FROM python:3.11-slim  # 比ubuntu更小

# 2. 合并RUN命令减少镜像层
RUN apt update && apt install -y \
    package1 \
    package2 \
    && rm -rf /var/lib/apt/lists/*

# 3. 使用.dockerignore文件
.dockerignore:
node_modules
.git
*.log
*.tmp

# 4. 使用特定版本标签
FROM ubuntu:22.04  # 而不是ubuntu:latest

# 5. 非root用户运行
RUN groupadd -r appuser && useradd -r -g appuser appuser
USER appuser

六、Docker网络配置

bash 复制代码
# 创建自定义网络
docker network create my-network

# 查看网络
docker network ls

# 连接容器到网络
docker run -d --name container1 --network my-network nginx
docker run -d --name container2 --network my-network redis

# 容器间通过名称通信
# container1中可以直接 ping container2

七、数据持久化

bash 复制代码
# 创建数据卷
docker volume create mydata

# 使用数据卷
docker run -d \
  --name db \
  -v mydata:/var/lib/mysql \
  mysql:8.0

# 备份数据卷
docker run --rm \
  -v mydata:/source \
  -v $(pwd):/backup \
  alpine tar czf /backup/backup.tar.gz -C /source .

# 恢复数据卷
docker run --rm \
  -v mydata:/target \
  -v $(pwd):/backup \
  alpine tar xzf /backup/backup.tar.gz -C /target

八、监控与维护

bash 复制代码
# 查看容器资源使用
docker stats

# 查看镜像大小
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"

# 清理无用资源
docker system prune -a  # 清理所有未使用的资源
docker image prune      # 清理未使用的镜像
docker volume prune     # 清理未使用的卷
docker network prune    # 清理未使用的网络

# 导出/导入镜像
docker save my-app:latest > my-app.tar
docker load < my-app.tar

# 导出/导入容器
docker export my-app > my-app-container.tar
cat my-app-container.tar | docker import - my-app:backup

九、安全建议

bash 复制代码
# 1. 使用非root用户
# 在Dockerfile中添加:
USER nobody

# 2. 扫描镜像漏洞
docker scan my-app:latest

# 3. 限制容器能力
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx

# 4. 使用只读文件系统
docker run --read-only alpine sh

# 5. 设置资源限制
docker run --memory="512m" --cpus="1.0" my-app

这个完整的Docker环境制作指南应该能帮助你从零开始搭建和管理Docker环境。根据你的具体需求,可以调整相应的配置。

相关推荐
此生只爱蛋2 小时前
【Linux】正/反向代理
linux·运维·服务器
qq_5470261792 小时前
Linux 基础
linux·运维·arm开发
废春啊2 小时前
前端工程化
运维·服务器·前端
我只会发热2 小时前
Ubuntu 20.04.6 根目录扩容(图文详解)
linux·运维·ubuntu
爱潜水的小L3 小时前
自学嵌入式day34,ipc进程间通信
linux·运维·服务器
zhuzewennamoamtf3 小时前
Linux I2C设备驱动
linux·运维·服务器
TSAI3 小时前
Docker Swarm 集群部署 Eureka 服务注册中心:高可用微服务架构的基石
spring cloud·docker
不惑_3 小时前
Windows 安装 Docker 和 Docker Compose 完整教程
windows·docker·容器
梅尔文.古3 小时前
RaspberryPi-如何启用看门狗
linux·运维·服务器