Docker、Docker Compose相关操作

Docker、Docker Compose相关操作

一、Docker 核心命令

1. 镜像管理

# 拉取镜像
docker pull <镜像名>:<标签>
# 示例:拉取最新的 nginx 官方镜像
docker pull nginx:latest

# 列出本地所有镜像
docker images

# 删除镜像
docker rmi <镜像ID或镜像名>:<标签>
# 强制删除(会同时删除依赖此镜像的容器)
docker rmi -f <镜像ID>

# 将镜像导出为 tar 
# 语法:docker save -o <输出文件名>.tar <镜像名>:<标签>
docker save -o myapp_1.0.tar myuser/myapp:1.0

# 从 tar 文件加载镜像
# 语法:docker load -i <输入文件名>.tar
docker load -i myapp_1.0.tar

2. 容器管理

# 创建并启动容器
docker run -d --name <容器名> -p <宿主端口>:<容器端口> <镜像名>:<标签>
# 示例:后台启动一个 nginx,映射宿主机 8080 到容器 80
docker run -d --name mynginx -p 8080:80 nginx:latest

# 列出运行中的容器
docker ps

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

# 停止容器
docker stop <容器名或容器ID>

# 启动已停止的容器
docker start <容器名或容器ID>

# 重启容器
docker restart <容器名或容器ID>

# 删除已停止的容器
docker rm <容器名或容器ID>

# 查看容器日志
docker logs <容器名或容器ID>
# 实时跟踪日志
docker logs -f <容器名>

# 进入容器交互式终端
docker exec -it <容器名> /bin/bash
# 或者 sh
docker exec -it <容器名> sh

# 进入正在运行的容器(attach 会带来日志输出,需要配合 Ctrl-P Ctrl-Q 退出)
docker attach <容器名>

3. 网络与数据卷

# 列出网络
docker network ls

# 创建自定义网络
docker network create --driver bridge <网络名>

# 网络详情
docker network inspect <网络名>

# 列出数据卷
docker volume ls

# 创建数据卷
docker volume create <卷名>

# 删除数据卷
docker volume rm <卷名>

4. 查看和调试

# 查看容器/镜像详情(JSON 格式)
docker inspect <容器名或镜像名>

# 查看资源使用情况(CPU/内存/网络 I/O)
docker stats [容器名...]

# 从容器复制文件到宿主机
docker cp <容器名>:/容器/路径 /宿主机/路径

# 从宿主机复制文件到容器
docker cp /宿主机/路径 <容器名>:/容器/路径

二、Docker Compose YAML 文件的语法规则

下面是 Docker Compose YAML 文件的语法规则和常用字段的详细说明,分为四大部分:YAML 基础、顶层结构、各模块字段详解,以及进阶特性。

YAML 基础

  1. 缩进
    • 使用空格(推荐 2 或 4 个),千万不要使用 Tab。
    • 同一级别的键必须对齐,子项比父项多两个空格(或四个空格)。
  2. 注释
    • 使用 # 开头,如: # 这是一个注释 services: web: image: nginx # 指定镜像
  3. 数据类型
    • 映射(Mapping / 对象)key: value
    • 序列(Sequence / 列表)- item
    • 标量(Scalar):字符串、数字、布尔值等
    • 多行字符串description: | 这是多行字符串, 每行都会保留换行符。
  4. 锚点与别名
    • 可定义复用配置: x-common: &common restart: always services: web: <<: *common image: nginx db: <<: *common image: mysql
  5. 环境变量替换
    • 支持 ${VAR}, ${VAR:-default} 语法,从环境或 .env 文件读取: services: web: image: "${MY_IMAGE:-nginx:latest}"

顶层结构

version: "3.9"          # 可选,推荐使用最新版本或直接省略
services:               # 必需,定义容器服务
  ...
networks:              # 可选,定义网络
  ...
volumes:               # 可选,定义持久化卷
  ...
configs:               # 可选,仅 Swarm 模式
  ...
secrets:               # 可选,仅 Swarm 模式
  ...
  • version
    • 指定 Compose 文件版本号(如 3.8, 3.9)。
    • 最新 Compose 规范可以省略 version,由 Docker Compose 自动识别。
  • services
    • 定义一组容器服务,每个服务对应一个容器或一组同构容器。
  • networksvolumes
    • 定义自定义网络和卷,供 services 使用。
  • configssecrets
    • 仅在 Docker Swarm 中生效,用于配置和机密管理。

各模块字段详解

1. services

services:
  <service_name>:
    image: nginx:latest         # 镜像
    build:                      # 构建
      context: ./app
      dockerfile: Dockerfile.dev
      args:
        - NODE_ENV=production
    container_name: my-nginx    # 容器名称
    command: ["nginx", "-g", "daemon off;"]  # 启动命令
    entrypoint: /docker-entrypoint.sh        # 入口点
    ports:                      # 端口映射
      - "80:80"                 # 主机 80 映射到容器 80
      - "127.0.0.1:8080:80"     # 指定主机 IP
    environment:                # 环境变量
      - DEBUG=1
      API_URL: "https://api.example.com"
    env_file:                   # 外部环境文件
      - .env
    volumes:                    # 卷挂载
      - ./data:/var/lib/data
      - logs:/var/log/nginx
    networks:                   # 网络
      - frontend
      - backend
    depends_on:                 # 依赖服务启动顺序(并不保证健康检查完成)
      - db
    healthcheck:                # 健康检查(v2.1+)
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s
    restart: "always"           # 容器重启策略:no, on-failure, always, unless-stopped
    deploy:                     # Swarm 部署(仅 v3+)
      replicas: 3
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure
        max_attempts: 5
        window: 120s
      resources:
        limits:
          cpus: "0.5"
          memory: "512M"
        reservations:
          cpus: "0.25"
          memory: "256M"
    logging:                    # 日志驱动
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

2. volumes

volumes:
  data:                         # 命名卷
    driver: local
    driver_opts:
      o: bind
      type: none
      device: "/path/on/host"
  cache:
    external: true              # 使用外部已创建卷

3. networks

networks:
  frontend:
    driver: bridge              # 默认桥接网络
    driver_opts:
      com.docker.network.bridge.enable_icc: "true"
  backend:
    driver: overlay             # Swarm 覆盖网络
    attachable: true

Compose 项目准备两种网络:

  • frontend 用于同主机容器间通信的桥接网络,打开了容器互通选项;
  • backend 用于跨主机、Swarm 集群场景的覆盖网络,并且对普通容器开放了加入权限。这样你可以根据服务的需求,选择让它们挂载到不同的网络中,实现隔离与互通的灵活组合。

4. configs 与 secrets(Swarm)

configs:
  app_config:
    file: ./config/app.conf

secrets:
  db_password:
    file: ./secrets/db_password.txt

services:
  web:
    ...
    configs:
      - source: app_config
        target: /etc/app/app.conf
    secrets:
      - db_password

进阶特性

  1. 多 Compose 文件叠加 docker-compose -f docker-compose.yml -f docker-compose.override.yml up 可用来覆盖默认配置。
  2. Profiles(Compose 1.28+)
    根据 profile 启用/禁用服务: services: debug: image: alpine command: ["sleep", "infinity"] profiles: ["dev"] 启动时使用 --profile dev
  3. 扩展字段(x- 前缀)
    用于自定义共用配置: x-logging: &default-logging driver: "json-file" options: max-size: "5m" services: a: image: alpine logging: *default-logging
  4. 环境变量文件(.env)
    • 默认会加载同目录下的 .env,也可通过 --env-file 指定。
  5. 多项目部署
    • 使用 -pCOMPOSE_PROJECT_NAME 指定项目名前缀,避免命名冲突。

三、Docker Compose 命令

假设当前目录下有 docker-compose.yml,常见操作如下:

# 启动并后台运行所有服务(首次会自动 build)
docker-compose up -d

# 构建或重新构建镜像
docker-compose build

# 查看服务状态
docker-compose ps

# 查看某个服务日志
docker-compose logs <服务名>
# 实时跟踪所有服务日志
docker-compose logs -f

# 停止所有服务
docker-compose stop

# 停止并删除容器、网络、数据卷(除非在 yml 中声明 external)
docker-compose down

# 删除并重建容器(清理旧数据)
docker-compose down --volumes
docker-compose up -d --build

# 扩缩容:指定某个服务的实例数(仅适用于 replicable 服务)
docker-compose up -d --scale <服务名>=<实例数>

# 运行一次性命令,不会启动所有服务
docker-compose run --rm <服务名> <命令>
# 示例:在 web 服务容器中执行 shell
docker-compose run --rm web /bin/bash

Tip:在 Docker Compose v2 中,也可用 docker compose(空格)替代 docker-compose(减号):

docker compose up -d
docker compose down

三、常用组合示例

  1. 构建、启动、查看日志 docker-compose build docker-compose up -d docker-compose logs -f
  2. 一键重启清洁环境 docker-compose down --volumes --remove-orphans docker-compose up -d --build
  3. 进入某服务的终端 docker-compose exec <服务名> /bin/bash
文末附加内容
暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇