Docker Compose总结

Love The Way You Lie 2021-09-11 02:54 297阅读 0赞

Docker Compose概述

Docker Compose是以单引擎模式(Single-Engine Mode)进行多应用的部署和管理(单引擎模式的服务编排);

解决的问题:一个完整应用的各协同服务的部署和管理,如一个完整网上商城后端应用的各个微服务;
解决的方式:通过一个声明式的YML配置文件描述整个应用,根据该文件配置执行命令完成部署;

1.Docker Compose 术语

Docker Compose运行目录下的所有文件(docker-compose.yml)组成一个工程,一个工程包含多个服务,
每个服务中定义了容器运行的镜像、参数、依赖,一个服务可包括多个容器实例;

Docker Compose将所管理的容器分为三层,分别是:

  1. 工程(project)
  2. 服务(service)
  3. 容器(container)

2.Docker Compose使用步骤

Docker Compose使用的三个步骤:

  1. 使用 Dockerfile 定义应用程序的环境;
  2. 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行;
  3. 最后,执行 docker-compose up 命令来启动并运行整个应用程序;

3.docker-compose.yml

Docker Compose配置文件第一层级key包含:

  1. version
  2. services
  3. networks
  4. volumes

3.1 version

version是必须指定的,而且总是位于文件的第一行,它定义了Compose文件格式(主要是 API)的版本;
version和Docker引擎的版本号有一个对应关系:










































Compose file version Docker引擎
1 1.9.0+
2.0 1.10.0+
2.1 1.12.0+
2.2, 3.0, 3.1, 3.2 1.13.0+
2.3, 3.3, 3.4, 3.5 17.06.0+
2.4 17.12.0+
3.6 18.02.0+
3.7 18.06.0+

使用的是哪个版本的Docker引擎,version就写对应的版本号;

https://github.com/docker/compose/releases

3.2 services

services用于定义不同的应用服务:

  1. version: "3"
  2. services:
  3. mysql:
  4. image: mysql:8.0.16
  5. environment:
  6. - MYSQL_ROOT_PASSWORD=123456
  7. - MYSQL_USER=root
  8. - MYSQL_DATABASE=test
  9. - MYSQL_PASSWORD=root
  10. volumes:
  11. - mysql_data:/var/lib/mysql
  12. - ./mysql.ini:/etc/mysql/conf.d/my.cnf
  13. - ./init-mysql.sql:/docker-entrypoint-initdb.d/1-init-mysql.sql
  14. - ./init-master.sql:/docker-entrypoint-initdb.d/1-init-master.sql
  15. command: [
  16. "--log-bin=mysql-bin",
  17. "--binlog-format=ROW",
  18. "--server-id=1",
  19. "--sync_binlog=1"
  20. ]
  21. ports:
  22. - 3306:3306
  23. networks:
  24. - school-service-net
  25. ulimits:
  26. nproc: 65535
  27. nofile:
  28. soft: 20000
  29. hard: 40000
  30. restart: unless-stopped
  31. school-service-eureka:
  32. hostname: discovery
  33. image: localhost:5000/cloud-eureka:0.0.1-SNAPSHOT
  34. ports:
  35. - 8761:8761
  36. networks:
  37. - school-service-net
  38. restart: unless-stopped
  39. school-service-student:
  40. image: localhost:5000/school-service-student:0.0.1-SNAPSHOT
  41. ports:
  42. - 8080:8080
  43. networks:
  44. - school-service-net
  45. depends_on:
  46. - school-service-eureka
  47. restart: unless-stopped
  48. links:
  49. - school-service-eureka:discovery
  50. school-service-ribbon:
  51. image: localhost:5000/school-service-ribbon:0.0.1-SNAPSHOT
  52. ports:
  53. - 8082:8082
  54. networks:
  55. - school-service-net
  56. depends_on:
  57. - school-service-eureka
  58. restart: unless-stopped
  59. links:
  60. - school-service-eureka:discovery
  61. volumes:
  62. mysql_data:
  63. networks:
  64. school-service-net:

具体的service下常用命令有(部分命令上述栗子未使用):

  1. build

    build: .

指定Docker基于当前目录(.)下Dockerfile中定义的指令来构建一个新镜像,该镜像会被用于启动该服务的容器;

  1. command

    command python app.py

指定 Docker 在容器中执行名为 app.py 的 Python 脚本作为主程序;
因此镜像中必须包含 app.py 文件以及 Python,这一点在 Dockerfile 中可以得到满足;

  1. ports

    ports:

    • 3306:3306

指定本容器内(-target)的3306端口映射到主机(published)的3306端口;
这意味着发送到Docker主机3306端口的流量会被转发到容器的3306端口;
容器中的应用监听端口 3306;

  1. networks

    networks:

    • school-service-net

使得本服务可以连接到指定的网络上,这个网络应该是已经存在的,或者是在一级key(networks)中定义的网络;

  1. volumes

    volumes:

    • mysql_data:/var/lib/mysql

指定Docker将mysql_data卷(source:)挂载到容器内的/var/lib/mysql(target:);
mysql_data卷应该是已存在的,或者是在文件下方的一级key(volumes)中定义的;

  1. image

    image: localhost:5000/school-service-ribbon:0.0.1-SNAPSHOT

从Docker Hub或者Docker私服上拉取这个名为localhost:5000/school-service-ribbon,版本为0.0.1-SNAPSHOT的镜像

  1. networks

    networks:

    • school-service-net

配置当前容器连接到名为school-service-net的网络;

  1. hostname

    hostname: discovery

给当前容器指定主机名;


综上,Docker Compose会调用Docker来为services下各个声明的服务部署一个独立的容器;
该容器基于与Compose文件位于同一目录下的Dockerfile构建镜像或去Docker私服上拉取指定镜像;
各个容器运行启动后,将通过port声明的端口暴露给宿主机,连接到school-service-net网络上,
对于mysql这个服务还会挂载mysql_data卷和一些文件到宿主机的/var/lib/mysql等路径;

3.3 networks

networks用于指引Docker引擎创建新的网络;
默认情况下,Docker Compose会创建bridge类型的网络:

  1. networks:
  2. school-service-net:
  3. #driver: bridge 默认类型

3.4 volumes

volumes用于指引Docker引擎创建新的卷;

  1. volumes:
  2. mysql_data:
  3. mongo_data:
  4. rabbitmq_data:
  5. redis_data:
  6. elastic_data:
  7. postgres_data:
  8. activemq_data:

4.启动Docker Compose

1.编写一个完整可用的微服务docker-compose.yml

  1. version: "3"
  2. services:
  3. school-service-eureka:
  4. hostname: discovery
  5. image: localhost:5000/cloud-eureka:0.0.1-SNAPSHOT
  6. ports:
  7. - 8761:8761
  8. networks:
  9. - school-service-net
  10. restart: unless-stopped
  11. school-service-student:
  12. image: localhost:5000/school-service-student:0.0.1-SNAPSHOT
  13. ports:
  14. - 8080:8080
  15. networks:
  16. - school-service-net
  17. depends_on:
  18. - school-service-eureka
  19. restart: unless-stopped
  20. links:
  21. - school-service-eureka:discovery
  22. school-service-ribbon:
  23. image: localhost:5000/school-service-ribbon:0.0.1-SNAPSHOT
  24. ports:
  25. - 8082:8082
  26. networks:
  27. - school-service-net
  28. depends_on:
  29. - school-service-eureka
  30. restart: unless-stopped
  31. links:
  32. - school-service-eureka:discovery
  33. networks:
  34. school-service-net:

我本地已经通过maven插件编译发布了这三个镜像到本地Docker私服上

2.编写启动脚本docker-compose.sh

  1. #!/usr/bin/env bash
  2. docker-compose -f docker-compose.yml up -d

3.执行启动脚本:

  1. /usr/bin/env bash /Users/admin/gitCode/school-service/school-service/service-docker/docker-service-deploy/compose/docker-compose.sh
  2. Creating network "compose_school-service-net" with the default driver
  3. Creating compose_school-service-eureka_1 ...
  4. Creating compose_school-service-ribbon_1 ...
  5. Creating compose_school-service-student_1 ...
  6. Creating compose_school-service-student_1 ... done

在这里插入图片描述查看容器状态:
在这里插入图片描述

4.停掉docker-compose

  1. docker-compose stop

在这里插入图片描述

https://docs.docker.com/compose/reference/overview/
https://github.com/docker/compose/releases
https://www.runoob.com/docker/docker-compose.html

发表评论

表情:
评论列表 (有 0 条评论,297人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Docker Compose

    文章目录 一、什么是Docker Compose 二、Ubuntu下安装Docker Compose 安装 方法一: 方法二: 添加可执行权限 3.验证是否安装成功: 三...