y.y
Published on

Docker 和 Docker Compose 实用命令指南

Docker 和 Docker Compose 实用命令指南

目录

1. 环境变量配置

基础变量定义

DATE=$(date +%Y%m%d)          # 生成日期,如:20240301
VERSION="v1.0.0"              # 版本号
ENV="prod"                    # 环境标识:prod, staging, dev
IMAGE_NAME="myapp"            # 镜像名称
CONTAINER_NAME="myapp-prod"   # 容器名称
REGISTRY="registry.example.com"  # 镜像仓库地址

设置方式

  1. 命令行直接设置(临时使用)
# 方式1:单行设置
export DATE=$(date +%Y%m%d) VERSION="v1.0.0" ENV="prod" IMAGE_NAME="myapp"

# 方式2:分行设置
export DATE=$(date +%Y%m%d)
export VERSION="v1.0.0"
export ENV="prod"
export IMAGE_NAME="myapp"

# 查看已设置的变量
env | grep "VERSION"
  1. 环境变量文件(推荐方式)
# 创建 .env 文件
cat > .env << EOF
DATE=$(date +%Y%m%d)
VERSION=v1.0.0
ENV=prod
IMAGE_NAME=myapp
CONTAINER_NAME=myapp-prod
REGISTRY=registry.example.com
EOF

# 加载环境变量
source .env
# 或
export $(cat .env | xargs)
  1. 针对不同环境的配置
# 生产环境配置 prod.env
cat > prod.env << EOF
DATE=$(date +%Y%m%d)
VERSION=v1.0.0
ENV=prod
IMAGE_NAME=myapp
CONTAINER_NAME=myapp-prod
REGISTRY=registry.example.com
EOF

# 开发环境配置 dev.env
cat > dev.env << EOF
DATE=$(date +%Y%m%d)
VERSION=v1.0.0
ENV=dev
IMAGE_NAME=myapp
CONTAINER_NAME=myapp-dev
REGISTRY=registry-dev.example.com
EOF

# 使用时
source prod.env  # 生产环境
# 或
source dev.env   # 开发环境

在 docker-compose 中使用

# docker-compose.yml
version: '3'
services:
  app:
    image: ${IMAGE_NAME}:${VERSION}-${ENV}-${DATE}
    container_name: ${CONTAINER_NAME}

使用建议

  • 开发环境:使用 .env 文件,便于管理
  • 测试/生产环境:使用环境特定的配置文件
  • 自动化脚本:在脚本中直接设置变量
  • 敏感信息:使用专门的密钥管理服务

注意事项

  • .env 文件应加入 .gitignore
  • 敏感信息不要明文存储
  • 确保变量名不与系统环境变量冲突
  • 定期更新维护配置

2. Docker 基础命令

容器操作

# 1. 运行容器
docker run -d \
    --name ${CONTAINER_NAME} \
    -p 8080:80 \
    ${IMAGE_NAME}:${VERSION}-${ENV}-${DATE}

# 2. 容器状态查看
docker ps                     # 查看运行中的容器
docker ps -a                  # 查看所有容器
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"  # 格式化输出

# 3. 容器日志查看
docker logs -f ${CONTAINER_NAME}  # 实时查看日志
docker logs -n 100 ${CONTAINER_NAME}  # 查看最近100条日志
docker logs --since 2h ${CONTAINER_NAME}  # 查看最近2小时的日志

# 4. 进入容器
docker exec -it ${CONTAINER_NAME} bash  # 使用bash
docker exec -it ${CONTAINER_NAME} sh    # 使用sh

# 5. 容器资源使用
docker stats ${CONTAINER_NAME}  # 查看指定容器资源使用
docker stats --no-stream       # 查看所有容器资源使用(非实时)

3. 镜像管理命令

镜像构建和标签

# 1. 构建镜像
docker build -t ${IMAGE_NAME}:latest .
docker build -t ${IMAGE_NAME}:latest --no-cache .  # 不使用缓存构建

# 2. 标签管理
docker tag ${IMAGE_NAME}:latest ${IMAGE_NAME}:${VERSION}-${ENV}-${DATE}
docker tag ${IMAGE_NAME}:latest ${REGISTRY}/${IMAGE_NAME}:${VERSION}-${ENV}-${DATE}

# 3. 查看镜像
docker images ${IMAGE_NAME}
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"

镜像导入导出

# 1. 导出单个镜像
docker save -o ${IMAGE_NAME}_${VERSION}_${DATE}.tar \
    ${IMAGE_NAME}:${VERSION}-${ENV}-${DATE}

# 2. 导出多个镜像
docker save -o backend_${DATE}.tar \
    ${IMAGE_NAME}:${VERSION}-${ENV}-${DATE} \
    mysql:8.0 \
    redis:7.0

# 3. 导入镜像
docker load -i ${IMAGE_NAME}_${VERSION}_${DATE}.tar

镜像仓库操作

# 1. 登录镜像仓库
docker login ${REGISTRY}

# 2. 推送镜像
docker push ${REGISTRY}/${IMAGE_NAME}:${VERSION}-${ENV}-${DATE}

# 3. 拉取镜像
docker pull ${REGISTRY}/${IMAGE_NAME}:${VERSION}-${ENV}-${DATE}

# 4. 退出登录
docker logout ${REGISTRY}

4. Docker Compose 命令

基础服务管理

# 1. 启动服务
docker compose up -d              # 后台启动所有服务
docker compose up -d service_name # 启动指定服务

# 2. 构建并启动
docker compose up -d --build           # 重新构建并启动
docker compose up -d --force-recreate  # 强制重新创建容器

# 3. 停止服务
docker compose down                    # 停止并删除容器、网络
docker compose down --volumes          # 同时删除卷
docker compose stop                    # 仅停止服务

# 4. 服务状态
docker compose ps                      # 查看服务状态
docker compose logs -f                 # 查看所有服务日志
docker compose logs -f service_name    # 查看指定服务日志

# 5. 服务维护
docker compose restart                 # 重启所有服务
docker compose restart service_name    # 重启指定服务
docker compose exec service_name sh    # 进入服务容器

5. 维护和清理命令

系统清理

# 1. 清理未使用的资源
docker system prune              # 清理未使用的容器、网络
docker system prune -a          # 同时清理未使用的镜像
docker system prune --volumes   # 同时清理未使用的卷

# 2. 清理特定资源
docker volume prune             # 清理未使用的卷
docker network prune            # 清理未使用的网络

# 3. 清理指定镜像的旧版本(保留最新的5个版本)
docker images ${IMAGE_NAME} --format "{{.Tag}}" | sort -r | tail -n +6 | \
    xargs -I {} docker rmi ${IMAGE_NAME}:{}

6. 实用脚本示例

镜像构建和发布脚本

#!/bin/bash
# build_and_push.sh

# 设置变量
DATE=$(date +%Y%m%d)
VERSION="v1.0.0"
ENV="prod"
IMAGE_NAME="myapp"
REGISTRY="registry.example.com"

# 构建镜像
echo "Building image..."
docker build -t ${IMAGE_NAME}:latest .

# 打标签
echo "Tagging image..."
docker tag ${IMAGE_NAME}:latest ${REGISTRY}/${IMAGE_NAME}:${VERSION}-${ENV}-${DATE}

# 推送镜像
echo "Pushing image..."
docker push ${REGISTRY}/${IMAGE_NAME}:${VERSION}-${ENV}-${DATE}

# 清理旧版本
echo "Cleaning old versions..."
docker images ${IMAGE_NAME} --format "{{.Tag}}" | sort -r | tail -n +6 | \
    xargs -I {} docker rmi ${IMAGE_NAME}:{}

echo "Done!"

服务部署更新脚本

#!/bin/bash
# deploy.sh

# 设置变量
DATE=$(date +%Y%m%d)
VERSION="v1.0.0"
ENV="prod"
IMAGE_NAME="myapp"
REGISTRY="registry.example.com"

# 拉取最新镜像
echo "Pulling latest image..."
docker pull ${REGISTRY}/${IMAGE_NAME}:${VERSION}-${ENV}-${DATE}

# 停止并移除旧容器
echo "Stopping old container..."
docker compose down

# 启动新服务
echo "Starting new services..."
docker compose up -d

# 检查服务状态
echo "Checking service status..."
docker compose ps

echo "Deployment completed!"

使用说明

  1. 在使用命令前,建议先设置好环境变量
  2. 命令中的变量可以根据实际需求修改
  3. 在生产环境使用脚本前,建议先在测试环境验证
  4. 重要操作建议添加日志记录和错误处理
  5. 定期进行资源清理和维护