Docker Compose 命令及使用

2021-11-25  本文已影响0人  _大叔_

简介

Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排,帮助定义和运行多个 Docker 容器的应用,其前身是开源项目 Fig。

DockerFile 可以让用户很方便的定义一个单独的应用容器,然而在日常工作中们经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个web项目,除了web服务容器本身,往往还需要再加上后端的数据库服务器容器,甚至还包括负载均衡容器等。

Compose 恰好满足了这样的需求,它允许通过一个单独的 docker-compose.yml 模板文件,来定义一组相关联的应用容器为一个项目。

Compose 中有两个重要的概念

  1. 服务(service),一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  2. 项目(project),由一组关联的应用容器组成的一个完整业务单元,再 docker-compose.yml 文件中定义。

Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的API来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以再其上利用 Compose 来进行编排管理。

安装与卸载

安装的话,可以安装 Docker Desktop ,它包含了 Docker 以及 Compose 和 K8s,也可以单独安装,但建议先了解清楚官方对 Compose 的一些安装限制。官方地址

linux 安装

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

命令

命令 描述
version 版本目前4以下的都可以写,如3.9,3.8等,最好保持和docker版本相同
services 可以里面描述你的所有服务,以及依赖关系等
image 指定为镜像名称或镜像ID,如果镜像在本地不存在,Compose将会尝试拉取这个镜像
ports 指定与宿主机与容器映射的端口,是一个数组,每个数组的元素建议用字符形式,如 "80:80"
volumes 挂载路径设置,类型为数组,可以挂载多个。
networks 配置容器连接的网络 docker network ls 查看网络列表,docker network inspect <container id>可以查看对应网络的配置
environment 设置环境变量。你可以使用数组或字典两种方式
env_file 从文件中获取环境变量,可以为单独的文件路径或列表,文件内必须是字典方式编写
command 覆盖容器启动后默认执行的命令
depends_on 解决容器的依赖、启动先后的问题,填写的值为 服务名,会等依赖的服务启动一定程度才启动自己
healthcheck 通过命令检查容器是否监控运行
sysctls 配置容器内核参数,如ES等都需要修改内核的环境参数
ulimits 指定容器的 ulimits 限制值,如ES、Clickhouse会有修改需求
build 用来将指定Dockerfile打包成对应镜像,然后再运行该镜像

这些命令其实就类似于我们在Docker中启动一个容器的命令。

Compose文件编写

示例1

# 版本
version: "3.2"

services:
  # 服务名称
  tomcat:
    # 指定容器的名称 相当于 --name
    container_name: tomcat_1
    # 使用哪个镜像 相当于 docket run image
    image: tomcat:8.0-jre8
    # 指定宿主机与容器端口的映射 相当于 -p
    ports:
      - "8080:8080"
    # 宿主机与容器的数据共享 挂载目录 相当于 -v
    volumes:
      # 方式1:指定绝对明确(绝对路径)的挂载目录
      - /home/server:/user
      # 方式2:声明了自定创建卷名的变量
      - tomcatwebapps:/user
    # 代表当前服务处于那个网络,作用是网络隔离用,会把相网络名称相同的容器的网段统一。相当于 --network
    networks:
      - group1

  mysql:
    image: mysql:5.7.32
    container_name: mysql
    ports:
    - "3306:3306"
    volumes:
    - mysqldata:/var/lib/mysql
    - mysqlconf:/etc/mysql
    environment:
      -MYSQL_ROOT_PASSWORD=root
    networks:
      group1


# 描述 挂在卷里的变量
volumes:
  # 指定变量 tomcatwebapps,如果不写 external,默认会是 docker-compose.yml 所在当前文件夹的名称(会自动创建)
  tomcatwebapps:
    # 使用自定义卷毛
    external:
      # true 确定使用指定卷名,注意:一旦使用外部自定义卷名,启动服务之前必须手动创建 docker volume create 卷名
      false
  mysqldata:
  mysqlconf:

# 定义服务用到的网络
networks:
  # 定义上面的服务用到的网络的名称,默认是驱动属于 bridge,自定义的网络名称 group1,在实际中会变为 项目名(或所在文件目录名)
  group1:
    # 使用外部指定的网络,为 true 就标识网络必须存在
    external:
      # docker network create -d bridge 网络名称
      true

示例2

# 指定版本,版本的关系和Docker 引擎有关
# https://docs.docker.com/compose/compose-file/compose-file-v3/#profiles 版本关系及说明
version: '3.7'

# 指定服务
services:
  # 服务名称 唯一
  monitor-web-server-service:
    # 构建镜像的项目路径
    build:
      # 指定上下文路径,默认是微服务项目的根目录
      context: ./monitor-web/monitor-web-server/
      # 指定
      dockerfile: monitor-web-server-service
    # 指定镜像名称
    image: monitor-web-server-service
    # .env的环境变量
    env_file:
      - ./.env
    # 网络配置
    networks:
      - internal_access
      - external_access # db access

  monitor-web-socket-service:
    build: ./monitor-web/monitor-web-socket/monitor-web-socket-service
    image: boboweike/monitor-web-socket-service
    env_file:
      - ./.env
    # 依赖的项目,启动的时候根据依赖关系定义启动顺序
    depends_on:
      - monitor-web-server-service
    networks:
      - internal_access
      - external_access # db access

  monitor-gateway:
    build: ./monitor-gateway
    image: boboweike/monitor-gateway
    # 设置内部和外部端口
    ports:
    - 80:80
    env_file:
      - ./.env
    # 依赖的项目,启动的时候根据依赖关系定义启动顺序
    depends_on:
      - monitor-web-server-service
      - monitor-web-server-service
    networks:
      - internal_access
      - external_access
    # 心跳检查
    healthcheck:
      # 访问 monitor-gateway 网关的命令
      test: [ "CMD","curl","-f","http://localhost:80" ]
      # 间隔时间
      interval: 1m30s
      # 超时时间
      timeout: 10s
      # 重试次数
      retries: 3

  mysql:
    image: mysql:5.7.32
    container_name: mysql
    ports:
      - "3306:3306"
    volumes:
      - mysqldata:/var/lib/mysql
      - mysqlconf:/etc/mysql
    env_file:
      - ./mysql.env
    networks:
      - external_access
    # 修改内核参数,也可以是数组的方式
    sysctls:
      net.core.somaxconn: 1024
      net.ipv4.tcp_syncookies: 0
    # 指定容器的 ulimits 限制值,例如 ,
    ulimits:
      # 指定最大进程数为 65535
      nproc: 65535
      # 指定文件句柄数为
      nofile:
        # 软限制 200000(软限制,应用可以随时修改,不能超过硬限制)
        soft: 20000
        # 硬限制(系统硬限制,只能root用户提高)
        hard: 40000


  myaccount-service:
    build:
      context: ./frontend
      dockerfile: myaccount/Dockerfile
    image: boboweike/myaccount-spa
    networks:
      - internal_access


networks:
  internal_access:
    internal: true
  external_access:

Compose 指令

对于Compose来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到影响。

docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]

命令选项

命令使用说明

up
docker-compose up [options] [SERVICE...]
down
docker-compose down

此命令将会停止 up 命令所启动的容器,并移除网络

exec
docker-compose exec 服务名

进入指定的容器

ps
docker-compose ps [options] [SERVICE...]

列出项目中目前的所有容器。

restart
docker-compose restart [options] [service...]

重启项目中的服务,选项 -t 指定重启前停止容的超时时间(默认10s)

rm
docker-compose rm [options] [service...]

删除所有(停止状态的)服务容器。推荐先执行 docker-compose stop 命令来停止容器。

start
docker-compose start [service...]

启动已经存在的服务容器

stop
docker-compose stop [options] [service...]

停止已经处于运行状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器

top
docker-compose top

查看各个服务容器内运行的进程。

pause,unpause
docker-compose pause [service...]

暂停处于运行中的服务。

docker-compose unpause [service...]

恢复处于暂停状态中的服务。

logs
docker-compose logs [service...]

查看某个服务的日志

上一篇下一篇

猜你喜欢

热点阅读