06. Docker基础-Docker Compose

简介

什么是Docker Compose

Docker Compose是针对容器的编排工具,是针对容器生命周期的管理。
Docker Compose对容器的声明周期进行更快速更方便的管理方式。
Docker Compose是单机环境下的容器编排。

为什么要使用Docker Compose

  1. 依赖管理:
    • 当一个容器必须依赖另一个容器运行完成后才能运行时,就需要进行依赖管理。
  2. 副本控制:
    • 容器有时候需要集群,可以使用Docker Compose对容器集群进行快速的弹性伸缩。
  3. 配置共享:
    • 通过配置文件统一描述需要运行的服务相关信息,自动化的解析配置内容并构建对应服务。

相关网站

docker-compose下载:https://github.com/docker/compose/releases
docker-compose文档:https://docs.docker.com/reference/cli/docker/compose/
docker-compose文档:https://docs.docker.com/compose/compose-file/05-services/
docker-compos与docker版本对照:

安装

下载docker-compose

curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

赋权docker-compos

chmod +x /usr/local/bin/docker-compose

补全docker-compos

curl -L https://raw.githubusercontent.com/docker/compose/1.1.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

#关闭xshell再登录即可实现命令补全

命令

常用指令

version

version指定 Compose 文件的版本。

version: '3'

services

services定义了 Docker 服务的配置。

services:
  nginx-web:
  
  redis-db:
  
  mysql-db:

image

image: 指定 Docker 镜像。如果镜像在本地不存在,Compose 会尝试拉取它。

image: redis

ports

ports: 将容器的端口映射到主机的端口。

ports:
  - "3000"
  - "3000-3005"
  - "8000:8000"				#固定使用某个

volumes

volumes: 将宿主机的路径或命名卷挂载到容器中。

volumes:
  - /var/lib/mysql
  - cache:/tmp/cache

build

build: 指定 Dockerfile 文件所在的路径(相对路径或绝对路径)以及构建时使用的参数。如果你需要从源代码构建镜像,而不是使用现成的镜像,这个参数就非常有用。

build:
  context: .
  dockerfile: Dockerfile-alternate
  args:
    buildno: 1

command

command: 覆盖容器启动后默认执行的命令

command: bundle exec thin -p 3000

container_name

container_name: 指定容器的名称。如果没有指定,则 Compose 会自动生成一个名称。

container_name: my-web-container

depends_on

depends_on: 解决容器的启动顺序问题。它告诉 Compose 服务应按照依赖顺序启动。

depends_on:
  - db
  - redis

environment

environment: 设置环境变量。它可以是一个数组或一个字典。

environment:
  - RACK_ENV=development
  - SHOW=true

networks

networks: 将服务连接到指定网络。

networks:
  - frontend

restart

restart: 配置容器的重启策略。

networks:
  - frontend

healthcheck

healthcheck: 配置容器的健康检查。

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"]
  interval: 1m30s
  timeout: 10s
  retries: 3

labels

labels: 向容器添加元数据标签。

labels:
  - "com.example.description=Accounting webapp"
  - "com.example.department=Finance"

logging

logging: 配置日志驱动。

logging:
  driver: syslog
  options:
    syslog-address: "tcp://192.168.0.42:123"

dns

dns: 自定义 DNS 服务器。可以是一个字符串,也可以是一个列表。

dns: 8.8.8.8
或
dns:
  - 8.8.8.8
  - 8.8.4.4

dns_search

dns_search: 配置 DNS 搜索域。可以是一个字符串,也可以是一个列表。

dns_search: example.com
或
dns_search:
  - dc1.example.com
  - dc2.example.com

entrypoint

entrypoint: 覆盖容器默认的 ENTRYPOINT。

entrypoint: /code/entrypoint.sh

env_file

env_file: 从文件中引入环境变量。可以是一个文件路径,也可以是一个列表。

env_file: .env
或
env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

expose

expose: 暴露端口,但不将它们映射到宿主机,只是允许它们被连接的服务访问。

expose:
  - "3000"

extra_hosts

extra_hosts: 添加主机名映射。类似于 hosts 文件。

extra_hosts:
  - "somehost:162.242.195.82"
  - "otherhost:50.31.209.229"

working_dir

working_dir: 设置容器的工作目录。

working_dir: /code

ulimits

ulimits: 设置容器的 ulimit 限制。

ulimits:
  nproc: 65535
  nofile:
    soft: 20000
    hard: 40000

命令集合

docker-compose --help

Define and run multi-container applications with Docker.

Usage:
  docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE             Specify an alternate compose file
                              (default: docker-compose.yml)
  -p, --project-name NAME     Specify an alternate project name
                              (default: directory name)
  --verbose                   Show more output
  --log-level LEVEL           Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
  --no-ansi                   Do not print ANSI control characters
  -v, --version               Print version and exit
  -H, --host HOST             Daemon socket to connect to

  --tls                       Use TLS; implied by --tlsverify
  --tlscacert CA_PATH         Trust certs signed only by this CA
  --tlscert CLIENT_CERT_PATH  Path to TLS certificate file
  --tlskey TLS_KEY_PATH       Path to TLS key file
  --tlsverify                 Use TLS and verify the remote
  --skip-hostname-check       Don't check the daemon's hostname against the
                              name specified in the client certificate
  --project-directory PATH    Specify an alternate working directory
                              (default: the path of the Compose file)
  --compatibility             If set, Compose will attempt to convert deploy
                              keys in v3 files to their non-Swarm equivalent

Commands:
  build              Build or rebuild services
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the Compose file
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  images             List images
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show the Docker-Compose version information

docker-compose up

  • docker-compose up
  • 用途:启动或重新启动服务。
  • 语法:docker-compose up [options] [SERVICE…]
  • 示例:docker-compose up 或 docker-compose up web
  • docker-compose up --scale
  • 用途:启动或重新启动服务,并设置服务容器的数量。
  • 语法:docker-compose up --scale SERVICE=NUM
  • 示例:docker-compose up --scale web=2

docker-compose down

  • 用途:停止并移除所有由 Compose 管理的容器。
  • 语法:docker-compose down [options]
  • 示例:docker-compose down

docker-compose stop

  • docker-compose stop
  • 用途:停止所有正在运行的服务容器。
  • 语法:docker-compose stop [options] [SERVICE…]
  • 示例:docker-compose stop 或 docker-compose stop web
  • docker-compose stop --all
  • 用途:停止所有正在运行的服务容器。
  • 语法:docker-compose stop --all
  • 示例:docker-compose stop --all

docker-compose start

  • 用途:启动所有已经停止的服务容器。
  • 语法:docker-compose start [options] [SERVICE…]
  • 示例:docker-compose start 或 docker-compose start web

docker-compose restart

  • 用途:重启所有服务容器。
  • 语法:docker-compose restart [options] [SERVICE…]
  • 示例:docker-compose restart 或 docker-compose restart web

docker-compose create

  • 用途:创建服务的容器
  • 语法:docker-compose create [options] [SERVICE…]
  • 示例:docker-compose create web

docker-compose exec

  • 用途:在服务容器内部执行命令。
  • 语法:docker-compose exec [options] [SERVICE] [COMMAND]
  • 示例:docker-compose exec web bash 或 docker-compose create

docker-compose run

  • 用途:创建一个一次性容器,并执行命令。
  • 语法:docker-compose run [options] [SERVICE] [COMMAND]
  • 示例:docker-compose run web bash

docker-compose build

  • 用途:重新构建服务容器。
  • 语法:docker-compose build [options] [SERVICE…]
  • 示例:docker-compose build 或 docker-compose build web

docker-compose pull

  • 用途:拉取服务镜像到本地。
  • 语法:docker-compose pull [options] [SERVICE…]
  • 示例:docker-compose pull 或 docker-compose pull web

docker-compose ps

  • 用途:列出所有服务及其当前状态。
  • 语法:docker-compose ps [options] [SERVICE…]
  • 示例:docker-compose ps 或 docker-compose ps web

docker-compose config

  • 用途:验证 docker-compose.yml 文件。
  • 语法:docker-compose config [options]
  • 示例:docker-compose config

docker-compose logs

  • 用途:显示服务容器的日志。
  • 语法:docker-compose logs [options] [SERVICE…]
  • 示例:docker-compose logs web

docker-compose kill

  • 用途:杀死所有服务容器。
  • 语法:docker-compose kill [options] [SERVICE…]
  • 示例:docker-compose kill 或 docker-compose kill web

docker-compose scale

  • 用途:设置服务容器的数量。
  • 语法:docker-compose scale [options] SERVICE=NUM
  • 示例:docker-compose scale web=2

docker-compose version

  • 用途:显示 Docker Compose 的版本信息。
  • 语法:docker-compose version
  • 示例:docker-compose version

应用

应用举例

使用思路

  1. 三大核心:服务(Service)、网络(Network)、数据卷(Volume);
  2. 编排任务:服务、镜像、变量、网络、副本、数据卷
  3. 启动容器:构建容器

编辑文件

version: "3"
services:
  nginx:
    image: "nginx:1.22.0"
    #container_name: "nginx-web"
    restart: "always"
    depends_on:
      - redis
      - mysql
    networks:
      - LNMP
    volumes:
      - /data/nginx/data:/usr/share/nginx/html
      - /data/nginx/logs:/var/log/nginx
    ports:
      - 80


  redis:
    image: "redis:3.2.0"
    #container_name: "redis-db"
    restart: "always"
    networks:
      - LNMP
    volumes:
     - /data/mysql/data:/var/lib/mysql
     - /data/mysql/conf:/etc/mysql/
     - /data/mysql/logs:/var/log/mysql

  mysql:
    image: "mysql:5.7.31"
    #container_name: "mysql-db"
    restart: "always"
    networks:
      - LNMP
    volumes:
      - /data/mysql/data:/var/lib/mysql
      - /data/mysql/mysql-files:/var/lib/mysql-files
      - /data/mysql/logs:/var/log/mysql
      - /data/mysql/conf:/etc/mysql
    environment:
      - MYSQL_ROOT_PASSWORD='1qaz!QAZ'
      - MYSQL_DATABASE='practice_db'
      - MYSQL_USER='Practice'
      - MYSQL_PASSWORD='Pra@db_123'

networks:
  LNMP:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 170.20.21.0/24
  • version: 指定了 Docker Compose 文件的版本,这是必须的。
  • services: 定义了三个服务:web、db 和 redis。
  • web:
    • build: 指定了构建 web 服务的 Dockerfile 的路径和上下文,以及构建时的参数。
    • image: 指定了 web 服务的镜像名称。
    • command: 覆盖了容器的默认启动命令。
    • container_name: 为容器指定了明确的名称。
    • depends_on: 指定了 web 服务依赖于 db 服务。
    • environment: 设置了 web 服务的环境变量。
    • ports: 将容器的 3000 端口映射到宿主机的 3000 端口。
    • volumes: 将宿主机的 web 目录挂载到容器的 /app 目录。
    • networks: 将 web 服务连接到 frontend 网络。
    • restart: 指定了重启策略。
    • healthcheck: 配置了健康检查。
    • labels: 为容器添加了元数据标签。
  • db:
    • 使用了 PostgreSQL 镜像,并设置了数据库的用户和密码。
    • container_name: 为数据库容器指定了名称。
    • volumes: 将数据库数据持久化到名为 db-data 的卷中。
    • networks: 将数据库服务连接到 backend 网络。
    • healthcheck: 配置了健康检查。
  • redis:
    • 使用了 Redis 镜像,并将 Redis 端口映射到宿主机。
    • container_name: 为 Redis 容器指定了名称。
    • networks: 将 Redis 服务连接到 backend 网络。
    • restart: 指定了重启策略。
  • networks: 定义了两个网络:frontend 和 backend,供服务连接使用。
  • volumes: 定义了一个名为 db-data 的卷,用于数据库数据持久化。

运行服务

  • 验证yml文件
cd /data/docker-compose-files/lrnm
docker-compose config
  • 拉取镜像
#拉取docker-compose.yml中的所有镜像
docker-compose pull

#docker-compose.yml中包含的某个镜像
docker-compose pull nginx
  • 创建服务
#创建docker-compose.yml中的所有服务
docker-compose create

#指定创建docker-compose.yml中包含的某个服务
docker-compose create mysql-db
  • 查看服务
docker-compose ps
  • 创建并启动服务
#启动docker-compose.yml中所有的服务
docker-compose up

#启动docker-compose.yml中包含的某个服务
docker-compose up -d mysql
  • 查看容器
docker ps
  • 停止服务
#启动docker-compose.yml中所有的服务
docker-compose stop

#启动docker-compose.yml中包含的某个服务
docker-compose stop redis
  • 启动服务
#启动docker-compose.yml中所有的服务
docker-compose start

#启动docker-compose.yml中包含的某个服务
docker-compose start redis
  • 重启服务
#重启docker-compose.yml中所有的服务
docker-compose restart

#重启docker-compose.yml中包含的某个服务
docker-compose restart redis
  • 查看日志
#重启docker-compose.yml中所有的服务
docker-compose logs

#重启docker-compose.yml中包含的某个服务
docker-compose logs redis

弹性伸缩

编辑文件

version: "3"
services:
  nginx:
    image: "nginx:1.22.0"
    #container_name: "nginx-web"
    restart: "always"
    depends_on:
      - redis
      - mysql
    networks:
      - LNMP
    volumes:
      - /data/nginx/data:/usr/share/nginx/html
      - /data/nginx/logs:/var/log/nginx
    ports:
      - 80


  redis:
    image: "redis:3.2.0"
    #container_name: "redis-db"
    restart: "always"
    networks:
      - LNMP
    volumes:
     - /data/mysql/data:/var/lib/mysql
     - /data/mysql/conf:/etc/mysql/
     - /data/mysql/logs:/var/log/mysql

  mysql:
    image: "mysql:5.7.31"
    #container_name: "mysql-db"
    restart: "always"
    networks:
      - LNMP
    volumes:
      - /data/mysql/data:/var/lib/mysql
      - /data/mysql/mysql-files:/var/lib/mysql-files
      - /data/mysql/logs:/var/log/mysql
      - /data/mysql/conf:/etc/mysql
    environment:
      - MYSQL_ROOT_PASSWORD='1qaz!QAZ'
      - MYSQL_DATABASE='practice_db'
      - MYSQL_USER='Practice'
      - MYSQL_PASSWORD='Pra@db_123'

networks:
  LNMP:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 170.20.21.0/24

弹性扩容

docker-compose scale nginx=3

弹性收缩

docker-compose scale nginx=2

配置解释

#指定Compose文件的版本
version: '3.8'

#指定Docker服务的配置
services:
  # 一个简单的 web 服务器服务
  web:
    build:
      context: ./web
      dockerfile: Dockerfile
      args:
        buildno: 1
    image: webapp:latest
    command: npm start
    container_name: webapp-container
    depends_on:
      - db
    environment:
      - NODE_ENV=production
    ports:
      - "3000:3000"
    volumes:
      - ./web:/app
    networks:
      - frontend
    restart: on-failure
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000"]
      interval: 10s
      timeout: 5s
      retries: 3
    labels:
      - "com.example.description=Web Application"
      - "com.example.department=Engineering"

  # 一个数据库服务
  db:
    image: postgres:13
    container_name: db-container
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    restart: always
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user"]
      interval: 10s
      timeout: 5s
      retries: 5

  # 一个 Redis 缓存服务
  redis:
    image: redis:latest
    container_name: redis-container
    ports:
      - "6379:6379"
    networks:
      - backend
    restart: unless-stopped

#指定Docker网络的配置
networks:

  #一个
  frontend:
    driver: bridge
  backend:
    driver: bridge

#指定Docker数据卷的配置
volumes:
  db-data:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值