Docker学习—Compose

chaney1992 2020-11-08 23:46:13
docker 学习 博客园 compose 技术开发


前言

前面《Docker学习—DockerFile》文中介绍了dockerfile相关的语法,及使用方式;接下来了解docker三剑客之一的 Compose;接下来详细学习。

一、docker-compose介绍

Docker-Compose项目是Docker官方的开源项目,主要使用Python编写;用于定义和运行多容器Docker应用程序的工具。使用Compose,可以使用YAML文件来配置应用程序的服务。然后使用一个命令,从配置创建并启动所有服务。

Compose是一个定位“定义和运行多个Docker容器应用的工具”,其前身是Fig,目前使用的Compose仍然兼容Fig格式的模板文件。

Compose中包含两个重要概念:

  • 服务(Service):一个应用的容器,实际可以包含若干个运行相同镜像的容器实例
  • 项目(Project):一组相关联的应用容器组成的完整业务单元,在docker-compose.yml文件中定义

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

二、docker-compose安装

Compose目前已经完全支持Linux、Mac OS和Windows,在安装Compose之前,需要先安装Docker;(本篇主要在window中使用)

安装成功后命令行中输入:docker compose -h  

三、docker-compose 命令

安装成功后来看下compose主要包含的命令:

 build #生成或重建服务
bundle #从Compose文件生成Docker bundle
config #验证并查看撰写文件
create #创建服务
down #停止并删除容器、网络、镜像和卷
events #从容器接收实时事件
exec #在正在运行的容器中执行命令
help #获取命令帮助
images #显示镜像列表
kill #杀死容器
logs #查看容器的输出
pause #暂停服务
port #打印端口绑定的公共端口
ps #显示容器列表
pull #拉取服务镜像
push #推送服务镜像
restart #重新启动服务
rm #移除停止的容器
run #运行一次性命令
scale #设置服务的容器数
start #启动服务
stop #暂停服务
top #显示正在运行的进程
unpause #取消暂停服务
up #创建并启动容器
version #显示Docker-Compose版本信息

对命令有大概印象后,接下来就需要对重点内容(docker-compose.yml)了解;每个命令具体的使用参数在使用是具体介绍

三、docker-compose.yml编写

docker-compose.yml已有多个版本:如下

  首先我们先来看一个官方示例docker-compose.yml内容:

version: "3.8"
services:
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
max_replicas_per_node: 1
constraints:
- "node.role==manager"
vote:
image: dockersamples/examplevotingapp_vote:before
ports:
- "5000:80"
networks:
- frontend
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
restart_policy:
condition: on-failure
result:
image: dockersamples/examplevotingapp_result:before
ports:
- "5001:80"
networks:
- backend
depends_on:
- db
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 1
labels: [APP=VOTING]
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
placement:
constraints:
- "node.role==manager"
networks:
frontend:
backend:
volumes:
db-data:

 

根据以上示例格式可以看出docker-compose.yml中主要包含以下内容:

  • version: 指定当前docker-compose.yml的版本,版本与Docker Engine版本存在对应关系,如:v3.8对应 Docker Engine 19.03.0+
  • services:服务,可以定义业务需要的一些服务,每个服务可包含服务名称、使用镜像、挂载数据卷、使用的网络、依赖服务等信息
  • networks:应用的网络,可以定义网络名称、使用的网络类型等
  • volumes:数据卷,可以定义数据卷,然后挂载到不同的服务下使用

接着就来看下相关命令的语法及具体含义

docker-compose.yml命令
序号 所属 命令 说明
1 services build 基于Dockerfile,指定Dockerfile所在路径,Compose会利用它自动构建镜像,然后启动服务容器 
2 cap_add,cap_drop 添加或删除容器功能
3 command 覆盖容器启动后默认执行的命令
4 config 使用“每服务配置”配置在每个服务的基础上授予对配置的访问权限。存在两种语法方式:短语法、长语法
5 cgroup_parent 为容器指定一个可选的父cgroup
6 container_name 容器名称
7 depends_on 容器依赖,用于指定服务依赖的其他服务
8 depoly

指定与服务的部署和运行相关的配置。这只在使用docker stack deploy部署到一个群时生效,docker compose up和docker compose run将忽略此项。

9 devices 设备映射列表。
10 dns 自定义DNS服务器。可以是单个值或列表。
11 dns_search 自定义DNS搜索域。可以是单个值或列表。
12 entrypoint 覆盖默认入口点
13 env_file 从文件添加环境变量。可以是单个值或列表
14 environment 添加环境变量。可以使用数组或字典。任何布尔值(true、false、yes、no)都需要用引号括起来,以确保它们不会被YML解析器转换为true或false。
15 expose 暴露端口而不将它们发布到主机-它们只能被链接的服务访问。只能指定内部端口。
16 external_links 链接到在此范围之外docker-compose.yml甚至在Compose之外开始的容器,尤其是对于提供共享或公共服务的容器。 同时指定容器名称和链接别名()时,请external_links遵循与legacy选项相似的语义。
17 extra_hosts 添加主机名映射。使用与docker客户端相同的值
18 healthcheck 配置运行的检查以确定该服务的容器是否“健康”
19 image 指定要从中启动容器的镜像。可以是存储库/标签或镜像ID
20 init 在容器内运行一个初始化程序,以转发信号并获取进程。设置此选项可以true为服务启用此功能。 
21 isolation 指定容器的隔离技术。在Linux上,唯一支持的值是default。在Windows中,可接受的值是default,process和 hyperv。
22 labels 使用Docker标签将元数据添加到容器中。您可以使用数组或字典。
23 links 链接到另一个服务中的容器。指定服务名称和链接别名("SERVICE:ALIAS"),或者仅指定服务名称。
24 logging 服务的日志记录配置
25 network_mode 网络模式。使用与客户端服务相同的网络名称和服务-参数docker相同。
26 networks 要加入的网络,引用顶级网络键下的条目。
27 pid 将PID模式设置为主机PID模式。这将打开容器和主机操作系统之间的PID地址空间共享。
28 ports 暴露端口 
29 restart no是默认的重启策略,在任何情况下都不会重启容器。当always指定时,容器总是重新启动。该 on-failure如果退出代码指示的故障错误政策重启的容器。unless-stopped总是重新启动容器,除非容器停止(手动或其他方式)。
30 secrets 使用按服务secrets 配置,按服务授予对机密的访问权限。
31 security_opt 覆盖每个容器的默认标签方案。
32 stop_grace_period 指定在发送SIGKILL之前,如果容器不处理SIGTERM(或用stop_nusignal指定的任何停止信号),尝试停止该容器时要等待多长时间。默认10s
33 stop_signal 设置停止容器的替代信号。默认情况下,stop使用SIGTERM。使用stop_signal设置替代信号会导致stop发送该信号。
34 sysctls 要在容器中设置的内核参数。可以使用数组或字典。
35 tmpfs 在容器内安装一个临时文件系统。可以是单个值或列表。 
36 ulimits 覆盖容器的默认ulimit。您可以将单个限制指定为整数,也可以将软/硬限制指定为映射。
37 userns_mode 如果Docker守护程序配置了用户名称空间,则禁用此服务的用户名称空间。
38 volumes

挂载主机路径或命名卷,指定为服务的子选项。可以将主机路径安装为单个服务的定义的一部分,而无需在顶级volumes中进行定义。

但是,如果要在多个服务之间重用卷,请在顶级volumes密钥中定义一个命名卷。

将命名卷与服务,群集和堆栈文件一起使用。

39

domainname, hostname, ipc, mac_address, privileged,

read_only, shm_size, stdin_open, tty, user, working_dir

其中每个都是一个值,类似于其 docker run对应项。
40 Volumes dirver 指定该卷应使用哪个卷驱动程序。默认为Docker Engine配置为使用的任何驱动程序,大多数情况下为 local。
41 dirver_opts 指定选项列表作为键值对,以传递给该卷的驱动程序。
42 external 如果设置为true,则指定此卷是在Compose之外创建的。docker-compose up不会尝试创建它,如果不存在则引发错误。
43 labels 使用Docker标签向容器添加元数据。可以使用数组或字典。
44 name 为此卷设置一个自定义名称。名称字段可用于引用包含特殊字符的卷。
45 Networks dirver 指定该网络应使用哪个驱动程序。
46 dirver_opts 指定选项列表作为要传递给此网络的驱动程序的键值对
47 attachable 仅当驱动程序设置为覆盖时使用。
48 enable_ipv6 在此网络上启用IPv6网络。
49 ipam 指定自定义IPAM配置
50 internal 默认情况下,Docker还会连接一个网桥网络来提供外部连接。如果要创建外部隔离的覆盖网络,可以将此选项设置为true。
51 labels 使用Docker标签将元数据添加到容器中 。您可以使用数组或字典。
52 external 如果设置为true,则指定此网络是在Compose之外创建的。docker-compose up不会尝试创建它,如果不存在则引发错误。
53 name 为此网络设置一个自定义名称。名称字段可用于引用包含特殊字符的网络。

  通过以上内容发现,services中相关命令是docker相关配置项关联;接下来就来验证通过docker-compose.yml运行应用 

四、应用案例

实现效果:基于身份认证时,相关示例代码实现,通过docker-compose启动相关所有服务容器,运行程序。

A、在解决方案目录下添加docker-compose.yml文件:

添加方式:

1、手动添加文件

2、通过vs自动添加:选中需要添加项目右键,如图

添加后如下:

 

 

B、修改内容如下:(该docker-compose.yml比较简单)

version: '3.4'
services:
cz.identityserver:
image: ${DOCKER_REGISTRY-}czidentityserver
build:
context: .
dockerfile: cz.IdentityServer/Dockerfile
cz.api.order:
image: ${DOCKER_REGISTRY-}czapiorder
build:
context: .
dockerfile: cz.Api.Order/Dockerfile
cz.api.goods:
image: ${DOCKER_REGISTRY-}czapigoods
build:
context: .
dockerfile: cz.Api.Goods/Dockerfile
cz.mvcclient:
image: ${DOCKER_REGISTRY-}czmvcclient
build:
context: .
dockerfile: cz.MVCClient/Dockerfile

 

C、执行命令docker-compose up命令:执行完成看到以下输出,则编译启动完成。

  D、在docker管理页面中查看如下:

后续:

本篇内容先对docker-compose内容进行了相关介绍,下面将对Swarm、Machine、K8S 进行应用学习。

参考:

https://docs.docker.com/compose/

https://docs.docker.com/compose/compose-file/

版权声明
本文为[chaney1992]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/cwsheng/p/13944281.html

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云