• docker-compose


    Docker-Compose 是 Docker 官方的开源项目,负责实现对Docker容器集群的快速编排。

    Docker-Compose可以管理多个Docker容器组成一个应用。需要定义一个yaml格式的配置文件 docker-compose.yml,配置好多个容器之间的调用关系,然后只需要一个命令就能同时启动/关闭这些容器。

    Docker建议我们每个容器中只运行一个服务,因为Docker容器本身占用资源极少,所以最好是将每个服务单独的分割开来。但是如果我们需要同时部署多个服务,每个服务单独构建镜像构建容器就会比较麻烦。所以 Docker 官方推出了 docker-compose 多服务部署的工具。

    Compose允许用户通过一个单独的 docker-compose.yml 模板文件来定义一组相关联的应用容器为一个项目(project)。可以很容易的用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。

    核心概念:

    ●服务(service):一个个应用容器实例
    ●工程(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml中定义

    Compose使用的三个步骤:

    1. 编写 Dockerfile 定义各个应用容器,并构建出对应的镜像文件
    2. 编写 docker-compose.yml,定义一个完整的业务单元,安排好整体应用中的各个容器服务
    3. 执行 docker-compose up 命令,其创建并运行整个应用程序,完成一键部署上线

    安装docker-compose

    两种最新的docker安装方式

    • 下载最新版的docker-compose文件 
    sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

    若是github访问太慢,可以用daocloud下载

    sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    • 添加可执行权限
    sudo chmod +x /usr/local/bin/docker-compose
    • 测试安装结果
    1. $ docker-compose --version
    2. docker-compose version 1.25.1, build a82fef07

    2.pip安装

    sudo pip install docker-compose

     Docker-compose 常用命令

    up

    docker-compose up创建并启动所有服务的容器。指定多个yml-f选项。以守护进程模式运行加-d选项。

    1. # 前台启动
    2. docker-compose up
    3. # 后台启动
    4. docker-compose up -d
    5. # -f 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定,指定多个 yml
    6. docker-compose -f docker-compose.yml up -d

    logs

    docker-compose logs查看服务容器的输出日志。默认情况下,docker-compose将对不同的服务输出使用不同的颜色来区分。可以通过--no-color来关闭颜色。

    1. # 输出日志,不同的服务输出使用不同的颜色来区分
    2. docker-compose logs
    3. # 跟踪日志输出
    4. docker-compose logs -f
    5. # 关闭颜色
    6. docker-compose logs --no-color

    ps

    docker-compose ps列出工程中所有服务的容器。

    1. # 列出工程中所有服务的容器
    2. docker-compose ps
    3. # 列出工程中指定服务的容器
    4. docker-compose ps nginx

    run

    docker-compose run在指定服务容器上执行一个命令。

    1. # 在工程中指定服务的容器上执行 echo "helloworld"
    2. docker-compose run nginx echo "helloworld"

    exec

    docker-compose exec进入服务容器。

    1. # 进入工程中指定服务的容器
    2. docker-compose exec nginx bash
    3. # 当一个服务拥有多个容器时,可通过 --index 参数进入到该服务下的任何容器
    4. docker-compose exec --index=1 nginx bash

    pause

    docker-compose pause暂停服务容器

    1. # 暂停工程中所有服务的容器
    2. docker-compose pause
    3. # 暂停工程中指定服务的容器
    4. docker-compose pause nginx

    unpause

    docker-compose unpause恢复服务容器。

    1. # 恢复工程中所有服务的容器
    2. docker-compose unpause
    3. # 恢复工程中指定服务的容器
    4. docker-compose unpause nginx

    restart

    docker-compose restart重启服务容器。

    1. # 重启工程中所有服务的容器
    2. docker-compose restart
    3. # 重启工程中指定服务的容器
    4. docker-compose restart nginx

    start

    docker-compose start启动服务容器。

    1. # 启动工程中所有服务的容器
    2. docker-compose start
    3. # 启动工程中指定服务的容器
    4. docker-compose start nginx

    kill

    docker-compose kill通过发送SIGKILL信号停止指定服务的容器。

    1. # 通过发送 SIGKILL 信号停止工程中指定服务的容器
    2. docker-compose kill nginx

    rm

    docker-compose rm 删除服务(停止状态)容器。

    1. # 删除所有(停止状态)服务的容器
    2. docker-compose rm
    3. # 先停止所有服务的容器,再删除所有服务的容器
    4. docker-compose rm -s
    5. # 不询问是否删除,直接删除
    6. docker-compose rm -f
    7. # 删除服务容器挂载的数据卷
    8. docker-compose rm -v
    9. # 删除工程中指定服务的容器
    10. docker-compose rm -sv nginx

    down

    停止并删除所有服务的容器、网络、镜像、数据卷。

    1. # 停止并删除工程中所有服务的容器、网络
    2. docker-compose stop
    3. # 停止并删除工程中所有服务的容器、网络、镜像
    4. docker-compose down --rmi all
    5. # 停止并删除工程中所有服务的容器、网络、数据卷
    6. docker-compose down -v

    port

    docker-compose port打印指定服务容器的某个端口所映射的宿主机端口。

    docker-compose port nginx 80
    

    top

    docker-compose top显示正在运行的进程。

    1. # 显示工程中所有服务的容器正在运行的进程
    2. docker-compose top
    3. # 显示工程中指定服务的容器正在运行的进程
    4. docker-compose top nginx

    使用 Docker Compose 编排应用程序

     Docker Compose 编排容器的步骤

    1. 定义应用的 Dockerfile 文件,为了在任何地方都能构建
    2. 通过 docker-compose.yml 定义一套服务 services ,这些服务可以在一个隔离的环境中一起运行,并能相互通信
    3. docker-compose up 启动一整套服务

    编写 docker-compose.yml 文件

    将 web 容器和 redis 容器组织编排起来,使用 docker-compose.yml 进行定义:

    这里一定要注意每个服务 build 字段的配置,一定要设置为该服务 Dockerfile 文件所在的文件路径。当前所有文件都准备好了

     build 

    1. version: '3'
    2. services:
    3. redis:
    4. build: ./redis/
    5. restart: always
    6. demoapp:
    7. build: ./app/
    8. depends_on:
    9. - redis
    10. ports:
    11. - "8080:8080"
    12. restart: always

     

     两个springboot项目

    1. version: "3"
    2. services:
    3. dockerlearn-one:
    4. # docker运行的容器名称
    5. container_name: dockerlearn-one
    6. # 指定当前 build 时的 dockerFile的路径("."代表当前路径)
    7. build: ./dockerlearn
    8. # 运行 docker 容器的映射端口
    9. ports:
    10. - "8088:8088"
    11. # build 后镜像名称和版本号
    12. image: dockerlearn-one:1.0.0
    13. # 在容器退出时总是重启容器
    14. restart: always
    15. volumes:
    16. - /volumesdata/dockerlearn:/dockerlearn
    17. dockerlearn-two:
    18. # docker运行的容器名称
    19. container_name: dockerlearn-two
    20. # 指定当前 build 时的 dockerFile的路径("."代表当前路径)
    21. build: ./dockerlearn-two
    22. # 运行 docker 容器的映射端口
    23. ports:
    24. - "8099:8099"
    25. # build 后镜像名称和版本号
    26. image: dockerlearn:1.0.0
    27. # 在容器退出时总是重启容器
    28. restart: always
    29. volumes:
    30. - /volumesdata/dockerlearn-two:/dockerlearn-two

     image 

    1. version: '3'
    2. services:
    3. # 指定服务名称
    4. db:
    5. # 指定服务使用的镜像
    6. image: mysql:5.7
    7. # 指定容器名称
    8. container_name: mysql
    9. # 指定服务运行的端口
    10. ports:
    11. - 3306:3306
    12. # 指定容器中需要挂载的文件
    13. volumes:
    14. - /mydata/mysql/log:/var/log/mysql
    15. - /mydata/mysql/data:/var/lib/mysql
    16. - /mydata/mysql/conf:/etc/mysql
    17. # 指定容器的环境变量
    18. environment:
    19. - MYSQL_ROOT_PASSWORD=root
    20. # 指定服务名称
    21. mall-tiny-docker-compose:
    22. # 指定服务使用的镜像
    23. image: mall-tiny/mall-tiny-docker-compose:0.0.1-SNAPSHOT
    24. # 指定容器名称
    25. container_name: mall-tiny-docker-compose
    26. # 指定服务运行的端口
    27. ports:
    28. - 8080:8080
    29. # 指定容器中需要挂载的文件
    30. volumes:
    31. - /etc/localtime:/etc/localtime
    32. - /mydata/app/mall-tiny-docker-compose/logs:/var/logs

     

    1. # docker-compose文件版本号
    2. version: "3"
    3. # 配置各个容器服务
    4. services:
    5. microService:
    6. image: springboot_docker:1.0
    7. container_name: ms01 # 容器名称,如果不指定,会生成一个服务名加上前缀的容器名
    8. ports:
    9. - "6001:6001"
    10. volumes:
    11. - /app/microService:/data
    12. networks:
    13. - springboot_network
    14. depends_on: # 配置该容器服务所依赖的容器服务
    15. - redis
    16. - mysql
    17. redis:
    18. image: redis:6.0.8
    19. ports:
    20. - "6379:6379"
    21. volumes:
    22. - /app/redis/redis.conf:/etc/redis/redis.conf
    23. - /app/redis/data:data
    24. networks:
    25. - springboot_network
    26. command: redis-server /etc/redis/redis.conf
    27. mysql:
    28. image: mysql:5.7
    29. environment:
    30. MYSQL_ROOT_PASSWORD: '123456'
    31. MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
    32. MYSQL_DATABASE: 'db_springboot'
    33. MYSQL_USER: 'springboot'
    34. MYSQL_PASSWORD: 'springboot'
    35. ports:
    36. - "3306:3306"
    37. volumes:
    38. - /app/mysql/db:/var/lib/mysql
    39. - /app/mysql/conf/my.cnf:/etc/my.cnf
    40. - /app/mysql/init:/docker-entrypoint-initdb.d
    41. networks:
    42. - springboot_network
    43. command: --default-authentication-plugin=mysql_native_password # 解决外部无法访问
    44. networks:
    45. # 创建 springboot_network 网桥网络
    46. springboot_network:

    restart=always参数能够使我们在重启docker时,自动启动相关容器。

     启动服务

     docker compose up -d

     编写完成docker-compose.yml后,进行语法检查:

    1. # 进行语法检查
    2. docker-compose config -q

     命令

    depends_on

    设置依赖关系。

    • docker-compose up : 以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis ,才会启动 web。
    • docker-compose up SERVICE : 自动包含 SERVICE 的依赖项。在以下示例中,docker-compose up web 还将创建并启动 db 和 redis。
    • docker-compose stop :按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止。
    1. version: "3.7"
    2. services:
    3. web:
    4. build: .
    5. depends_on:
    6. - db
    7. - redis
    8. redis:
    9. image: redis
    10. db:
    11. image: postgres

    注意:web 服务不会等待 redis db 完全启动 之后才启动。 

    docker-compose.yml配置详解

    每个docker-compose.yml必须定义image或者build中的一个,其它的是可选的。

    image

    指定为镜像名称或镜像ID。

    如果镜像不存在,Compose将尝试从互联网拉取这个镜像

    指定服务的镜像名,若本地不存在,则 Compose 会去仓库拉取这个镜像:

    指定镜像tag或者ID。示例:

    1. image: redis
    2. image: ubuntu:14.04
    3. image: tutum/influxdb
    4. image: example-registry.com:4000/postgresql
    5. image: a4bc65fd

    ps:在version 1里同时使用image和build是不允许的,version 2则可以,如果同时指定了两者,会将build出来的镜像打上名为image标签

    build

    用来指定一个包含Dockerfile文件的路径。一般是当前目录.。Fig将build并生成一个随机命名的镜像。

    ps:在version 1里bulid仅支持值为字符串。version 2里支持对象格式。

    1. build: ./dir
    2. build:
    3. context: ./dir
    4. dockerfile: Dockerfile-alternate
    5. args:
    6. buildno: 1
    • context:路径
    • dockerfile:需要替换默认docker-compose的文件名
    • args:为构建(build)过程中的环境变量,用于替换Dockerfile里定义的ARG参数,容器中不可用。

    command

    用来覆盖缺省命令。示例:

    command: bundle exec thin -p 3000

    也支持数组形式:

    command: [bundle, exec, thin, -p, 3000]

    env_file

    从文件中获取环境变量,可以为单独的文件路径或列表。 如果通过 docker-compose -f FILE 指定了模板文件,则 env_file 中路径会基于模板文件路径。 如果有变量名称与 environment 指令冲突,则以后者为准。

    1. env_file: .env
    2. env_file:
    3. - ./common.env
    4. - ./apps/web.env
    5. - /opt/secrets.env

     环境变量文件中每一行必须符合格式,支持 # 开头的注释行。

    1. # common.env: Set Rails/Rack environment
    2. RACK_ENV=development

    links

    用于链接另一容器服务,如需要使用到另一容器的mysql服务。可以给出服务名和别名;也可以仅给出服务名,这样别名将和服务名相同。同docker run --link示例:

    1. links:
    2. - db
    3. - db:mysql
    4. - redis

     ports

     用于暴露端口。同docker run -p示例:

    1. ports:
    2. - "3000"
    3. - "8000:8000"
    4. - "49100:22"
    5. - "127.0.0.1:8001:8001"

     ps:冒号前面是主机上的端口,冒号后面是容器内部的端口。

     expose

     expose提供container之间的端口访问,不会暴露给主机使用。同docker run --expose

    1. expose:
    2. - "3000"
    3. - "8000"

     volumes

     挂载数据卷。同docker run -v示例:

    1. volumes:
    2. - /var/lib/mysql
    3. - cache/:/tmp/cache
    4. - ~/configs:/etc/configs/:ro

     volumes_from

    挂载数据卷容器,挂载是容器。同docker run --volumes-from示例:

    1. volumes_from:
    2. - service_name
    3. - service_name:ro
    4. - container:container_name
    5. - container:container_name:rw

     ps:container:container_name格式仅支持version 2

    environment

    添加环境变量。同docker run -e。可以是数组或者字典格式:

    1. environment:
    2. RACK_ENV: development
    3. SESSION_SECRET:
    4. environment:
    5. - RACK_ENV=development
    6. - SESSION_SECRET

    depends_on

    用于指定服务依赖,一般是mysql、redis等。 指定了依赖,将会优先于服务创建并启动依赖。

    links也可以指定依赖。

    external_links

    链接搭配docker-compose.yml文件或者Compose之外定义的服务,通常是提供共享或公共服务。格式与links相似:

    1. external_links:
    2. - redis_1
    3. - project_db_1:mysql
    4. - project_db_1:postgresql

     ps:external_links链接的服务与当前服务必须是同一个网络环境。

    extra_hosts

    添加主机名映射。

    1. extra_hosts:
    2. - "somehost:162.242.195.82"
    3. - "otherhost:50.31.209.229"

     将会在/etc/hosts创建记录:

    1. 162.242.195.82 somehost
    2. 50.31.209.229 otherhost

    extends

    继承自当前yml文件或者其它文件中定义的服务,可以选择性的覆盖原有配置。

    1. extends:
    2. file: common.yml
    3. service: webapp

     service必须有,file可选。service是需要继承的服务,例如web、database。

    net

    设置网络模式。同docker的--net参数。

    1. net: "bridge"
    2. net: "none"
    3. net: "container:[name or id]"
    4. net: "host"

    dns

    自定义dns服务器。

    1. dns: 8.8.8.8
    2. dns:
    3. - 8.8.8.8
    4. - 9.9.9.9

  • 相关阅读:
    分布式机器学习:同步并行SGD算法的实现与复杂度分析(PySpark)
    为什么要code review
    剑指Java面试:面试官能问到的问题,都被我收集在这份PDF文档里
    嵌入式软件工程师——2025校招专题(一)
    鸿蒙 harmonyos 线程 并发 总结 async promise Taskpool woker(二)多线程并发 Taskpool
    后台管理-----搜索框重置
    化合物的四种基本反应与氧化还原反应;化合物极性与非极性;亲核反应与亲电反应
    计算机网络第2章-HTTP和Web协议(2)
    java-net-php-python-springboot宿舍管理计算机毕业设计程序
    Harbor webhook从原理到构建
  • 原文地址:https://blog.csdn.net/yuzheh521/article/details/126869884