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中使用)
- Mac安装:Install Docker for Mac
- Windows安装:Install Docker for Windows
- Linux安装:Install Docker for Centos
安装成功后命令行中输入: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:数据卷,可以定义数据卷,然后挂载到不同的服务下使用
接着就来看下相关命令的语法及具体含义
序号 | 所属 | 命令 | 说明 |
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/
Docker学习—Compose的更多相关文章
- Docker学习—Machine
前言 前面<Docker学习-Compose>文中介绍了Compose的使用方式:接下来继续了解docker三剑客之一的 Machine: 一.Docker Machine简介 1.什么是 ...
- Docker学习总结
本文作为总结性文章,不会详细讲解Docker.但会把已学习的.了解的内容按照由易到难的顺序串起来,更多的是帮助Docker新手快速的了解Docker,知道目前处在哪个阶段,接下来该学些什么,避免碰太多 ...
- docker学习(7) docker-compose使用示例
上一回学习了如何利用docker搭建一个mysql + java service + nginx,总共4个docker容器,如果采用docker run的方式一个一个容器去创建十分麻烦.为了能更高效的 ...
- Docker学习笔记
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...
- Docker学习笔记_网上资源参考
Docker学习,网上资源参考 1.菜鸟教程: http://www.runoob.com ...
- DOCKER学习心得
原文:DOCKER学习心得 前言: Docker的主要学习心得来源于<docker技术入门与实战> --2019.1.1->2019.1.5 la 着重从基础部分--实例分析-- ...
- Docker学习(十)Docker容器编排 Docker-compose
Docker学习(十)Docker容器编排 Docker-compose 标签(空格分隔): docker 容器编排是什么 应用一般由单独容器化的组件组成,须按照一定顺序在网络级别进行组织,以使其能够 ...
- DOCKER 学习笔记4 认识DockerCompose 多容器编排
前言 通过上一节的学习,学会了如何在Linux 环境下搭建Docker并且部署Springboot 项目,并且成功的跑了起来,当然,在生产环境中,不只是需要一个后端的Web 项目,还需要比如 Ngin ...
- DOCKER 学习笔记5 Springboot+nginx+mysql 容器编排
前言 在上节的内容中,我们已经通过一个简单的实例,将Docker-compose 进行了实际的应用.这一小节中.我们将通过学习和了解,着重认识容器的编排,上一节只算是一个小小的测试.在这一节中.我们将 ...
随机推荐
- The comparison between object and constructor
1.相似的地方 1.举个栗子:public struct Student{ string name; int age;}public class bike{ int weight; ...
- Go语言中的常见的几个坑
目录 1.for range 2.defer与闭包 3.map内存溢出 4.协程泄漏 5.http手动关闭 记录一下日常中遇到的几个坑,加深一下印象. 1.for range 这个是比较常见的问题了, ...
- shell-的特殊变量-位置变量$0 $n $* $# $@详解
一:shell特殊变量 1. 位置变量 $0 获取当前执行的shell脚本的文件名,包括路径 $n 获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9 ...
- docker-compose应用
docker-compose应用 需求编写compose模板文件,实现同时启动tomcat.mysql.redis容器. 1.编写模板文件 #新建文件夹mkdir -p /tzh/compose_te ...
- lua 1.0 源码分析 -- 1 lua 的虚拟指令
lua的解释器拿到 lua 编写的源码,首先进行解析,就是进行词法分析和语法分析,将源码转换成 lua 的指令集,然后执行这个指令集. lua 源码: function f(val) return v ...
- 多测师讲解selenium _assert断言_高级讲师肖sir
assert断言 # # 断言:最常用的断言方法if判断# assert Python语法中自带的断言from selenium import webdriverfrom time import sl ...
- C语言-入门级编程语言--编程小白首选
我们都知道计算机很厉害,利用计算机可以高效地处理和加工信息,随着计算机技术的发展,计算机的功能越来越强大,不但能够处理数值信息,而且还能处理各种文字.图形.图像.动画.声音等非数值信息. 在199 ...
- widows安装ffmpeg
首先下载ffmpeg的windows版本https://ffmpeg.zeranoe.com/builds/ 解压到d盘 win+r cmd 说明成功了
- ansible:安装nginx1.18.0(使用role功能)
一,ansible使用role的用途? roles分别将变量/文件/任务/模板/handler等放置于单独的目录中, 并可以方便的include各目录下的功能 roles使playbook能实现代码被 ...
- centos平台scp通过密钥远程复制文件(免密登录)
一,说明:两台机器的平台和ip 1,a服务器: centos8:ip:121.122.123.47 版本 [root@yjweb ~]# cat /etc/redhat-release CentOS ...