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环境。根据你的具体需求,可以调整相应的配置。

相关推荐
德育处主任17 小时前
『NAS』在群晖部署一个文件加密工具-hat.sh
前端·算法·docker
RisunJan17 小时前
Linux命令-ipcs命令(报告进程间通信(IPC)设施状态的实用工具)
linux·运维·服务器
HABuo18 小时前
【Linux进程(四)】进程切换&环境变量深入剖析
linux·运维·服务器·c语言·c++·ubuntu·centos
橘颂TA18 小时前
【Linux】死锁四条件的底层逻辑:从锁冲突到 STL 组件的线程安全实践(Ⅵ)
linux·运维·服务器·c++·死锁
运维栈记18 小时前
虚拟化网络的根基-网络命名空间
网络·docker·容器
黄焖鸡能干四碗19 小时前
智能制造工业大数据应用及探索方案(PPT文件)
大数据·运维·人工智能·制造·需求分析
橙露19 小时前
国产PLC与进口PLC全面对比分析:技术、市场与未来趋势
运维·网络
lbb 小魔仙19 小时前
【Linux】云原生运维效率提升:Linux 终端工具链(kubectl + tmux + fzf)组合拳教程
linux·运维·云原生
清水白石00819 小时前
解构异步编程的两种哲学:从 asyncio 到 Trio,理解 Nursery 的魔力
运维·服务器·数据库·python