Docker 使用手册

Docker 基础命令

镜像管理

查找镜像

docker search image_name
  • --filter / -f:按条件过滤(如 stars=100)。
  • --limit:限制返回结果数量。

拉取镜像

docker pull image_name:tag
  • --all-tags / -a:拉取镜像的所有标签。

查看本地镜像

docker images
  • --all / -a:列出所有镜像,包括中间层。
  • --digests:显示镜像摘要信息。
  • --filter / -f:按条件过滤。

删除镜像

docker rmi image_name:tag
  • --force / -f:强制删除。
  • docker image prune -a:删除未使用的镜像。

保存与加载镜像

docker save image_name:tag | gzip > image.tar.gz
gunzip -c image.tar.gz | docker load

查看镜像历史

docker history image_name:tag
  • --no-trunc:显示完整信息。
  • --quiet / -q:只显示层 ID。

根据容器提交镜像

docker commit -a "nathan" -m "create new img" <container_id> image_name:tag
  • -a:设置作者信息。
  • -m:描述信息。
  • --change / -c:对镜像进行配置更改。

重命名镜像

docker tag old-repo/myimage:tag new-repo/myimage:new-tag

容器管理

运行容器

docker run -it --entrypoint sh image_name:tag
  • -i:保持标准输入打开。
  • -t:分配伪终端。
  • --name:为容器命名。
  • -d:后台运行。
  • --rm:退出后自动删除。
  • -p:端口映射(如 8080:80)。
  • -v:挂载数据卷(如 /host/path:/container/path)。

查看容器日志

docker logs <container_id>
docker logs --since 10m container_id
  • -f:实时查看日志。
  • --tail:显示最新日志行数(如 100)。
  • --since:从指定时间开始显示日志(支持 10m1h、具体时间戳等)。
  • --until:设置日志显示结束时间。

查看容器状态

docker ps
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"
  • -a / --all:列出所有容器。
  • -q:只显示容器 ID。
  • --filter / -f:按条件过滤。
  • --format:以指定格式显示容器信息,可用占位符包括:

    • {{.ID}}:容器 ID
    • {{.Names}}:容器名称
    • {{.Status}}:容器状态
    • {{.Ports}}:容器端口
  • --latest / -l:只显示最近创建的容器。
  • --size / -s:显示容器的文件大小。

删除容器

docker rm $(docker ps -aq)
  • -f / --force:强制删除。
  • -v:同时删除挂载的卷。

停止/启动/重启容器

docker stop/start/restart container_id
  • --time / -t:设置停止超时时间(默认 10 秒)。

检查容器信息

docker inspect container_id
docker inspect --format='{{.State.Running}}' container_id
  • 使用 --format 提取特定信息:

    • {{.State.Status}}:容器状态
    • {{.Config.Image}}:镜像名称

进入容器

docker exec -it container_id /bin/bash

网络管理

查看网络

docker network ls
  • --filter / -f:按条件过滤。

创建网络

docker network create my-network
  • --driver:指定网络驱动类型(如 bridgehost)。
  • --subnet:指定子网(如 192.168.1.0/24)。

指定网络运行容器

docker run --network my-network --name nginx -d nginx

删除网络

docker network rm network_name

查看详细信息

docker network inspect network_name

创建带驱动配置的网络

docker network create \
  --driver bridge \
  --subnet=192.168.1.0/24 \
  custom-network

删除未使用的网络

docker network prune

清理无用资源

清理未使用镜像和容器

docker image prune -a
docker system prune -a
  • -a:删除所有未使用资源。
  • --force / -f:跳过确认提示。

性能监控

查看资源使用情况

docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"

查看容器进程

docker top container_id

查看系统事件

docker events

挂载管理

查看数据卷

docker volume ls
  • 列出使用中的数据docker volume ls --filter dangling=false

检查数据卷信息

docker volume inspect <volume_name>

删除数据卷

docker volume rm volume_name

清理未使用的卷

docker volume prune --force

系统信息

查看版本

docker version

查看系统信息

docker info

导出与导入

导出容器

docker export container_id > container.tar

导入容器

cat container.tar | docker import - new_image_name:tag

文件复制

从主机复制到容器

docker cp local_path container_id:container_path

从容器复制到主机

docker cp container_id:container_path local_path

登录与登出

登录 Docker 仓库

docker login
  • --username / -u:指定用户名。
  • --password / -p:指定密码(不推荐明文)。

登出 Docker 仓库

docker logout

Dockerfile 使用指南

1. 常用指令

基础设置

  • FROM:指定基础镜像,通常是第一行。

    FROM ubuntu:20.04
  • LABEL:添加元数据。

    LABEL maintainer="your-email@example.com" version="1.0"

文件与目录操作

  • WORKDIR:设置工作目录。

    WORKDIR /app
  • COPYADD:复制文件到镜像中。

    COPY . /app
    ADD http://example.com/file.tar.gz /app # 支持远程 URL 下载与解压
  • VOLUME:声明挂载点。

    VOLUME ["/data"]

软件安装与命令执行

  • RUN:执行命令安装依赖或配置环境。

    RUN apt-get update && apt-get install -y python3
  • USER:设置后续命令的执行用户。

    USER nonroot

容器启动行为

  • CMD:设置容器启动时的默认命令(可被 docker run 覆盖)。

    CMD ["python3", "app.py"]
  • ENTRYPOINT:设置不可覆盖的默认命令。

    ENTRYPOINT ["python3", "app.py"]
  • EXPOSE:声明容器监听的端口(仅文档作用)。

    EXPOSE 8080

2. 分阶段构建

分阶段构建用于优化镜像大小。以下是示例:

# 构建阶段
FROM node:16 AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build

# 运行阶段
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
  • 构建阶段中安装依赖和生成构建产物。
  • 运行阶段中仅包含运行所需的文件。

3. docker build 命令

docker build 用于根据 Dockerfile 构建镜像。

基本语法

docker build [OPTIONS] PATH

常用选项

  • -t:为镜像命名和标记版本。

    docker build -t myapp:1.0 .
  • -f:指定 Dockerfile 文件路径。

    docker build -f /path/to/Dockerfile .
  • --no-cache:禁用构建缓存,强制执行所有步骤。

    docker build --no-cache -t myapp .
  • --build-arg:传递构建时参数。

    docker build --build-arg VERSION=1.0 -t myapp .
    ARG VERSION
    ENV APP_VERSION=$VERSION
  • -q:仅返回镜像 ID,隐藏构建日志。

    docker build -q -t myapp .
  • --target:指定目标构建阶段,在多阶段构建中,仅构建指定阶段:

    docker build --target builder -t app-builder .
  • 导出缓存将构建缓存保存到目录:

    docker build --cache-to=type=local,dest=./cache .
  • 启用并行构建使用 --progress

    docker build --progress=plain .

示例

  • 构建镜像:

    docker build -t myapp .
  • 带参数构建:

    docker build --build-arg ENV=production -t myapp:prod .

4. 优化建议

  • 多阶段构建:减少最终镜像大小。
  • 缓存利用:将变化较小的命令置于 Dockerfile 顶部。
  • 精简基础镜像:选择 alpine 等轻量级镜像。
  • 合并 RUN 命令:减少镜像层数。

    RUN apt-get update && apt-get install -y python3 && apt-get clean

总结

通过合理使用 Dockerfile 指令及优化构建过程,可以高效生成体积小、性能优的镜像。docker build 提供了丰富的选项以支持复杂需求,结合分阶段构建,可满足不同场景的性能和管理需求。


Docker Compose 使用指南

常用命令

  1. 启动服务

    docker-compose up -d
    • -d:后台运行。
  2. 停止并移除服务

    docker-compose down
    • 默认会移除容器及相关网络,但不会删除卷。
    • 使用 --volumes 删除所有关联卷。
       docker-compose down --volumes
    • 使用 --remove-orphans 删除未定义的容器。

      docker-compose down --remove-orphans
  3. 查看状态

    docker-compose ps
  4. 指定配置文件启动

    docker-compose -f custom-compose.yml up -d
  5. 重启服务

    docker-compose restart
  6. 查看实时日志

    docker-compose logs -f
    • 可指定服务名查看:

      docker-compose logs -f service_name
  7. 清理无用卷

    docker volume prune

docker-compose.yaml 书写规范

结构

  1. 顶层字段

    • version:指定 Compose 文件版本。
    • services:定义服务。
    • volumes:定义数据卷。
    • networks:定义网络。
  2. 缩进:使用两个空格,保持层级清晰。

示例

version: "3.9"

services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - web-data:/usr/share/nginx/html
    networks:
      - webnet

  app:
    build:
      context: ./app
    environment:
      - NODE_ENV=production
    depends_on:
      - db
    networks:
      - appnet

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - appnet

volumes:
  web-data:
  db-data:

networks:
  webnet:
  appnet:

网络配置

  1. 自定义网络

    networks:
      custom-network:
        name: my-custom-network
        driver: bridge
  2. 使用外部网络

    networks:
      existing-network:
        external: true
  3. 子网和网关

    networks:
      custom-network:
        driver: bridge
        ipam:
          config:
            - subnet: 192.168.1.0/24
              gateway: 192.168.1.1

卷配置

  1. 命名卷

    volumes:
      app-data:
  2. 挂载主机目录

    services:
      app:
        volumes:
          - /host/path:/container/path
  3. 驱动与选项

    volumes:
      my-volume:
        driver: local
        driver_opts:
          type: nfs
          o: addr=192.168.1.100,rw
          device: ":/path/to/dir"

Docker Compose 的 build 配置

build 配置支持更多高级功能,例如缓存、构建参数、挂载等。

完整配置示例

services:
  app:
    build:
      context: ./app
      dockerfile: Dockerfile.prod
      args:
        APP_ENV: "production"
      cache_from:
        - app-cache
      target: builder
      network: host
      extra_hosts:
        - "local.test:127.0.0.1"

字段说明

  • context:指定构建上下文目录(通常是包含 Dockerfile 的路径)。
  • dockerfile:自定义 Dockerfile 路径。
  • args:传递构建参数(在 Dockerfile 中使用 ARG 声明)。
  • cache_from:使用指定镜像作为构建缓存源,减少重复构建时间。
  • target:指定构建阶段的目标,仅构建多阶段镜像中的某一阶段。
  • network:设置构建时使用的网络模式(如 host)。
  • extra_hosts:在构建时定义额外的主机解析(类似 /etc/hosts)。

更多高级用法

  1. 挂载构建时的卷(Docker BuildKit 支持)

    • 用于在构建时临时挂载额外数据,例如私有依赖库。

      services:
      app:
        build:
          context: .
          dockerfile: Dockerfile
          secrets:
            - my_secret
      secrets:
      my_secret:
        file: ./secrets.txt
  2. 使用 BuildKit 的缓存挂载

    services:
      app:
        build:
          context: .
          dockerfile: Dockerfile
          cache_from:
            - type=local,src=./cache
          cache_to:
            - type=local,dest=./cache

实用技巧

  1. depends_on 限制

    • 定义依赖关系,但不会保证服务完全启动:

      depends_on:
        - db
  2. 扩展字段
    使用 x- 前缀定义共享配置:

    x-shared-config:
      environment:
        - LOG_LEVEL=debug
    
    services:
      service1:
        <<: *x-shared-config
        image: app1
    
      service2:
        <<: *x-shared-config
        image: app2
  3. 动态扩展配置
    配合环境变量使用:

    services:
      app:
        image: "${APP_IMAGE:-default-app}:latest"

综合示例

以下是一个完整的 Compose 配置文件示例:

version: "3.9"

services:
  frontend:
    image: nginx:alpine
    ports:
      - "8080:80"
    networks:
      - frontend-backend

  backend:
    build:
      context: ./backend
    environment:
      - APP_ENV=production
    depends_on:
      - db
    networks:
      - frontend-backend
      - backend-db

  db:
    image: postgres:13
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend-db

volumes:
  db-data:

networks:
  frontend-backend:
  backend-db:

总结

通过合理配置 docker-compose.yaml 文件并利用 Compose 命令,可以轻松管理复杂的容器服务。配合网络和卷配置,能进一步优化服务间的交互与数据持久化。

4. 常用脚本示例

检查容器内文件

#!/bin/bash
if [ -z "$1" ]; then
  echo "请传入要搜索的文件名"
  exit 1
fi
RUNNING_CONTAINERS="$(docker ps --format '{{.Names}}')"
for CONTAINER in $RUNNING_CONTAINERS; do
  if docker exec -it $CONTAINER sh -c 'test -e $1'; then
    echo "Found $1 in container: $CONTAINER"
  fi
done

5. 常见问题与注意事项

  1. 镜像源加速配置
# apk镜像源加速
RUN echo "https://mirrors.aliyun.com/alpine/v3.18/main" > /etc/apk/repositories && \
    echo "https://mirrors.aliyun.com/alpine/v3.18/community" >> /etc/apk/repositories && \
    apk update --allow-untrusted && \
    apk add --allow-untrusted --clean-protected --no-cache bash && \
    rm -rf /var/cache/apk/*
# apt镜像源加速
RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list && apt-get update
  1. 删除未使用的镜像
comm -23 <(docker images --format "{{.Repository}}:{{.Tag}}" | sort) <(kubectl get pods --all-namespaces -o jsonpath="{..image}" | tr -s '[[:space:]]' '\n' | sort) | grep emotibot | grep -v infra | xargs docker rmi

标签: none

添加新评论